java – 一种更有效的方法来找到一个离开彼此的一个字母的英文单词

前端之家收集整理的这篇文章主要介绍了java – 一种更有效的方法来找到一个离开彼此的一个字母的英文单词前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我写了一个小程序,试图找到两个相等长度的英文单词之间的连接. Word A将通过一次更改一个字母转换为Word B,每个新创建的单词必须是英文单词.

例如:

  1. Word A = BANG
  2. Word B = DUST

结果:

  1. BANG -> BUNG ->BUNT -> DUNT -> DUST

我的过程:

>将英文单词列表(由109582个单词组成)加载到Map< Integer,List< String>> _wordMap = new HashMap();键将是字长.
>用户输入2个字.
> createGraph创建一个图.
>计算这2个节点之间的最短路径
>打印出结果.

一切工作都很好,但是对于步骤3中的时​​间,我并不满意.

看到:

  1. Completely loaded 109582 words!
  2. CreateMap took: 30 milsecs
  3. CreateGraph took: 17417 milsecs
  4. (HOISE : HORSE)
  5. (HOISE : POISE)
  6. (POISE : PRISE)
  7. (ARISE : PRISE)
  8. (ANISE : ARISE)
  9. (ANILE : ANISE)
  10. (ANILE : ANKLE)
  11. The wholething took: 17866 milsecs

我不满意在步骤3创建图形的时间,这里是我的代码(我使用JgraphT的图形):

  1. private List<String> _wordList = new ArrayList(); // list of all 109582 English words
  2. private Map<Integer,List<String>> _wordMap = new HashMap(); // Map grouping all the words by their length()
  3. private UndirectedGraph<String,DefaultEdge> _wordGraph =
  4. new SimpleGraph<String,DefaultEdge>(DefaultEdge.class); // Graph used to calculate the shortest path from one node to the other.
  5.  
  6.  
  7. private void createGraph(int wordLength){
  8.  
  9. long before = System.currentTimeMillis();
  10. List<String> words = _wordMap.get(wordLength);
  11. for(String word:words){
  12. _wordGraph.addVertex(word); // adds a node
  13. for(String wordToTest : _wordList){
  14. if (isSimilar(word,wordToTest)) {
  15. _wordGraph.addVertex(wordToTest); // adds another node
  16. _wordGraph.addEdge(word,wordToTest); // connecting 2 nodes if they are one letter off from eachother
  17. }
  18. }
  19. }
  20.  
  21. System.out.println("CreateGraph took: " + (System.currentTimeMillis() - before)+ " milsecs");
  22. }
  23.  
  24.  
  25. private boolean isSimilar(String wordA,String wordB) {
  26. if(wordA.length() != wordB.length()){
  27. return false;
  28. }
  29.  
  30. int matchingLetters = 0;
  31. if (wordA.equalsIgnoreCase(wordB)) {
  32. return false;
  33. }
  34. for (int i = 0; i < wordA.length(); i++) {
  35.  
  36. if (wordA.charAt(i) == wordB.charAt(i)) {
  37. matchingLetters++;
  38. }
  39. }
  40. if (matchingLetters == wordA.length() - 1) {
  41. return true;
  42. }
  43. return false;
  44. }

我的问题:

如何改进我的算法,以加快进程?

对于任何正在阅读这个的redditors,是的,我在昨天看到/ r / askreddit的线程之后创建了这个.

解决方法

这是一个开始的想法:

创建一个地图< String,List< String>> (或如果您使用Guava,则为Multimap< String,String>),并为每个单词“空白”一次一个字母,并将原始单词添加到该空白字词的列表中.所以你最终会得到:

  1. .ORSE => NORSE,HORSE,GORSE (etc)
  2. H.RSE => HORSE
  3. HO.SE => HORSE,HOUSE (etc)

在这一点上,给出一个单词,你可以很容易地找到所有类似的单词 – 再次通过相同的过程,而不是添加到地图,只是获取每个“空白”版本的所有值.

猜你在找的Java相关文章