나는 약 10^5
영어 단어와 그 초기 빈도 목록이 있습니다. 나는 단어의 완성을 제안하는 프로그램을 쓰고 싶다. 최대 숫자는 k
이다. 주어진 접두어로 시작하여 빈도의 내림차순으로 정렬된다. 데이터 구조는 단어의 빈도 카운트를 1 씩 업데이트 할 수 있어야합니다 (단어가 사용될 때마다).고정 된 접두사로 시작하는 'k'단어의 빈도가 내림차순으로 나열하십시오.
및 k = 3
, 그것은 같은 목록을 반환해야 this- {{17, "엔진"}, {10, "엔지니어"}, {4, "엔지니어링" }}
k
의 값은 [1, 15] 내에 있어야합니다.
Trie
데이터 구조는 주파수 별 정렬이 문제가 아니었지만 충분해야합니다. 아무도이 문제를 해결하기 위해 어떤 데이터 구조 나 접근법에 대해 나에게 암시 할 수 있습니까?
참고 : Trie
데이터 구조가 너무 많은 공간을 사용합니다. 나는이 데이터 구조에 대해 10MB
이상의 여유가 없다. 또한, 트라이 노드 (적어도 3/4 깊이까지)와 연관된 최대 힙을 사용하면 메모리 소비가 엄청나게 커집니다.
지금은 이것을 시도했습니다. 4 개의 정렬 된 세트 (포인터를 가리키고 문자열을 가리킴)를 유지합니다. 설정 i
는
i
문자 string length >= i
sorted-
- 사전 순 문자열 만약 충돌, 주파수의 순으로
- 하면 임의의 순서로 다시 충돌, (에 대한 포인터의 목록입니다
이 고려, 잘 작동) 중요하지, 난 초기화 (4N 은 log2 (N)) 시간 및 O (N은 log2 (N)) 공간 O를 필요로한다. 각 쿼리에 대해 O (log2 (n))의 조회 시간 복잡도와 최악의 경우 최대 약 100 단어 순회가 있습니다. 단어의 빈도를 업데이트하려면 O (8 * log2 (n)) 시간이 필요합니다.
간단한 DB 쿼리가 빠르지 않습니까? 또한 주파수를 즉시 업데이트하는 대신, 예를 들어 주파수를 업데이트 할 수 있습니다. 한 번 하루에 검색 구조를 재구성합니다. – Henry
@Henry 아니요, 훨씬 빠른 솔루션이 필요합니다. 메모리 데이터 구조를 사용하는 것이 더 바람직합니다. – crysoberil
최대 힙이 필요하다고 생각 했습니까? – Squidly