나는 다음과 같은 방법으로 지정된 데이터가 다음과 같은 경우,해시 맵의 모든 값에서 하위 문자열을 효율적으로 검색하는 방법은 무엇입니까?
key = (<type:id>) | value = (<relevance-score>,<data>)
자 :이 값이 해시 맵 같은 것을 넣어된다고 가정
<type:id> <relevance-score> <data>
예 :
a:1 0.8 "This is a post by PhD"
a:2 0.9 "Current rep of PhD is 3,800+"
b:1 1.0 "Pikl F'Nandez is not an existing user on stackoverflow"
c:2 1.0 "AJAX is a tag on stackoverflow"
...
을 하나는 키워드 PhD
을 검색하는 것이고, 해시 맵의 두 항목에서 찾을 수 있습니다.
Example output: a:2, a:1
쿼리 문자열도 Pikl
또는 Pikl F
또는 Pikl F'n
문자열 매칭 알고리즘이 갈 수있는 가장 좋은 방법이라는 것을 의미 할 수있다 : 나는 쿼리 문자열과 일치 관련성 점수의 순서를 내림차순으로, 모든 키를 검색 할 검색에 대해서.
현재 접근 : 해시 맵의 모든 값에 Boyer-Moore 알고리즘을 사용하고 결과 데이터를 최대 힙 (관련도 점수)에 저장합니다.
시간 복잡성 :
- 보이어 - 무어 :
O(m+n)
- 총,
q: # of keys in hashmap
- 는 또한 힙에서 값 터지는를 추가 할 필요가 각 값
O(q(m+n))
합니다.O(s)
여기서s
은 일치하는 숫자입니다.s << q
부터 위 (검색)가 지배적 인 비용이라고 말할 수 있습니다.
질문 :이 방법이 가장 효율적입니까? 보다 효율적인 방법이 있습니까? 다른 데이터 구조/알고리즘, 아마 내가 생각하지 않을 수 있습니다?
Boyer-Moore가 올바른 도구입니까? 검색중인 대상 문자열이 아닌 원하는 패턴을 사전 처리하여 작동합니다. 너를 여기서 사는거야? –
확실하지 않습니다. 문자열 일치에만 사용하고 있습니다. 시작하기위한 순진한 접근법. 상황을보다 효율적으로 처리 할 수 있는지 궁금하십니까? 너는 무엇을 제안 하는가? – PhD
몇 개의 데이터 항목에 대해 이야기하고 있습니까? 또한 좋은 텍스트 검색 기능을 가진 dbms에이 옵션을 저장하고 있습니까? –