我有一组具有订单关系的元素(可能很大):
[a,b,c,d,e,f]
和一组带有id的频繁模式(可能很大):
[a]:1,[b]:2,[c]:3,[a,b]:4,[b,c]:5,[a,b,c]:6
我有一系列有序集:
[a,b], [e], [c], [e,f], [a,b,c]
我希望将序列中的每个集合与相应模式的ID匹配:
[a,b]:{1,2,4}, [e]:{}, [c]:{3}, [a,b,c]:{1,2,3,4,5,6}
我的目标是限制序列的传递次数,因此我想构建一个我可以在扫描过程中使用的数据结构。 我在想一个前缀树:
──null
├──a : 1
| |
| └──b : 4
| |
| └──c : { 5, 6 }
|
├──b : 2
| |
| └──c : 5
|
└──c : 3
我扫描序列中的一个集合,并在每次到达节点时多次递归(set,set.tail,set.tail.tail ...)将其传递给树将相应的id添加到数组中。
在我的推理中,我是否会错过任何特殊情况(如果我不想错过[a,c],如果[a,b,c]我必须为depth>2
的节点设置多个ID存在于集合中)?
是否有更复杂的数据结构可用于改善处理时间?
编辑:实际上在深度为n时,我需要2^(n-2)
ids与我的方法(考虑到我的树是密集的)。我不确定这是一种有效的方法......
Edit2:另一种合并序列中每个元素的位图以构建每个模式的方法(在 SPADE 算法中使用)。
a : [1,0,0,0,1]
b : [0,1,0,0,1]
ab : [0,0,0,0,1]
通过一些数组操作,我应该能够将它与我的初始数组的元素相匹配。
答案 0 :(得分:0)
如果要构建前缀树(也称为trie),则所有节点都是唯一的,因此按字母顺序连续的集{a,b,c}
的前缀树如下所示:
──null
├──a : 1
| |
| └──b : 4
| |
| └──c : 6
|
├──b : 2
| |
| └──c : 5
|
└──c : 3
它映射到前缀集{ a, b, c, ab, bc, abc }
。
树空间复杂度为SUM k for k = 1..N ~ O(N^2)
。
<强> Node.java 强>
class Node
{
public String str;
public ArrayList<String> child;
public Node (String str)
{
this.str = str;
this.child = new ArrayList<String>();
}
}
<强> MyTree.java 强>
class MyTree
{
Node head;
..
public void build_tree(String [] symbol)
{
this.head = new Node("");
build(symbol,head,0,symbol.length-1);
}
// build the prefix tree through DFS
private void build(String [] symbol, Node parent, int start, int end)
{
Node ch = null;
for (int i=start; i<=end; i++)
{
ch = new Node(symbol[i]);
parent.child.add(ch);
if (end - start > 0)
{
build(symbol,ch,i,end);
}
}
}
}