導航:首頁 > 源碼編譯 > 索引用到的演算法

索引用到的演算法

發布時間:2022-12-11 15:11:49

1. GBase 8c的索引類型式有幾種分別是哪些

GBase 8c提供了多種索引類型: B-tree、Hash、GiST、SP-GiST 、GIN 和 BRIN。每一種索引類型使用不同的演算法來適應不同類型的查詢。默認情況下,CREATE INDEX命令創建適合於大部分情況的B-tree 索引。
(1)B-tree索引使用一種類似與B+樹的結構來存儲數據的鍵值,通過這種結構能夠快速地查找索引。
(2)Hash索引只能處理簡單等值比較。不論何時當一個索引列涉及到一個使用了=操作符的比較時,查詢規劃器將考慮使用一個Hash索引。
(3)GiST索引並不是一種單獨的索引,而是可以用於實現很多不同索引策略的基礎設施。相應地,可以使用一個GiST索引的特定操作符根據索引策略(操作符類)而變化。
(4)SP-GiST索引為支持多種搜索提供了一種基礎結構。SP-GiST 允許實現眾多不同的非平衡的基於磁碟的數據結構,例如四叉樹、k-d樹和radix樹。
(5)GIN 索引是「倒排索引」,它適合於包含多個組成值的數據值,例如數組。倒排索引中為每一個組成值都包含一個單獨的項,它可以高效地處理測試指定組成值是否存在的查詢。與 GiST 和 SP-GiST相似, GIN 可以支持多種不同的用戶定義的索引策略,並且可以與一個 GIN 索引配合使用的特定操作符取決於索引策略。
(6)BRIN 索引(塊范圍索引的縮寫)存儲有關存放在一個表的連續物理塊范圍上的值摘要信息。與 GiST、SP-GiST 和 GIN 相似,BRIN 可以支持很多種不同的索引策略,並且可以與一個 BRIN 索引配合使用的特定操作符取決於索引策略。

2. 索引排序vb演算法原理

快速從一個大數據集中找出某個欄位等於確定值的記錄。
vb內部排序7大演算法:1、冒泡排序2、直接選擇排序(StraightSelectSort)(BubbleSort)3、直接插入排序(StraightInsertionSort)4、希爾排序(ShellSort)5、快速排序(QuickSort)6、歸並排序(MergeSort)7、堆排序(HeapSort)。
索引是一種利用某種規則的數據結構與實際數據的關系加快數據查找的功能;索引數據節點中有著實際文件的位置,因為索引是根據特定的規則和演算法構建的,在查找的時候遵循索引的規則可以快速查找到對應數據的節點,從而達到快速查找數據的效果;其實宏觀來說索引其實是一種概念而不是具體的某項技術,只是我們在某個技術中運用得比較廣泛和鮮明(比如說資料庫)漸漸的有了特定領域的標簽,其實在生活中索引的使用無處不在,比如說:書本里的目錄;讀書時的座位號,考試編號都有類似索引的功能。

3. 比對演算法總結(二)——基於BWT索引結構的比對演算法-Bowite1

這是美國馬里蘭大學計算機研究所、生物信息學和計算生物學中心於2009年發表在《Genome Biology》雜志的一篇經典文章,至此以後依賴於BWT索引的比對演算法成為主流。 Bowite 是一款超快速、內存佔用低的短序列比對軟體,適用於將短reads比對至大型參考基因組。採用Burrows-Wheeler 演算法建立索引的Bowite軟體可以在1 CPU時內,將2000萬條reads 比對至人參考基因組,且內存只佔有1.3Gb。於此同時Bowite 採用了新的quality-aware backtracking(質量回溯)演算法,比對過程允許錯配。

