그것을 할 수있는 효율적인 방법은 "지그재그"입니다
lastDoc <- 0 //the first doc in the collection
currTerm <- 0 //the first term in T
while (lastDoc != infinity):
if (currTerm > T.last): //if we have passed the last term:
insert lastDoc into result
currTerm <- 0
lastDoc <- lastDoc + 1
continue
docId <- T[currTerm].getFirstAfter(lastDoc-1)
if (docID != lastDoc):
lastDoc <- docID
currTerm <- 0
else:
currTerm <- currTerm + 1
이
이 알고리즘은 효율적인 가정을 getFirstAfter()
당신에게 첫 번째 문서를 줄 수있는 용어에 맞고 그의 docId가 지정된 매개 변수보다 큽니다. 아무 것도 없으면 무한대를 반환해야합니다.
용어가 가장 희박한 용어가 먼저 정렬되도록 알고리즘을 정렬하는 것이 가장 효율적입니다.
알고리즘은 대부분 #docs_matching_first_term * #terms
반복을 보장하지만 실제로는 일반적으로 반복이 훨씬 적습니다.
더 많은 정보가 this lecture notes 슬라이드 11 ~ 13 [강의의 첫 페이지 복사 권한]
시작시 선형 스테핑을 피하면서 이진 검색을 시작할 수 있습니다. (이것은 일부 'hunting'방법으로 중첩 부분까지 확장 될 수 있습니다.) BTW : 연결된 목록은 큰 정렬 된 집합에 대한 최상의 표현이 아닙니다. 배열을 시도해 볼 수 있습니다. – wildplasser
이진 검색은 좋은 생각입니다. 도입되면 건너 뛸 수 있도록 도와줍니다. 배열 Vs List는 목록/배열이 검색 데이터 구조를 업데이트하는 동안에 만 변경된다면 정말 중요할까요? 많은 감사 –