2009-07-23 10 views
0

引数ツリーのためにXMLツリーがあるとします。また、ルートからノードへのパスの完全なセットが必要ですが、そのセットをiのグループに分割したいと考えています。ここでiはユーザー指定です。パスに基づくハッシュの束縛されたセットに基づく無限のハッシュのセット

ですから、例えばHTMLドキュメント:私は3であるとき

/html 
/html/head 
/html/head/title  
/html/head/title/[text] 
/html/body 
/html/body/[text] 

は、例えば次のようになります。単純化されたツリーのクラスを使用して

{3, 4} 

{{1, 11, 111}, {1111, 12, 121}} 

は、その後、例えばなり、ノード名のみを取得できます。サブツリーのArrayListを取得する。リーフノードであるかどうかをチェックする。このハッシュセットを構築する最良の方法は何ですか?

EDIT:以下のサンプルソリューションの回答を参照してください。これは非常に遅く、おそらく最善のアプローチではないため、これは最適ではありません。

+0

この課題はありますか?あなたはそれに行きましたか?これまでに何を試しましたか? –

+0

私はプレースメントの学生ですが、それは宿題ではありません。私は自分自身の解決策に取り組んでいますが、本質的には、ツリーを横断しています。javaのStringハッシュ関数を使ってハッシュのArrayListを作成し、そのリストを繰り返してセットに追加し、それぞれにハッシュ関数を適用しますセット。私が終わったときにコードを載せるか、それとも何かに近いものにします。 – Robert

+0

サンプル溶液を解答として追加 – Robert

答えて

1

これを実現する最も効率的な方法はわかりませんが、私自身の解決策は次のとおりです。おそらく他の人がJavaの複雑さについていくつかの洞察を提供する可能性があります。

public ArrayList<Integer> makePathList(AbstractTree<String> tree){ 
    StringBuilder buffer = new StringBuilder(); 
    ArrayList<Integer> pl = new ArrayList<Integer>(); 
    ArrayList<StringBuilder> paths = getPaths(tree, buffer); 
    for(StringBuilder sb : paths){ 
     pl.add(sb.toString().hashCode()); 
    } 

    return pl; 
} 

public ArrayList<StringBuilder> getPaths(AbstractTree<String> tree, StringBuilder parent){ 

    ArrayList<StringBuilder> list = new ArrayList<StringBuilder>(); 
    parent.append("/"); 
    parent.append(tree.getNodeName()); 
    list.add(new StringBuilder(parent)); 
    if (!tree.isLeaf()){ 

     int i = 0; 
     Iterator<AbstractTree<String>> child = tree.getChildren().iterator(); 
     while (i < tree.getChildren().size()){ 

      list.addAll(getPaths(child.next(), new StringBuilder(parent))); 
      i++; 
     } 
    } 
    return list; 
} 

public HashSet<Integer> createShingleSet(ArrayList<Integer> paths, int shingleLength){ 
    HashSet<Integer> shingleSet = new HashSet<Integer>(); 
    for(int i = 0; i < paths.size(); i += shingleLength){ 
     Multiset<Integer> set = new Multiset<Integer>(); 
     for(int j = 0; j < shingleLength; j++){ 
      if (i + j < paths.size()) 
       set.add(paths.get(i + j));  
     } 
     shingleSet.add(set.hashCode()); 
    } 
    return shingleSet; 
} 

EDIT:StringBuilderを渡すと、大きなファイルに適しています。

EDIT:同じパスで同じハッシュコードを指定すると、後で適用する必要があるようです。

0

もし私がこれをやっていたら、私の最初の考えはマルチマップ(そこにseveralimplementationsがあります、または自分でロールすることができます)。

このマルチマップのキーは、ノードに到達するために使用される部分パスです。値の配列は、順序が重要でない限り(つまり、順序は重要ではありません。部分パス。

関連する問題