在此之前都是採用對reads (SHRiMP, Maq, RMAP,ZOOM) 或者參考基因組 (SOAP)構建哈希表的演算法進行序列比對,該演算法已在上篇文章中進行了介紹 https://www.jianshu.com/p/f5ccff73b181 。
Bowite 採用了一種完全新的索引構建策略,適用於哺乳動物重測序。根據千人基因組計劃數據,Bowite 在35bp PE 序列上的比對速度要比Maq 軟體快35 倍,比SOAP軟體快300倍。Bowite 採用 Burrows-Wheeler 演算法對 full-text minute-space (FM) 構建索引,人參考基因組佔用的內存為1.3 GB。
為了追求速度,Bowite 針對哺乳動物重測序項目進行了很多合理的折中。例如,如果一條reads有多條最優匹配,Bowite 只會輸出一條最優匹配。當輸出的最優匹配也不是完全匹配時,Bowite並不能保證在所有情況下都能輸出最高質量的匹配。在設定了較高的匹配閾值時,一小部分含有多個錯配的reads可能會比對失敗。在默認參數條件下,Bowite 的靈敏度與SOAP 相當,略低於Maq。可以在命令行手動改變參數,在犧牲更多時間的情況下,增加靈敏度,給出reads所有可能的比對結果。目前Bowite 比對的reads長度范圍為4bp - 1024bp。

Bowite 對參考基因組建立索引的方法是 Burrows-Wheeler transform (BWT) 和 FM index。Bowite 建立的人類基因組索引在硬碟上的大小為2.2GB,在比對時的內存為1.3GB。FM index 常用的精確查找方法為 Ferragina 和 Manzini 演算法。Bowite 沒有完全使用該演算法,因為該演算法不允許錯配,不能比對含有測序錯誤和變異的reads。針對這種情況,Bowite引入了新的擴展演算法:quality-aware backtracking 演算法,允許錯配並支持高質量比對;double indexing 策略,避免過度回溯;Bowite比對策略與Maq軟體相似,允許小部分的高質量reads 含有錯配,並且對所有的錯配位點的質量值設置了上限閾值。

BWT 轉換是字元串的可逆性排列,它最早應用於文本數據的壓縮,依賴BWT建立的索引,可以在較低內存下,實現大型文本的有效搜索。它被在生物信息學中有廣泛的應用,包括重復區域計數、全基因組比對、微陣列探針設計、Smith-Waterman 比對到人參考基因組。Burrows-Wheeler transform (BWT) 的轉換步驟如圖1所示:

1、輪轉排序。如圖1a 所示,(1)將字元$ 添加到文本 T (acaacg)的末尾,但需注意其中字元$ 並未實際添加到文本 T 中,且其在字母表中邏輯順序小於 T 中所有出現過的字元。(2) 然後將當前字元串的第一個字元移到最後一位,形成一個新的字元串,再將新的字元串的第一位移到最後一位形成另一個新的字元串,就這樣不斷循環這個過程,直到字元串循環完畢(即$處於第一位),這樣就形成了一個基於原字元串的字元矩陣M(這一步原圖1a 進行了省略,見下方小圖)。(3) 然後對矩陣M的各行字元按照字典先後順序排序,獲得排序後的字元矩陣 BWM(T),矩陣的最後一列定義為 BWT(T)。 前期經過一個小復雜的過程獲得了BWT(T)列,那這一列到底有什麼用呢?其實BWT(T)列通過簡單的演算法就可以推算出原始文本T的所有信息。而經過轉換之後的BWT(T)列大量重復字元是靠近的,只儲存該列信息,可以大大提高字元壓縮比例。

2、LF-Mapping。圖1a 轉換矩陣 BWM(T)含有一種 'last first (LF) mapping' 的特性,即最後一列L中出現某字元出現的順序與第一列F某字元出現的次序時一致的。根據Supplementary1 圖中演算法1 STEPLEFT 和 演算法2 UNPERMUTE 就可以推算出BWT(T)到 T 的過程, 圖1 b記錄了整個推算過程。 詳細推算過程可參考這個博客介紹: https://blog.csdn.net/stormlovetao/article/details/7048481 。

3、reads精確匹配。使用BWT演算法的最終目的是要將短reads比對到參考基因組上,確定短reads在參考基因組上的具體位置。轉換後的BWT(T)序列,可以利用Supplementary1 圖中演算法3 EXACTMATCH 實現reads的精確匹配。圖1c 列出了 字元串 aac 比對至acaacg 的過程 。 詳細推算過程可參考這篇介紹: https://zhuanlan.hu.com/p/158901556 。

