trie 예제

trie 예제

2 agosto, 2019

LOWERCASE.getIndex(s.charAt(i)) 메서드는 단순히 알파벳에서 ith 문자의 위치를 반환합니다. 반환된 노드에서 Boolean 속성 노드는 노드가 단어의 마지막 문자( 예: 이전 예제에서 빨간색으로 표시된 문자)에 해당한다는 것을 나타냅니다. 각 노드는 자식 수의 카운터를 유지하므로 이 카운터가 양수이면 현재 문자열이 접두사로 있는 사전의 긴 단어가 있습니다. 참고: 노드는 trie의 위치에 암시적이므로 해당 문자에 대한 참조를 유지할 필요가 없습니다. 이 프로세스는 느리게 들릴 수 있지만 레지스터 종속성이 없기 때문에 캐시 로컬이며 매우 병렬화할 수 있으므로 실제로 최신 의 순서가 아닌 실행 CPU에서 우수한 성능을 발휘합니다. 예를 들어 빨간색-검은색 트리는 용지에서 훨씬 더 잘 수행되지만 캐시에 비우호적이며 최신 CPU에서 여러 파이프라인과 TLB 가판대를 발생시켜 해당 알고리즘이 CPU 속도가 아닌 메모리 대기 시간으로 바인딩됩니다. 이에 비해 비트 트리는 거의 메모리에 액세스하지 않으며, 메모리를 읽을 때만 액세스하므로 SMP 캐시 일관성 오버헤드를 피할 수 있습니다. 따라서 메모리 할당자(예: 유명한 더그 레아의 할당자(dlmalloc) 및 그 하위 버전과 같은 많은 빠른 삽입 및 삭제를 수행하는 코드에 대한 선택 알고리즘이 점점 더 많아지고 있습니다. 시도는 1959년 르네 드 라 브리안다이스가 처음 묘사했다. [1] [2]:336 트라이라는 용어는 2년 후 에드워드 프레드킨(Edward Fredkin)에 의해 만들어졌는데, 에드워드 프레드킨은 검색의 중간 음절 이후에 그것을 /îtriî/ (“나무”로) 발음한다. [3] [4] 그러나, 다른 저자는 구두로 “나무”에서 구별하기 위해 / “시도”로 / 그것을 발음한다.

[3] [4] [5] 시도는 알고리즘을 일치시키고 맞춤법 검사기와 같은 것을 구현하는 데도 사용되며 radix 정렬 버전의 구현에도 사용할 수 있습니다. 그림에서 모든 문자는 trie_node_t 형식입니다. 예를 들어 루트는 trie_node_t 형식이고 자식 a, b 및 t가 채워지며 루트의 다른 모든 노드는 NULL이 됩니다. 마찬가지로, 다음 레벨의 “a”는 하나의 자식(“n”)만 있고 다른 모든 자식은 NULL입니다. 리프 노드는 파란색입니다. 우리는 소문자로 단어를 저장하려고 시도했지만 시도는 다른 많은 것들을 저장하는 데 사용할 수 있습니다. 소문자 대신 비트 또는 바이트를 사용할 수 있으며 모든 데이터 형식은 문자열뿐만 아니라 트리에 저장할 수 있습니다. 시도를 사용하여 당신의 상상력을 흐름하자! 예를 들어 사전에서 단어를 찾으려고 하지만 단어에서 단일 문자가 삭제되었다고 가정합니다. countWords 함수를 수정할 수 있습니다: 텍스트 내부에 문자열을 인덱싱하고 검색하는 많은 알고리즘과 데이터 구조가 있으며, 그 중 일부는 표준 라이브러리에 포함되어 있지만 모든 알고리즘은 포함되지 않습니다. trie 데이터 구조는 그렇지 않은 데이터 구조의 좋은 예입니다. 예를 들어, 희소한 비트 집합, 즉 훨씬 더 크고 고정된 열거형 세트의 서브세트를 나타내는 데 사용될 수 있다.

이러한 경우 trie는 전체 집합 내의 비트 요소 위치에 의해 키처리됩니다. 키는 각 요소의 정수 위치를 인코딩하는 데 필요한 비트 문자열에서 만들어집니다.