2011-03-14 2 views
1

나는 N 값의 튜플 콜렉션을 가지고있다. 값은 임의의 값과 일치하는 와일드 카드 또는 구체적인 값일 수 있습니다. 전체 컬렉션을 스캔하고 항목을 하나씩 테스트하지 않고 특정 튜플과 일치하는 컬렉션의 모든 튜플을 조회하는 가장 좋은 방법은 무엇입니까?다차원 데이터 조회

예. 1.2.31.*.3*.*.3과 일치하지만 1.2.4 또는 *.2.4은 일치하지 않습니다.

여기서 내가 원하는 데이터 구조는 무엇입니까?

+1

:

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) } } 

모든 튜플을 보려면 여기가 트라이를 구성 할 방법 1.2.3! = 1.2.3? – Rob

+0

@Dr Rob, typo, fixed. –

+0

나무 같은 것이 작동 할 수도 있습니다. 그렇습니까? 모든 리프는 튜플이 될 것이고 모든 연속적인 루트는 두 개의 튜플 사이에 상호 공통적 인 문자가 될 것입니다 ... –

답변

0

이것을 구현하려면 trie을 사용하십시오.

Trie{ 
    Integer value 
    Map<Integer, Trie> tries 
} 

가 삽입하려면 : 같은

데이터 구조가 보일 것이다 않는 이유

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 
}