Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于路径的有界哈希集的无界哈希集_Java_Optimization_Hash_Tree_Set - Fatal编程技术网

Java 基于路径的有界哈希集的无界哈希集

Java 基于路径的有界哈希集的无界哈希集,java,optimization,hash,tree,set,Java,Optimization,Hash,Tree,Set,假设有一棵树,为了论证起见,有一棵XML树。您需要一组完整的根到节点路径,但是您需要将该路径集划分为i组,其中i由用户指定 例如,html文档: /html /html/head /html/head/title /html/head/title/[text] /html/body /html/body/[text] 例如,当我3岁时: {{1, 11, 111}, {1111, 12, 121}} 然后变成例如: {3, 4} 使用一个只能获取节点名称的简化树类;获取子树的数

假设有一棵树,为了论证起见,有一棵XML树。您需要一组完整的根到节点路径,但是您需要将该路径集划分为i组,其中i由用户指定

例如,html文档:

/html
/html/head 
/html/head/title    
/html/head/title/[text] 
/html/body
/html/body/[text]
例如,当我3岁时:

{{1, 11, 111}, {1111, 12, 121}}
然后变成例如:

{3, 4}
使用一个只能获取节点名称的简化树类;获取子树的数组列表;检查是否为叶节点;构建这组哈希的最佳方法是什么


编辑:请参见下面我的示例解决方案答案,这远远不是最佳解决方案,因为它非常缓慢,甚至可能不是最佳解决方案。

如果我这样做,我的第一个想法将是一个多重映射(有,或者你可以自己滚动)


这个多重映射的关键是用于到达节点的部分路径,值数组是共享该部分路径的节点的列表(不设置,除非顺序不重要——在XML中是如此)。

我自己的解决方案如下,尽管我不确定这是否是实现这一点的最有效方法。。。也许其他人可以对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;
}
publicArrayList生成路径列表(抽象树){
StringBuilder缓冲区=新的StringBuilder();
ArrayList pl=新的ArrayList();
ArrayList路径=获取路径(树、缓冲区);
用于(StringBuilder sb:路径){
pl.add(sb.toString().hashCode());
}
返回损益;
}
公共ArrayList GetPath(抽象树、StringBuilder父级){
ArrayList=新建ArrayList();
父项。追加(“/”);
append(tree.getNodeName());
添加(新的StringBuilder(父级));
如果(!tree.isLeaf()){
int i=0;
Iterator child=tree.getChildren().Iterator();
而(i
编辑:对于大文件,传递StringBuilder更好


编辑:对于相同的路径,要给出相同的哈希代码,这似乎需要在以后应用

这是家庭作业吗?你试过了吗。到目前为止你都试了些什么?这不是家庭作业——尽管我是一名实习学生。我仍在开发自己的解决方案,但本质上我正在遍历树,使用java自己的字符串哈希函数创建哈希数组列表,然后遍历该列表并将其添加到集合中,然后对每个集合应用哈希函数。当我完成时,我会把代码放上去,甚至是在接近某个可以工作的东西时。添加示例解决方案作为答案