倒排索引優化 跳表求交集 空間換時間 貪心

2021-09-07 09:55:46 字數 1734 閱讀 3972

如果待合併的兩個倒排表資料量很大, 但是交集很少時, 會是什麼情況呢? 1

2

[1,2,3,4,5, ...10001,10005]

[1,10001,10008]

如果對這兩個做合併操作, 最後的交集結果只有  [1, 10001] 2個元素, 但是卻要做10001次移動和比較操作, 所以肯定有什麼辦法來優化這一點. 可能你已經想到了, 我們做了這麼多無用比較, 是因為我們每次指標向前移動的步子太小了點, 如果我們在每次比較後向前多移動一點, 可以忽略很比無用的操作. 這就是跳表的思想.

我們看第乙個倒排表, 如果它以5000為步長前進, 進我們只需要向前查詢兩個即可找到我們需要的元素:10001. 這裡寫乙個跳表功能的合併演算法**:

a = range(10008)

b = [1, 10001, 10008]

i = j =0

result =

step = 100count =0

while i < len(a) and j

if a[i] ==b[j]:

i = i +1j = j + 1count = count + 1

elif a[i]

while (i + step < len(a)) and a[i+step] <=b[j]:

i = i +step

count = count + 1

else

: i = i + 1count = count + 1

else

:

while (j + step < len(b)) and b[j+step] <=a[i]:

j = j + 5000count = count + 1

else

: j = j + 1count = count + 1

print

result

print count

上面**中故意構造了乙個很大的集合 [0 ... 10007], 然後用變數count作為計數器來分析兩個演算法分別執行的操作次數, 可以看到採用跳表演算法時(我們模擬了step=100)的計算次數是207, 而用之前的方式計算次數是10008, 可見效能提公升了很多倍.

這裡有幾點說明下:

1. 這裡為了簡單說明跳表的思路, 全部用了陣列表示倒排表, 其實真實的資料結構應該是鍊錶結構(linked list). 這才符合磁碟儲存結構. 

2. 跳表的原始結構演算法比這個複雜, 而且根據場景的不同, 跳表有不同的實現. 這裡因為不是利用跳表的快速查詢功能, 所以沒有多級指標索引概念, 詳細跳表實現查考: skip list 

倒排索引 和 倒排表

為什麼我們要說倒排索引呢?因為倒排索引是目前 搜尋引擎公司最對搜尋引擎最常用的儲存方式.也是搜尋引擎的核心內容 在搜尋引擎實際的引用之中,有時需要按照關鍵字的某些值查詢記錄,所以我們是按照關鍵字建立索引,這個索引我們就稱之為 倒排索引,而帶有倒排索引的檔案我們又稱作 倒排索引檔案也可以叫它為 倒排檔...

倒排索引 Inverted Index

倒排索引 英語 inverted index 也常被稱為反向索引 置入檔案或反向檔案,是一種索引方法,被用來儲存在全文搜尋下某個單詞在乙個文件或者一組文件中的儲存位置的對映。它是文件檢索系統中最常用的資料結構。有兩種不同的反向索引形式 以英文為例,下面是要被索引的文字 我們就能得到下面的反向檔案索引...

1 倒排索引

總時間限制 1000ms 記憶體限制 131072kb 描述 給定一些文件,要求求出某些單詞的倒排表。對於乙個單詞,它的倒排表的內容為出現這個單詞的文件編號。輸入第一行包含乙個數n,1 n 1000,表示文件數。接下來n行,每行第乙個數c i,表示第i個文件的單詞數。接下來跟著c i個用空格隔開的單...