1.プレフィックスツリーは何ですか?TrieTree
また、プレフィックスツリーまたはトライとして知られているコンピュータサイエンス、トライでは、キーは通常、文字列である連想配列、のために保存し、順序木です。異なるキーを使用してバイナリ検索ツリーは、ノードに直接格納されていないが、ツリー内のノードの位置によって決定されます。私たちは、同じ接頭辞ノードのすべての子孫、文字列に対応する、すなわちノードを持ち、ルートノードは、空の文字列に対応しています。一般的に、全てのノードは、キーに対応する内部ノードとリーフノードの一部のみに対応する値は値が関連付けられてい有します。
トライキーは、通常は文字列ですが、他の構成も可能。
例えば:
下図の4つの文字列:.「ABC」、「BCE」、「ABD」、「BEF」がある場合:文字のエッジで、ツリー内の数字はどのように多くの現在の文字列の末尾です。列の数」:要件; - 「BEF」の添加、例えば、0の後の数字にf> 1、次いで、値「E」が1で0になる「BE」を追加接頭辞として」も?直接「E」でデジタルでできる「こと」へ。
1 / * 2 *プレフィックスツリー、2つの配列の要素の文字列を参照; 3 * / 4 パブリック クラスCode_01_TrieTree { 5。 6。 パブリック 静的 クラスTrieNode { 7。 公共の int型の経路; // ノードのパス数 8。 公的 INT END; / / 文字列の最後にノードの数、 9 公共TrieNode [] nextS; 10 公衆TrieNode(){ 11。 パス= 0 ; 12である 端= 0 ; 13である nextS = 新しい新TrieNode [26である]; // 26添字0--25における次の文字である 14 } 15 } 16 17。 パブリック 静的 クラストライ{ 18は、 プライベートルートTrieNode; // ルート 。19 公共トライ(){ 20が ルート= 新しい新しい(TrieNode) 、 21である } 22である 23ことである 公共 ボイド{INSERT(文字列ワード) 24 IF(ワード== NULL ){ 25 リターン; 26である } 27 CHAR[] CHS = word.toCharArray()。 28 TrieNodeノード= ルート。 29 int型のインデックス= 0 。 30 のために(int型 i = 0; iがchs.lengthを<; Iは++ ){ 31 、インデックス= CHS [i]は- 'A'; // 将字母对应成下标 32 場合(node.nexts [インデックス] == NULL ){ 33 node.nexts [索引] = 新しいTrieNodeを(); 34 } 35 ノード= node.nexts [インデックス]。 36 node.path ++ ; 37 } 38 node.end ++ 。 39 } 40 41 公共 ボイド削除する(文字列の単語){ 42 であれば(!検索(ワード)= 0 ){ 43 のchar [] CHS = word.toCharArray()。 44 int型のインデックス= 0 。 45 TrieNodeノード= ルート。 46 のために(int型 i = 0; iがchs.lengthを<; Iは++ ){ 47 、インデックス= CHS [i]は- 'A' ; 48 であれば(--node.nexts [インデックス] .path == 0 ){ 49 node.nexts [インデックス] = NULL ; 50 リターン; 51 } 52 ノード= node.nexts [インデックス]。 53 } 54 node.end-- 。 55 } 56 } 57 58 公共 int型の検索(文字列の単語){ 59 であれば(ワード== NULL ){ 60 リターン 0 。 61 } 62 のchar []のCHS =word.toCharArray(); 63 int型のインデックス= 0 。 64 TrieNodeノード= ルート。 65 のために(int型 i = 0; iがchs.lengthを<; Iは++ ){ 66 、インデックス= CHS [i]は- 'A' ; 67 であれば(node.nexts [インデックス] == NULL ){ 68 リターン 0 。 69 } 70 ノード= node.nexts [インデックス]。 71 } 72 リターンnode.end。 73 } 74 } 75 76 77 78 公共 静的 ボイドメイン(文字列[]引数){ 79 試験()。 80 81 } 82 83 84 85 プライベート 静的 ボイド試験(){ 86 トライトライ= 新しいトライ()。 87 のSystem.out.println(trie.search( "祚" )); 88 trie.insert( "祚" ); 89 のSystem.out.println(trie.search( "祚" )); 90 trie.delete( "祚" ); 91 System.out.println(trie.search( "祚" )); 92 trie.insert( "祚" ); 93 trie.insert( "祚" ); 94 trie.delete( "祚" ); 95 のSystem.out.println(trie.search( "祚" )); 96 trie.delete( "祚" ); 97 のSystem.out.println(trie.search( "祚" )); 98 trie.insert( "zuoa" )。 99 trie.insert( "zuoac" )。 100 trie.insert( "zuoab" )。 101 トライ。挿入( "zuoad" ); 102 trie.delete( "zuoa" ); 103 のSystem.out.println(trie.search( "zuoa" )); 104 のSystem.out.println(trie.search( "zuoac" )); 105 のSystem.out.println(trie.search( "zuoab" )); 106 のSystem.out.println(trie.search( "zuoad" )); 107 } 108 109 }
文字列の2スプライシング配列 - 貪欲戦略
(プルーフ小さなもつれないれるサンプルの数によって測定されます)
文字列の配列、各文字列の連結、その結果、最低辞書式順序。以下のような:「AB」、「CD」、「EF」、それは大々的以外の、最小限の「ABCDEF」にスプライス。ここの場合、「B」と「BA」のステッチがあり、ステッチその後、並べ替えを考える、とあり、ステッチの後に、「B」、「BA」を注文した後、「B学士」、ですが、言葉の「B AB」モザイクに従って、小さい、ちょうどそう文字列が間違ったスプライシング辞書がソートされます。だから、ポリシーを変更する必要がある注文。
STR1に、str2の分類:
オリジナルのモザイク戦略:STR1 <= str2を、リリース前にSTR1、またはstr2の前に置きます。
改善スプライシング戦略:STR1 + str2の<str2の+ = STR1、STR1プット、またはstr2の前に置く前に、
証明:
配達注文の証拠を与える:AB bはポストスプライシングを表し、スプライシングがハイレベルで見ることができ、Bは低であり、A-Bは、左に移動されるBプラスBの桁の長さを表すオン。ABがk進スプライシングされ、すなわちK * AとみなすことができるBの長さとなるよう、+ B
K B の長さ = Mの(b)に示すように、ABは* mを=ように(B) + B。
オズワルド