효율적인 String trie 구현을 찾고 있습니다. 주로 다음과 같은 코드를 찾았습니다.
나는 주로 두 가지 이유로 이러한 구현을 싫어합니다.
- 256 개의 ASCII 문자 만 지원합니다. 키릴 같은 것들을 다룰 필요가 있습니다.
- 그들은 매우 메모리 비효율적입니다.
각 노드에는 Java의 64 비트 시스템에서 4096 바이트 인 256 개의 참조 배열이 있습니다. 이러한 각 노드는 각각 4096 바이트의 참조를 가진 최대 256 개의 하위 노드를 가질 수 있습니다. 따라서 모든 ASCII 2 문자열에 대한 전체 Trie에는 1MB 이상의 비트가 필요합니다. 세 개의 문자열? 노드의 배열에만 256MB. 등등.
물론 Trie에 1,600 만 개의 3 개 문자열을 모두 가지고 있지는 않기 때문에 많은 공간이 낭비됩니다. 이러한 배열의 대부분은 실제 삽입 된 키 수를 훨씬 능가하므로 널 (null) 참조입니다. 그리고 유니 코드를 추가하면 배열이 더 커집니다 (char는 Java에서 256 대신 64k 값을 가짐).
효율적인 현악기를 만들 수있는 희망이 있습니까? 이러한 유형의 구현에 대해 몇 가지 개선 사항을 고려했습니다.
- 참조 배열을 사용하는 대신 크기가 실제 노드 수에 가까운 노드에 대한 참조 배열로 색인하는 기본 정수 유형의 배열을 사용할 수 있습니다.
- 문자열을 4 비트 부분으로 나눌 수있어 더 깊은 트리를 희생하면서 16 크기의 노드 배열을 허용합니다.