上述的BWT轉換只能用於精確的匹配,但是測序reads是含有測序錯誤和突變的,精確匹配並不適用。這里應用了 backtracking 搜索的演算法,用於允許錯配快速比對 。含有錯配的reads只是一小部分。測序reads的每個鹼基都含有唯一的測序量值,測序質量值越該位點是測序錯誤的可能越大,只有當一條read 的所有錯配的測序質量值總和小於一定閾值時可以允許錯誤匹配。
圖2顯示了精確匹配和非精確匹配的過程,backtracking 搜索過程類似於 EXACTMATCH ,首先計算連續較長的後綴矩陣。如果矩陣中沒有搜索到相應的reads,則演算法會選擇一個已經匹配的查詢位置,替換一個不同鹼基,再次進行匹配。EXACTMATCH搜索從被替換位置之後開始,這樣就可以比對就可以允許一定的錯配。backtracking 過程發生在堆棧結構的上下文中,當有替換產生時,堆棧的結構會增長;當所有結果都不匹配時,堆棧結構會收縮。
Bowite 軟體的搜索演算法是比較貪婪的,Bowite軟體會報出遇到的第一個有效比對,並不一定是在錯配數目和變異質量上的「最佳比對」。沒有查詢最優比對的原因是尋找「最佳比對」會比現有的模型慢2-3倍。而在重測序項目上,速度是更重要的因素。Bowite 也設置了可以輸出多個比對位置(-k)和所有比對位置(-a)的參數,添加這些參數後,比對速度會顯著變慢。

目前的比對軟體會有過度回溯的情況,在reads的3『端花費大量無用時間去回溯。Bowite利用『double indexing』技術減少了過度回溯的發生。簡單來說就是對正向參考基因組進行BWT轉換,稱為 『Forward index』,同時對反向(注意不是互補配對序列,是反向序列)參考基因組也進行BWT轉換,稱為『Mirror index』。 當只允許一個錯配時,比對根據reads是前半段出現錯配,還是後半段出現錯配會有兩種情況:(1)Phase1 將Forward index 載入入內存,不允許查詢reads右半段出現錯配;(2)Phase2 將Mirror index 載入如內存,不允許查詢序列的反向reads右半段(原查詢序列的左半端) 出現錯配。這樣可以避免過度回溯,提高比比對的靈敏度。 但是,如果比對軟體允許一個reads有多個錯配時,仍然會有過度回溯的現象發生,為了減少過度回溯現象的發生,這里將回溯的上限進行了限定(默認值為:125次)。

Bowite 允許使用者在高質量reads的末端(默認是28bp)設置錯配數目(默認的錯配數目是2)。高質量reads末端的28bp序列被稱為 '種子' 序列。這個『種子』序列又可分為兩等份:14bp的高質量末端稱為 『hi-half』(通常位於5『端),14bp的低質量末端稱為『lo-half』。 如果種子序列只允許2bp 的錯配,比對會出現4 種情況:(1)種子序列中沒有錯配(case1);(2)hi-half區域沒有錯配,lo-half區域有一個或兩個錯配(case2);(3)lo-half區域沒有錯配,hi-half區域有一個或兩個錯配(case3);(4)lo-half區域有一個錯配,hi-half區域有一個錯配(case4);
在所有情況下,reads的非種子部分允許任意數目的錯配。如圖3所示,Bowite 演算法會根據上面4 種情況交替變化『Forward index』和『Mirror index』比對策略,主要會有三種比對策略。

Bowite 建立一次參考基因組索引後,後續的比對可反復使用該索引。表1和表2列出了在默認參數條件下,Bowite、SOAP、Maq軟體性能的比較。在reads比對率相近的條件下,Bowite軟體的比對速度速度相對於SOAP、Maq軟體有較大的提升。

