2 つの等しい長さの英単語間の接続を見つけようとする小さなプログラムを作成しました。単語 A は一度に 1 文字を変更することで単語 B に変換されます。新しく作成された各単語は英語の単語でなければなりません。
例えば:
Word A = BANG
Word B = DUST
結果:
BANG -> BUNG ->BUNT -> DUNT -> DUST
私のプロセス:
英語の単語リスト (109582 単語で構成) を にロードします
Map<Integer, List<String>> _wordMap = new HashMap();
。キーは単語の長さになります。ユーザーは 2 つの単語を入力しました。
createGraph はグラフを作成します。
これらの 2 つのノード間の最短経路を計算します
結果を出力します。
すべてが完全に正常に機能しますが、ステップ 3 でかかった時間には満足できません。
見る:
Completely loaded 109582 words!
CreateMap took: 30 milsecs
CreateGraph took: 17417 milsecs
(HOISE : HORSE)
(HOISE : POISE)
(POISE : PRISE)
(ARISE : PRISE)
(ANISE : ARISE)
(ANILE : ANISE)
(ANILE : ANKLE)
The wholething took: 17866 milsecs
ステップ 3でグラフを作成するのにかかる時間に満足していません。これが私のコードです (グラフに JgraphT を使用しています)。
private List<String> _wordList = new ArrayList(); // list of all 109582 English words
private Map<Integer, List<String>> _wordMap = new HashMap(); // Map grouping all the words by their length()
private UndirectedGraph<String, DefaultEdge> _wordGraph =
new SimpleGraph<String, DefaultEdge>(DefaultEdge.class); // Graph used to calculate the shortest path from one node to the other.
private void createGraph(int wordLength){
long before = System.currentTimeMillis();
List<String> words = _wordMap.get(wordLength);
for(String word:words){
_wordGraph.addVertex(word); // adds a node
for(String wordToTest : _wordList){
if (isSimilar(word, wordToTest)) {
_wordGraph.addVertex(wordToTest); // adds another node
_wordGraph.addEdge(word, wordToTest); // connecting 2 nodes if they are one letter off from eachother
}
}
}
System.out.println("CreateGraph took: " + (System.currentTimeMillis() - before)+ " milsecs");
}
private boolean isSimilar(String wordA, String wordB) {
if(wordA.length() != wordB.length()){
return false;
}
int matchingLetters = 0;
if (wordA.equalsIgnoreCase(wordB)) {
return false;
}
for (int i = 0; i < wordA.length(); i++) {
if (wordA.charAt(i) == wordB.charAt(i)) {
matchingLetters++;
}
}
if (matchingLetters == wordA.length() - 1) {
return true;
}
return false;
}
私の質問:
プロセスを高速化するためにアルゴリズムを改善するにはどうすればよいですか?
これを読んでいる redditor の皆さん、はい、昨日 /r/askreddit のスレッドを見てこれを作成しました。