兄弟の単語を探します(2012.5.6百度実習)
5533 ワード
テーマ:一つの単語の単語のアルファベット交換は、army->maryのような別の単語を得ることができ、兄弟の単語になります.辞書で兄弟を見つける単語を提供します.データ構造とクエリー・プロシージャについて説明します.
解法一:hash_を使うmapとチェーンテーブル(1)は、まず、兄弟の単語が同じkeyであり、兄弟の単語が異なるkeyではないようにkeyを定義する.たとえば、badのkeyがabd、goodのkeyがdgooのように、単語をアルファベットで小さいものから大きいものに並べ替えてkeyとします.(2)チェーンテーブルを使ってすべての兄弟の単語をつなぎ合わせ、hash_mapのkeyは単語のkey,valueはチェーンテーブルの開始アドレスである.(3)開始時には,まず辞書を巡回し,各単語をkeyに従って対応するチェーンテーブルに加える.(4)兄弟の単語を探す必要がある場合は、その単語のkeyを取ってhash_mapで対応するチェーンテーブルを見つければいいです. hash_を作成しますmap時の時間複雑度はO(n)であり,兄弟単語を検索する際の時間複雑度はO(1)である.
解法2:hash_を同様に使用するmapとチェーンテーブル(1)は、アルファベットごとに1つの素数に対応し、対応する素数を乗算し、得られた値をhashすることで、兄弟単語の値は同じであり、異なる単語の素数の積は異なるに違いない.(2)チェーンテーブルを使ってすべての兄弟の単語をつなぎ合わせ、hash_mapのkeyは単語の素数積であり,valueはチェーンテーブルの開始アドレスである.(3)ユーザが入力した単語を計算し,hashを検索し,チェーンテーブルを遍歴して出力するとすべての兄弟単語が得られる.hash_を作成しますmap時の時間複雑度はO(n)であり,兄弟単語を検索する際の時間複雑度はO(1)である.
マス辞書ならB+ツリーで...
注:上記の2つの方法は比較的効率的なアルゴリズムであり、一般的な方法を紹介します.
解法3:全配列、そしてこの問題を順番に比較してみると、直感的には、入力された単語の全変換(単語の長さがnであれば、その全変換はn!個.同じアルファベットがあればn!ではない)を求め、単語の変換を求めて、変換ごとに辞書にあるかどうかを判断する.例えばabcを入力すると、その変換は3!=6種類:abc、acb、bca、bac、cab、cba.そしてこの6つの単語(もちろんここでは単語ではなく文字列)が辞書にあるかどうかを順番に判断し、辞書にあれば記録する.明らかにこのような思想の複雑度は比較的に高くて、nに対して少し大きいならば、n!恐ろしい増加過程であるため,この方法はあまり望ましくない.以下はフル配列コードです.
辞書の「比較単語」の頭文字と同じ単語を取り出して配列に格納し、各組合せと辞書の単語を比較します.まず単語の長さを比較し、長さが同じであれば、比較を続けます.そうでなければ、次の単語を比較します.アルゴリズムは次のとおりです.
解法一:hash_を使うmapとチェーンテーブル(1)は、まず、兄弟の単語が同じkeyであり、兄弟の単語が異なるkeyではないようにkeyを定義する.たとえば、badのkeyがabd、goodのkeyがdgooのように、単語をアルファベットで小さいものから大きいものに並べ替えてkeyとします.(2)チェーンテーブルを使ってすべての兄弟の単語をつなぎ合わせ、hash_mapのkeyは単語のkey,valueはチェーンテーブルの開始アドレスである.(3)開始時には,まず辞書を巡回し,各単語をkeyに従って対応するチェーンテーブルに加える.(4)兄弟の単語を探す必要がある場合は、その単語のkeyを取ってhash_mapで対応するチェーンテーブルを見つければいいです. hash_を作成しますmap時の時間複雑度はO(n)であり,兄弟単語を検索する際の時間複雑度はO(1)である.
解法2:hash_を同様に使用するmapとチェーンテーブル(1)は、アルファベットごとに1つの素数に対応し、対応する素数を乗算し、得られた値をhashすることで、兄弟単語の値は同じであり、異なる単語の素数の積は異なるに違いない.(2)チェーンテーブルを使ってすべての兄弟の単語をつなぎ合わせ、hash_mapのkeyは単語の素数積であり,valueはチェーンテーブルの開始アドレスである.(3)ユーザが入力した単語を計算し,hashを検索し,チェーンテーブルを遍歴して出力するとすべての兄弟単語が得られる.hash_を作成しますmap時の時間複雑度はO(n)であり,兄弟単語を検索する際の時間複雑度はO(1)である.
マス辞書ならB+ツリーで...
注:上記の2つの方法は比較的効率的なアルゴリズムであり、一般的な方法を紹介します.
解法3:全配列、そしてこの問題を順番に比較してみると、直感的には、入力された単語の全変換(単語の長さがnであれば、その全変換はn!個.同じアルファベットがあればn!ではない)を求め、単語の変換を求めて、変換ごとに辞書にあるかどうかを判断する.例えばabcを入力すると、その変換は3!=6種類:abc、acb、bca、bac、cab、cba.そしてこの6つの単語(もちろんここでは単語ではなく文字列)が辞書にあるかどうかを順番に判断し、辞書にあれば記録する.明らかにこのような思想の複雑度は比較的に高くて、nに対して少し大きいならば、n!恐ろしい増加過程であるため,この方法はあまり望ましくない.以下はフル配列コードです.
/**
* @param src
* @param start
* @param end
*/
public static void perm(String[] src,int start,int end){
if(start==end){// ,
for(int i=0;i<=end;i++){
System.out.print(src[i]);
}
System.out.println();
}
else{//
for(int i=start;i<=end;i++){
String temp=src[start];//
src[start]=src[i];
src[i]=temp;
perm(src,start+1,end);//
temp=src[start];//
src[start]=src[i];
src[i]=temp;
}
}
}
辞書の「比較単語」の頭文字と同じ単語を取り出して配列に格納し、各組合せと辞書の単語を比較します.まず単語の長さを比較し、長さが同じであれば、比較を続けます.そうでなければ、次の単語を比較します.アルゴリズムは次のとおりです.
/**
* @param src
* @param des , ,
* @return
*/
public static boolean compare(String src,String[] des){
int len = src.length();
if(len != des.length){// , ,
return false;
}
int i = 1;//i 1 ,
while(i<len){
if(des[i].equals(String.valueOf(src.charAt(i)))){
i++;
continue;
}
return false;
}
return true;
}