1
我有一个N值元组的集合。值可以是通配符(匹配任何值)或具体值。查找匹配特定元组的集合中的所有元组而不扫描整个集合和测试项目的最佳方法是什么?多维数据查找
E.g. 1.2.3
匹配1.*.3
和*.*.3
,但不是1.2.4
或*.2.4
。
我在这里寻找什么数据结构?
我有一个N值元组的集合。值可以是通配符(匹配任何值)或具体值。查找匹配特定元组的集合中的所有元组而不扫描整个集合和测试项目的最佳方法是什么?多维数据查找
E.g. 1.2.3
匹配1.*.3
和*.*.3
,但不是1.2.4
或*.2.4
。
我在这里寻找什么数据结构?
我会用trie来实现这个。这是我怎么构建线索:
的数据结构类似于:
Trie{
Integer value
Map<Integer, Trie> tries
}
要插入:
insert(tuple, trie){
curTrie = trie
foreach(number in tuple){
nextTrie = curTrie.getTrie(number)
//add the number to the trie if it isn't in there
if(nextTrie == null){
newTrie = new Trie(number)
curTrie.setTrie(number, newTrie)
}
curTrie = curTrie.getTrie(number)
}
}
要获取所有元组:
getTuples(tuple, trie){
if(head(tuple) == "*"){
allTuples = {}
forEach(subTrie in trie){
allTuples.union(getTuples(restOf(tuple), subTrie))
forEach(partialTuple in allTuples){
partialTuple = head(tuple)+partialTuple
}
}
return allTuples
}
if(tuple == null)
return {trie.value}
if(trie.getTrie(head(tuple)) == null)
raise error because tuple does not exist
allTuples = {}
allTuples.union(getTuples(restOf(tuple), trie.getTrie(head(tuple))
forEach(partialTuple in allTuples){
partialTuple = head(tuple)+partialTuple
}
return allTuples
}
为什么1.2.3!= 1.2.3? – Rob 2011-03-14 05:26:56
@ Dr Rob,错字,固定。 – 2011-03-14 05:36:58
像树一样可能会工作,不是吗?每一片叶子都是一个元组,每一个连续的根都是两个元组之间相互共同的字符...... – 2011-07-27 02:29:37