1、將reads 比對至人參考基因組上,Bowite相對於SOAP和Maq軟體有較大的優勢。它運行的內存非常小(1.2GB),在相同靈敏度下,速度有了較大的提升。
2、Bowite 軟體建立一次參考基因組索引後,後續的比對可反復使用該索引。
3、Bowite 速度快、內存佔用小、靈敏度高主要是因為使用了BWT演算法構建索引、利用回溯演算法允許錯配、採用Double index策略避免過度回溯。
4、Bowite 軟體目前並不支持插入、缺失比對,這個是今後需要努力的方向。

[1] Langmead B . Ultrafast and memory-efficient alignment of short DNA sequences to the human genome[J]. Genome biology, 2009, 10(3):R25.
[2] BWT 推算過程參考博客 https://blog.csdn.net/stormlovetao/article/details/7048481
[3] FM index 精確查匹配過程參考文章 https://zhuanlan.hu.com/p/158901556

4. 索引構建

索引構建

索引器

索引器需要原始文本,但是文檔可能採用多種編碼格式,索引器對中間文件和最後的索引文件進行壓縮或者解壓縮,在web搜索中,文檔往往並不是來自本地,必須要通過網路採集才能得到。

一個2007年度的典型計算機系統的參數如下表所示

與IR系統設計相關的硬體參數:

由於內存不足,必須採用基於磁碟的外部排序演算法。為了達到可以接受的速度,對該演算法的核心思想要求是: 在排序時盡量減少磁碟隨機尋道的次數

基於塊的排序索引演算法(BSBI, blocked sort-based indexing algorithm)

基於快的排序索引演算法將每個塊的倒排索引存儲文件 f1 ,...fn 中,最後合並成文件fmerged。

具體過程可以細化為:

基於塊的倒排索引合並過程:將兩個塊從磁碟讀入內存,然後在內存中進行合並,最後寫回磁碟。

時間復雜度 :O(T logT),因為具有最高時間復雜度的步驟是排序,T是排序的項目數量上限(例如termID-docID對的數量)。但實際的索引時間通常由解析文檔(ParseNextBlock)和完成最終合並(MergeBlocks)所花費的時間決定的。

優缺點 :該演算法有很好的擴展性,但是需要一種將詞項映射成其ID的數據結構,對於大規模的文檔集合來說,該數據結構會很大,在內存中難以存放。

SPIMI 演算法的流程如圖所示,其中省略了文檔分析以及將文檔轉換成詞項—文檔 ID 流(算 法中稱為 token_stream)的過程。反復調用 SPIMI-INVERT 函數直到將全部的文檔集處理完為止。

BSBI 和 SPIMI 的區別

在實際當中,文檔集通常都很大,在單台計算機上很難高效地構建索引,因此Web搜索引擎通常使用分布式索引構建,索引結果也是分布式的,往往按照詞項或者文檔進行分片後分布在多台計算機上。

索引更新方法 :周期性地對文檔集合從頭開始進行索引重構。

實時性 :要實時檢索到新文檔,可以採用輔助索引。輔助索引存儲新文檔信息,記錄在內存中,檢索時同時遍歷兩個索引。文檔的刪除記錄保存在一個無效位向量中。

引入輔助索引的解決辦法

主輔索引合並分析:

對數合並

5. 圖書館圖書索引過程中用到的的演算法

圖書索書號一般包括兩個部分(多數情況下佔2行),一是分類號,二是區分號。分類號表示這本書屬於哪一學科類別,區分號表示本圖書館該類圖書的不同品種區分。比如一圖書館買了很多種「C語言編程」的圖書,有張三編的,有李四編的。

6. mysql索引(九)索引合並

索引合並是mysql底層為我們提供的智能演算法。了解索引合並的演算法,有助於我們更好的創建索引。

索引合並是通過多個range類型的掃描並且合並它們的結果集來檢索行的。僅合並來自單個表的索引掃描,而不是跨多個表的索引掃描。合並會產生底層掃描的三種形式:unions(合並)、intersections(交集)、unions-of-intersections(先取交集再合並)。

以下四個例子會產生索引合並:

索引合並有以下已知的局限性:

1、如果查詢語句包含一個帶有嚴重AND/OR嵌套的復雜的WHERE子句而MySQL沒有選擇最佳計劃,那麼可以嘗試使用以下的標志符轉換:

