내 질문은 Trie 데이터 구조와 Radix Trie 가 동일한 지 여부입니다.
요컨대, 아닙니다. 카테고리 기수 그래서 답장 의 특정 카테고리에 대해 설명 트리는을 하지만, 그 모든 시도는 기수 시도 것을 의미하지 않습니다.
같지 않다면 Radix trie (일명 Patricia Trie)의 의미는 무엇입니까?
나는 당신이 글을 쓰려고 한 것이 당신의 질문에 있지 않으므로 내 정정을 가정합니다.
마찬가지로 PATRICIA는 특정 유형의 기수 트라이를 나타내지 만 모든 기수 시도가 PATRICIA 시도 인 것은 아닙니다.
트라이는 무엇입니까?
"Trie"는 연관 배열로 사용하기에 적합한 트리 데이터 구조를 설명합니다. 여기서 분기 또는 모서리 는 키의 일부 에 해당합니다. 부분 의 정의는 여기에서 다소 모호합니다. 시도의 다른 구현은 에지에 대응하기 위해 다른 비트 길이를 사용하기 때문입니다. 예를 들어, 이진 트라이에는 0 또는 1에 해당하는 노드 당 2 개의 에지가있는 반면, 16 방향 트라이에는 4 비트에 해당하는 노드 당 16 개의 에지가 있습니다 (또는 16 진수 : 0x0에서 0xf까지).
Wikipedia에서 가져온이 다이어그램은 'A', 'to', 'tea', 'ted', 'ten'및 'inn'키가 (적어도) 삽입 된 트라이를 묘사하는 것 같습니다.
이 시도가 't', 'te', 'i'또는 'in'키에 대한 항목을 저장하려면 nullary 노드와 실제 값이있는 노드를 구분하기 위해 각 노드에 추가 정보가 있어야합니다.
기수 트라이는 무엇입니까?
"Radix trie"는 Ivaylo Strandjev가 그의 답변에서 설명한 것처럼 공통 접두사 부분을 압축하는 trie의 한 형태를 설명하는 것 같습니다. 다음 정적 할당을 사용하여 "smile", "smiled", "smiles"및 "smiling"키를 색인화하는 256-way trie를 고려하십시오.
root['s']['m']['i']['l']['e']['\0'] = smile_item;
root['s']['m']['i']['l']['e']['d']['\0'] = smiled_item;
root['s']['m']['i']['l']['e']['s']['\0'] = smiles_item;
root['s']['m']['i']['l']['i']['n']['g']['\0'] = smiling_item;
각 첨자는 내부 노드에 액세스합니다. 즉 smile_item
, 검색 하려면 7 개의 노드에 액세스해야합니다. 8 개의 노드 액세스는 smiled_item
및에 해당 smiles_item
하고 9 개 는에 해당 합니다 smiling_item
. 이 4 개 항목에는 총 14 개의 노드가 있습니다. 그러나 이들은 모두 처음 4 바이트 (처음 4 개 노드에 해당)를 공통으로 가지고 있습니다. 이 4 바이트를 압축하여 root
에 해당하는 을 생성함으로써 ['s']['m']['i']['l']
4 개의 노드 액세스가 최적화되었습니다. 이는 메모리와 노드 액세스가 적다는 것을 의미하며 이는 매우 좋은 표시입니다. 불필요한 접미사 바이트에 액세스 할 필요성을 줄이기 위해 최적화를 반복적으로 적용 할 수 있습니다. 결국, 트라이에 의해 색인 된 위치에서 검색 키와 색인 된 키의 차이점 만 비교하는 지점에 도달합니다.. 이것은 기수 트라이입니다.
root = smil_dummy;
root['e'] = smile_item;
root['e']['d'] = smiled_item;
root['e']['s'] = smiles_item;
root['i'] = smiling_item;
항목을 검색하려면 각 노드에 위치가 필요합니다. 검색 키가 "smiles"이고 a root.position
가 4이면에 액세스 root["smiles"[4]]
합니다 root['e']
. 우리는 이것을라는 변수에 저장합니다 current
. current.position
차이의 위치 인, 5 "smiled"
및 "smiles"
다음 액세스 것이다 있도록 root["smiles"[5]]
. 이렇게하면 smiles_item
, 및 문자열의 끝으로 이동합니다. 검색이 종료되고 8 개가 아닌 3 개의 노드 액세스만으로 항목이 검색되었습니다.
PATRICIA 트라이는 무엇입니까?
PATRICIA 트리는 항목 n
을 포함하는 데 사용되는 노드 만 있어야하는 기수 시도의 변형입니다 n
. 위의 조잡 입증 기수 트라이 의사 코드에서, 총 다섯 개 노드있다 : root
(a null의 노드이며, 이는 실제 값을 포함하지 않음), root['e']
, root['e']['d']
, root['e']['s']
및 root['i']
. PATRICIA 트라이에는 4 개만 있어야합니다. PATRICIA는 이진 알고리즘이기 때문에이 접두사를 이진법으로 보면 어떻게 다른지 살펴 보겠습니다.
smile: 0111 0011 0110 1101 0110 1001 0110 1100 0110 0101 0000 0000 0000 0000
smiled: 0111 0011 0110 1101 0110 1001 0110 1100 0110 0101 0110 0100 0000 0000
smiles: 0111 0011 0110 1101 0110 1001 0110 1100 0110 0101 0111 0011 0000 0000
smiling: 0111 0011 0110 1101 0110 1001 0110 1100 0110 1001 0110 1110 0110 0111 ...
노드가 위에 제시된 순서대로 추가되었다고 생각해 보겠습니다. smile_item
이 나무의 뿌리입니다. 조금 더 쉽게 알아볼 수 있도록 굵게 표시된 차이점 "smile"
은 비트 36 의 마지막 바이트에 있습니다 .이 시점까지 모든 노드는 동일한 접두사를 갖 습니다 . smiled_node
에 속합니다 smile_node[0]
. 차이 "smiled"
와 "smiles"
비트 (43)에서 발생 "smiles"
하므로, '1'비트를 가지고 smiled_node[1]
있다 smiles_node
.
오히려 사용하는 것보다 NULL
검색 종료가, 가지가 다시 연결할 때 지점 및 / 또는 표시하기 위해 별도의 내부 정보로 최대 트리 어딘가에 시험 오프셋 검색 종료 그래서, 감소 하기보다는 증가. 아래에 언급 된 Sedgewick의 책에 포함 된 이러한 트리 의 간단한 다이어그램이 있습니다 (PATRICIA는 실제로 트리보다 순환 그래프에 가깝지만).
PATRICIA의 기술적 속성 중 일부가 프로세스에서 손실되지만 변형 길이의 키를 포함하는 더 복잡한 PATRICIA 알고리즘이 가능합니다 (즉, 모든 노드에 이전 노드와 함께 공통 접두사가 포함됨).
이와 같이 분기하면 여러 가지 이점이 있습니다. 모든 노드에는 값이 있습니다. 그것은 루트를 포함합니다. 결과적으로 코드의 길이와 복잡성은 실제로 훨씬 짧아지고 아마도 조금 더 빨라질 것입니다. 항목을 찾기 위해 적어도 하나의 분기와 최대 k
분기 (여기서는 k
검색 키의 비트 수)를 따릅니다. 노드는 각각 두 개의 분기 만 저장하기 때문에 매우 작기 때문에 캐시 지역성 최적화에 상당히 적합합니다. 이러한 속성 덕분에 지금까지 PATRICIA가 가장 좋아하는 알고리즘이되었습니다.
내 임박한 관절염의 중증도를 줄이기 위해 여기서는이 설명을 짧게 자르겠습니다.하지만 PATRICIA에 대해 더 알고 싶다면 Donald Knuth의 "The Art of Computer Programming, Volume 3"과 같은 책을 참조 할 수 있습니다. , 또는 Sedgewick의 "{your-favourite-language}, part 1-4"로 된 알고리즘 "
radix-tree
아니라 조금 짜증나는 것을 발견 한 유일한 사람radix-trie
입니까? 게다가 태그가 달린 질문이 꽤 있습니다.