我是怎麼用跳表優化搜尋引擎的?

2022-01-24 04:56:12 字數 1167 閱讀 2321

對於跳表,我想大家都不陌生吧,這裡不多解釋,感興趣的小夥伴可以看我的這篇文章: 這段時間在做我們拍搜的優化,今天我就講講我是如何用跳表優化檢索系統的。

都知道,搜尋引擎利用夾角余弦計算query與文件的相似度,感興趣的小夥伴可以看我的這篇文章: 這裡面需要計算兩個向量的余弦值。

假設查詢向量為:$ q = [q_,q_,......,q_] \(

假設文件向量為:\) d = [d_,d_,......,d_] $

query與文件的相似度為:$ sim(q,d) = \frac $ 。這裡面需要q和d模長相乘做分母,對應分量相乘之和做分子。

對於query可以在每次查詢之前做統一的預處理,在預處理過程中計算模長;對於文件,不能每次查詢都計算一遍模長,這樣效率很低,可以事先在建立索引的時候計算模長並儲存。

int i = 0, j = 0;

double sum = 0.0;

while(i < len_q && j < len_doc) else if(q[i] > d[j]) else

}

但是,還能再優化這個**麼?答案是肯定的,那就是利用跳表。

對於搜尋引擎來說,通常query較短,而文件較長,我們估計排完序的文件序列中會有一大段一大段的詞都不在query中,可以直接跳過這些段而不用一一遍歷,這就啟發我們可以用跳表進行加速,優化**如下:

double sum = 0.0;

int step = ceil(sqrt(len_doc)), i = 0, j = 0;

while(i < len_q && j < len_doc) else

} else if(q[i] > d[j]) else

}}

我們在這裡選擇步長為 $ \sqrt} $只是表示一種理論指導,實際中還需要不斷測試不同的步長從而找到實際最優解。

當然,優化這個問題並不一定用跳表,如果記憶體足夠大,我們可以為每個文件建立雜湊或者map,這樣只需用o(1)或者 o(log(len_doc))時間判斷文件中是否包含乙個詞。

利用簡單的跳表,加起來不過幾十行**,直接使檢索的效率提高一倍,優化了50%的硬體成本,可以高高興興領取年終獎回家過大年了。 5年前我就研究了跳表,沒想到5年後的今天我竟然用到了它,所以沒事多看看感興趣的技術、研究一下感興趣的問題對你的將來只有利沒有弊。

我是怎麼選搜尋引擎的

最近試用了不少搜尋引擎,寫個小總結吧。用的是蘋果電腦,常用瀏覽器是safari。而safari裡只有5個搜尋引擎可選 經過一段時間的使用,慢慢習慣了搜尋結果裡不再是鋪天蓋地的廣告,搜到的資訊的準確度也還不錯。後來,開始實習。公司的wi fi可以無障礙訪問全世界的網際網路。工作時,經常需要搜尋一些技術...

搜尋引擎優化

十 註冊alexa,並通過 認證。http www.alexa.com data details contact info?url taoyinqing.com 中國雅虎 http search.help.cn.yahoo.com h4 4.html 微軟live msn http search.m...

搜尋引擎優化

做seo也不長不短的做了四五年了。其他行業,做四五年只能算是新手。但是想想seo行業什麼時候才出現,再看看同行的不少更新手,發現自己竟然還算資深了。但做幾年seo之後,仔細回想每天進行的工作也會經常迷惑,到底seo是什麼?先從定義上看看,seo是什麼意思?定義很容易理解,實踐中卻有些迷惑。seo部落...