(x AND y) OR z => (x OR z) AND (y OR z)
(x OR y) AND z => (x AND z) OR (y AND z)

2、索引合並不適用於全文索引。

在 EXPLAIN 語句輸出的信息中,索引合並在type列中表現為「index_merge」,在這種情況下,key列包含使用的索引列表。

索引合並訪問方法有幾種演算法,表現在 EXPLAIN 語句輸出的Extra欄位中:

下面將更詳細地描述這些演算法。優化器根據各種可用選項的成本估計,在不同的索引合並演算法和其他訪問方法之間進行選擇。

Index Merge Intersection演算法

Index Merge Intersection演算法對所有使用的索引執行同步掃描,並生成從合並的索引掃描接收到的行序列的交集。

這種演算法適用於當WHERE子句被轉換成多個使用AND連接的不同索引key上的范圍條件,且條件是以下兩種之一:

一、這種形式的N部分表達式,索引正好包括N個欄位(所有索引欄位都被覆蓋),N>=1,N如果大於1就是復合索引:

二、InnoDB表主鍵上的任何范圍條件。

例子:

Index Merge Union演算法

該演算法類似於Index Merge Intersection演算法,適用於當WHERE子句被轉換成多個使用OR連接的不同索引key上的范圍條件,且條件是以下三種之一:

一、這種形式的N部分表達式,索引正好包括N個欄位(所有索引欄位都被覆蓋),N>=1,N如果大於1就是復合索引:

二、InnoDB表主鍵上的任何范圍條件。

三、符合Index Merge Intersection演算法的條件。

例子:

Index Merge Sort-Union演算法

該演算法適用於當WHERE子句被轉換成多個使用OR連接的不同索引key上的范圍條件,但是不符合 Index Merge Union演算法的。Index Merge Sort-Union和Index Merge Union演算法的區別在於,Index Merge Sort-Union必須首先獲取所有行的行id並在返回任何行之前對它們進行排序。

例子:

有好的建議,請在下方輸入你的評論。

歡迎訪問個人博客
https://guanchao.site

7. 程序員開發用到的十大基本演算法

演算法一:快速排序演算法
快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個項目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他Ο(n log n) 演算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實現出來。

快速排序使用分治法(Divide and conquer)策略來把一個串列(list)分為兩個子串列(sub-lists)。

演算法步驟:
1 從數列中挑出一個元素,稱為 「基準」(pivot),
2 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分區退出之後,該基準就處於數列的中間位置。這個稱為分區(partition)操作。
3 遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

遞歸的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞歸下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最後的位置去。

演算法二:堆排序演算法
堆排序(Heapsort)是指利用堆這種數據結構所設計的一種排序演算法。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。堆排序的平均時間復雜度為Ο(nlogn) 。

演算法步驟:
1.創建一個堆H[0..n-1]
2.把堆首(最大值)和堆尾互換
3.把堆的尺寸縮小1,並調用shift_down(0),目的是把新的數組頂端數據調整到相應位置
4.重復步驟2,直到堆的尺寸為1

演算法三:歸並排序
歸並排序(Merge sort,台灣譯作:合並排序)是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。

演算法步驟:

演算法四:二分查找演算法
二分查找演算法是一種在有序數組中查找某一特定元素的搜索演算法。搜素過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜 素過程結束;如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。如果在某一步驟數組 為空,則代表找不到。這種搜索演算法每一次比較都使搜索范圍縮小一半。折半搜索每次把搜索區域減少一半,時間復雜度為Ο(logn) 。

演算法五:BFPRT(線性查找演算法)
BFPRT演算法解決的問題十分經典,即從某n個元素的序列中選出第k大(第k小)的元素,通過巧妙的分 析,BFPRT可以保證在最壞情況下仍為線性時間復雜度。該演算法的思想與快速排序思想相似,當然,為使得演算法在最壞情況下,依然能達到o(n)的時間復雜 度,五位演算法作者做了精妙的處理。

演算法步驟:

終止條件:n=1時,返回的即是i小元素。

