有對搜尋引擎有點了解的,就應該知道倒排索引吧。不知道也不要緊,看看就行了,這種資料結構比較簡單,但很實用,
這裡舉個例子來說明,有時候在非搜尋引擎的運用中,倒排索引也能顯著提高演算法效率。
例. 在一串由0,1,2,3,4,5,6,7,8,9這十個字元組成的長度為n的序列中,找出各字元至少出現一次且長度最小的子串長度。
演算法一:暴力
列舉乙個起點乙個終點,檢查區間的字元是否滿足條件,求出最小值。時間複雜度
o(n^3),
慢得要死。
演算法二:優化的暴力
演算法思想同上,但在檢查敬意字元滿足條件與否的時候,並不掃瞄一遍,而是直接計算得到,降低開銷。具體實現如下:
用乙個二維陣列s[n][10]記錄從第乙個字元到當前字元0,1,2,3,4,5,6,7,8,9各自出現的次數,掃瞄一遍序列就可以得到。這樣在檢查區間[i,j]是否滿足條件的時候,只用檢查是否滿足s[j][k]-s[i][k]>=1,其中k=0-9。這樣時間複雜度降為
o(n^2),
快乙個數量級了,哈哈,不過當n>=10000時,還是太慢。
演算法三:倒排索引
為原序列建立倒排索引,將原問題轉化成倒排索引求交集操作。比如,有序列如下:
seq:
1338523690784612
pos: 0123456789012345
倒排索引如下(記錄位置):
0 => 9
1 => 0 -> 14
2 => 5 -> 15
3 => 1 -> 2 -> 6 -> 13
4 => 12
5 => 4
6 => 7 -> 13
7 => 10
8 => 3 -> 11
9 => 8
要統計出現0-9均出現的最短區間長度,實際上可以這樣轉化,倒排記錄上記著每個字元出現的位置。設定10個指標,各自初始指向各自倒排的第乙個元素。可以看出,指向的這十個值已經構成一組滿足條件的解,它的區間長度為10個數中的最大值減去最小值加1。例子中長度為12-0+1=13。
選擇哪個指標先移動,這比較重要。此時p4指向的值為12,為當前最大值。p1指向的值為0,最小,那麼選擇移動p1可能會得到更優的結果,因為它的值在增大,而max-min的差值就會減小。移動後,更新最大值和最小值,得到乙個新的區間長度,最壞的情況是要再統計當前10個指標指向的最大值和最小值。每個倒排索引都會走一遍,這樣算下來,總共最多會花
10n的時間。
其實在指標移動過程中,可以維護3個變數並記錄下它們的位置,max,min,mmin,其中mmin表示倒數第二小的數。這樣指向min的指標移向下乙個位置時有以下幾種情況:
1) value <= mmin,max-value為區間長度,min = value,當前指標繼續移向下乙個位置
2) mmin < value <= max,max-mmin為區間長度,min=mmin,mmin的指標移向下乙個位置,掃瞄10個指標,找出倒數第二小的,作為新的mmin
3) value > max,value-mmin為區間長度,min=mmin,max=value,mmin的指標指向下乙個位置,掃瞄10個指標,找出倒數第二小的,作為新的mmin
這樣處理後,掃瞄的次數又會降很多,次數接近n,時間複雜度為
o(n)。
最後,你如果還想提供速度,比如要處理上億條或10億條資料,還是嫌太慢,可以將它改為基於跳表的倒排,可以直接跳過一些指標,理想的比較次數可以達到
n/k。
倒排索引 和 倒排表
為什麼我們要說倒排索引呢?因為倒排索引是目前 搜尋引擎公司最對搜尋引擎最常用的儲存方式.也是搜尋引擎的核心內容 在搜尋引擎實際的引用之中,有時需要按照關鍵字的某些值查詢記錄,所以我們是按照關鍵字建立索引,這個索引我們就稱之為 倒排索引,而帶有倒排索引的檔案我們又稱作 倒排索引檔案也可以叫它為 倒排檔...
倒排索引 Inverted Index
倒排索引 英語 inverted index 也常被稱為反向索引 置入檔案或反向檔案,是一種索引方法,被用來儲存在全文搜尋下某個單詞在乙個文件或者一組文件中的儲存位置的對映。它是文件檢索系統中最常用的資料結構。有兩種不同的反向索引形式 以英文為例,下面是要被索引的文字 我們就能得到下面的反向檔案索引...
1 倒排索引
總時間限制 1000ms 記憶體限制 131072kb 描述 給定一些文件,要求求出某些單詞的倒排表。對於乙個單詞,它的倒排表的內容為出現這個單詞的文件編號。輸入第一行包含乙個數n,1 n 1000,表示文件數。接下來n行,每行第乙個數c i,表示第i個文件的單詞數。接下來跟著c i個用空格隔開的單...