Java 基于路径的有界哈希集的无界哈希集
假设有一棵树,为了论证起见,有一棵XML树。您需要一组完整的根到节点路径,但是您需要将该路径集划分为i组,其中i由用户指定 例如,html文档: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} 使用一个只能获取节点名称的简化树类;获取子树的数
/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自己的字符串哈希函数创建哈希数组列表,然后遍历该列表并将其添加到集合中,然后对每个集合应用哈希函数。当我完成时,我会把代码放上去,甚至是在接近某个可以工作的东西时。添加示例解决方案作为答案