演算法六:DFS(深度優先搜索)
深度優先搜索演算法(Depth-First-Search),是搜索演算法的一種。它沿著樹的深度遍歷樹的節點,盡可能深的搜索樹的分 支。當節點v的所有邊都己被探尋過,搜索將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發 現的節點,則選擇其中一個作為源節點並重復以上過程,整個進程反復進行直到所有節點都被訪問為止。DFS屬於盲目搜索。

深度優先搜索是圖論中的經典演算法,利用深度優先搜索演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。一般用堆數據結構來輔助實現DFS演算法。

演算法步驟:

上述描述可能比較抽象,舉個實例:
DFS 在訪問圖中某一起始頂點 v 後,由 v 出發,訪問它的任一鄰接頂點 w1;再從 w1 出發,訪問與 w1鄰 接但還沒有訪問過的頂點 w2;然後再從 w2 出發,進行類似的訪問,… 如此進行下去,直至到達所有的鄰接頂點都被訪問過的頂點 u 為止。

接著,退回一步,退到前一次剛訪問過的頂點,看是否還有其它沒有被訪問的鄰接頂點。如果有,則訪問此頂點,之後再從此頂點出發,進行與前述類似的訪問;如果沒有,就再退回一步進行搜索。重復上述過程,直到連通圖中所有頂點都被訪問過為止。

演算法七:BFS(廣度優先搜索)
廣度優先搜索演算法(Breadth-First-Search),是一種圖形搜索演算法。簡單的說,BFS是從根節點開始,沿著樹(圖)的寬度遍歷樹(圖)的節點。如果所有節點均被訪問,則演算法中止。BFS同樣屬於盲目搜索。一般用隊列數據結構來輔助實現BFS演算法。

演算法步驟:

演算法八:Dijkstra演算法
戴克斯特拉演算法(Dijkstra』s algorithm)是由荷蘭計算機科學家艾茲赫爾·戴克斯特拉提出。迪科斯徹演算法使用了廣度優先搜索解決非負權有向圖的單源最短路徑問題,演算法最終得到一個最短路徑樹。該演算法常用於路由演算法或者作為其他圖演算法的一個子模塊。

該演算法的輸入包含了一個有權重的有向圖 G,以及G中的一個來源頂點 S。我們以 V 表示 G 中所有頂點的集合。每一個圖中的邊,都是兩個頂點所形成的有序元素對。(u, v) 表示從頂點 u 到 v 有路徑相連。我們以 E 表示G中所有邊的集合,而邊的權重則由權重函數 w: E → [0, ∞] 定義。因此,w(u, v) 就是從頂點 u 到頂點 v 的非負權重(weight)。邊的權重可以想像成兩個頂點之間的距離。任兩點間路徑的權重,就是該路徑上所有邊的權重總和。已知有 V 中有頂點 s 及 t,Dijkstra 演算法可以找到 s 到 t的最低權重路徑(例如,最短路徑)。這個演算法也可以在一個圖中,找到從一個頂點 s 到任何其他頂點的最短路徑。對於不含負權的有向圖,Dijkstra演算法是目前已知的最快的單源最短路徑演算法。

演算法步驟:

重復上述步驟2、3,直到S中包含所有頂點,即W=Vi為止

演算法九:動態規劃演算法
動態規劃(Dynamic programming)是一種在數學、計算機科學和經濟學中使用的,通過把原問題分解為相對簡單的子問題的方式求解復雜問題的方法。 動態規劃常常適用於有重疊子問題和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。

動態規劃背後的基本思想非常簡單。大致上,若要解一個給定問題,我們需要解其不同部分(即子問題),再合並子問題的解以得出原問題的解。 通常許多 子問題非常相似,為此動態規劃法試圖僅僅解決每個子問題一次,從而減少計算量: 一旦某個給定子問題的解已經算出,則將其記憶化存儲,以便下次需要同一個 子問題解之時直接查表。 這種做法在重復子問題的數目關於輸入的規模呈指數增長時特別有用。

關於動態規劃最經典的問題當屬背包問題。

演算法步驟:

演算法十:樸素貝葉斯分類演算法
樸素貝葉斯分類演算法是一種基於貝葉斯定理的簡單概率分類演算法。貝葉斯分類的基礎是概率推理,就是在各種條件的存在不確定,僅知其出現概率的情況下, 如何完成推理和決策任務。概率推理是與確定性推理相對應的。而樸素貝葉斯分類器是基於獨立假設的,即假設樣本每個特徵與其他特徵都不相關。

樸素貝葉斯分類器依靠精確的自然概率模型,在有監督學習的樣本集中能獲取得非常好的分類效果。在許多實際應用中,樸素貝葉斯模型參數估計使用最大似然估計方法,換言之樸素貝葉斯模型能工作並沒有用到貝葉斯概率或者任何貝葉斯模型。

盡管是帶著這些樸素思想和過於簡單化的假設,但樸素貝葉斯分類器在很多復雜的現實情形中仍能夠取得相當好的效果。

8. 主流搜索引擎演算法【分布式索引】

當搜索引擎需要處理的 文檔集合太多 的時候,就需要考慮分布式解決方案。每台機器維護整個索引的一部分,有多台機器協作來完成索引的建立和對查詢的響應。

將整個文檔集合切割成若干個子集合,而每台機器負責對某個文檔子集合建立索引,並響應查詢請求。

每個索引伺服器負責 詞典中部分單詞 的倒排列表的建立和維護。

工作原理:一次一個單詞。假設查詢包含A、B、C三個單詞,查詢伺服器接收到查詢後,將查詢轉發到包含單詞A倒排列表的索引伺服器節點1,索引伺服器節點1提取A的倒排列表,並累計計算搜索結果的中間的分,然後將查詢和中間結果傳遞給包含單詞B倒排列表的索引伺服器節點,索引伺服器節點2也是類似處理,並繼續到索引伺服器節點3。然後將最終結果返回給查詢分發伺服器,查詢分發伺服器計算得分最高的K個文檔作為搜索結果輸出。

兩種方案比較

- 按文檔比較常用,按單詞劃分只在特殊應用場合才使用。

- 按單詞劃分的不足:

可擴展性

搜索引擎處理的文檔是經常變動的。如果按文檔來對索引劃分,只需要增加索引伺服器,操作起來很方便。但如果是按單詞進行索引劃分,則對幾乎所有的索引伺服器都有直接影響,因為新增文檔可能包含所有詞典單詞,即需要對每個單詞的倒排列表進行更新,實現起來相對復雜。

負載均衡

常用單詞的倒排列表非常龐大,可能會達到幾十M大小。如果按文檔劃分,這種單詞的倒排列表會比較均勻地分布在不同的索引伺服器上,而按單詞進行索引劃分,某個常見單詞的倒排列表全部內容都由一台索引伺服器維護。如果該單詞同時是一個流行詞彙,那麼該伺服器會成為負載過大的性能瓶頸。

容錯性

假設某台伺服器出現故障。如果按文檔進行劃分,那麼隻影響部分文檔子集合,其他索引伺服器仍然能響應。但如果按單詞進行劃分,若索引伺服器發生故障,則某些單詞的倒排列表無法訪問,用戶查詢這些單詞的時候,會發現沒有搜索結果,直接影響用戶體驗。

對查詢處理方式的支持

按單詞進行索引一次只能查詢一個單詞,而按文檔劃分的不受此限制。

9. 什麼是基於索引搜索 動態分配演算法

倒排索引表中的每一項都包括一個屬性值和具有該屬性值的各記錄的地址。由於不是由記錄來確定屬性值,而是由屬性值來確定記錄的位置,因而稱為倒排索引(inverted index)。帶有倒排索引的文件我們稱為倒排索引文件,簡稱倒排文件。建立全文索引中有兩項非常重要,一個是如何對文本進行分詞,一是建立索引的數據結構。分詞的方法基本上是二元分詞法、最大匹配法和統計方法。索引的數據結構基本上採用倒排索引的結構。
分詞的好壞關繫到查詢的准確程度和生成的索引的大小。在中文分詞發展中,早期經常使用分詞方式是二元分詞法,該方法的基本原理是將包含中文的句子進行二元分割,不考慮單詞含義,只對二元單詞進行索引。因此該方法所分出的單詞數量較多,從而產生的索引數量巨大,查詢中會將無用的數據檢索出來,好處是演算法簡單不會漏掉檢索的數據。之後又發展出最大匹配分詞方法,該方法又分為正向最大分詞和逆向最大分詞。其原理和查字典類似,對常用單詞生成一個詞典,分析句子的過程中最大的匹配字典中的單詞,從而將句子拆分為有意義的單詞鏈。最大匹配法中正向分詞方法對偏正式詞語的分辨容易產生錯誤,比如「首飾和服裝」會將「和服」作為單詞分出。達夢資料庫採用的是改進的逆向最大分詞方法,該分詞方法較正向正確率有所提高。最為復雜的是通過統計方式進行分詞的方法。該方法採用隱式馬爾科夫鏈,也就是後一個單詞出現的概率依靠於前一個單詞出現的概率,最後統計所有單詞出現的概率的最大為分詞的依據。這個方法對新名詞和地名的識別要遠遠高於最大匹配法,准確度隨著取樣文本的數量的增大而提高。
二元分詞方法和統計方法是不依賴於詞典的,而最大匹配法分詞方法是依賴於詞典的,詞典的內容決定分詞結構的好壞。
全文檢索的索引被稱為倒排索引,之所以成為倒排索引,是因為將每一個單詞作為索引項,根據該索引項查找包含該單詞的文本。因此,索引都是單詞和唯一記錄文本的標示是一對多的關系。將索引單詞排序,根據排序後的單詞定位包含該單詞的文本。
步驟1)讀取一整條句子到變數str中,轉到步驟2

步驟2)從句子的尾端讀取1個字到變數word中,轉到步驟3

步驟3)在字典查找word中保存的單詞。如果存在則保存word,轉到步驟4,否則轉到步驟5)

步驟4)如果是字典中最大單詞或者超過最大單詞數(認定為新詞),從句尾去掉該單詞,返回步驟2

步驟5)讀取前一個字到word中,構成新單詞,轉到步驟3)

詞庫的內存數據結構和詞庫中單詞的匹配演算法

內存中單詞採用層次結構保存

10. mysql的索引用的什麼數據結構

談到索引,大家並不陌生。索引本身是一種數據結構,存在的目的主要是為了縮短數據檢索的時間,最大程度減少磁碟 IO。
任何有數據的場景幾乎都有索引,比如手機通訊錄、文件系統(ext4\xfs\ntfs)、資料庫系統(MySQL\Oracle)。資料庫系統和文件系統一般都採用 B+ 樹來存儲索引信息,B+ 樹兼顧寫和讀的性能,最極端時檢索復雜度為 O(logN),其中 N 指的是節點數量,logN 表示對磁碟 IO 掃描的總次數。
MySQL 支持的索引結構有四種:B+ 樹,R 樹,HASH,FULLTEXT。

閱讀全文

與索引用到的演算法相關的資料

熱點內容
安卓手機拍照為什麼總是抖動 瀏覽:250
汽車車載app如何下載 瀏覽:24
python復合型數據類型 瀏覽:375
登錄伺服器發生錯誤怎麼回事 瀏覽:272
松下空氣能壓縮機 瀏覽:938
萬能源碼播放器 瀏覽:968
串口伺服器如何轉發 瀏覽:359
如何下載Ck電影部app 瀏覽:744
解壓文具筆袋簡單 瀏覽:288
android百度坐標轉換 瀏覽:367
文件公私鑰加密傳輸 瀏覽:665
python矩陣維度 瀏覽:927
華佗舌診源碼 瀏覽:898
解壓壓縮包有一個錯誤怎麼辦 瀏覽:966
怎麼在手機上設立文件夾 瀏覽:232
雲幫手伺服器搭建教程 瀏覽:785
惠普默認存在哪個文件夾 瀏覽:493
建立桌面圖標文件夾 瀏覽:86
python怎麼跳過異常繼續執行 瀏覽:315
單片機驅動可控硅 瀏覽:294