導航:首頁 > 源碼編譯 > 高效匹配演算法

高效匹配演算法

發布時間:2022-09-11 10:14:33

1. 巧遇相親app怎麼賺錢

咨詢記錄 · 回答於2021-05-01

2. 那些經典演算法:AC自動機

第一次看到這個名字的時候覺得非常高級,深入學習就發現,AC就是一種多模式字元串匹配演算法。前面介紹的BF演算法,RK演算法,BM演算法,KMP演算法都屬於單模式匹配演算法,而Trie樹是多模式匹配演算法,多模式匹配演算法就是在一個主串中查找多個模式串,舉個最常用的例子,比如我們在論壇發表評論或發帖的時候,一般論壇後台會檢測我們發的內容是否有敏感詞,如果有敏感詞要麼是用***替換,要麼是不讓你發送,我們評論是通常是一段話,這些敏感詞可能成千上萬,如果用每個敏感詞都在評論的內容中查找,效率會非常低,AC自動機中,主串會與所有的模式串同時匹配,這時候就可以利用AC自動機這種多模式匹配演算法來完成高效的匹配,

AC自動機演算法是構造一個Trie樹,然後再添加額外的失配指針。這些額外的適配指針准許在查找字元串失敗的時候進行回退(例如在Trie樹種查找單詞bef失敗後,但是在Trie樹種存中bea這個單詞,失配指針會指向前綴be),轉向某些前綴分支,免於重復匹配前綴,提高演算法效率。
常見於IDS軟體或病毒檢測軟體中病毒特徵字元串,可以構建AC自動機,在這種情況下,演算法的時間復雜度為輸入字元串的長度和匹配數量之和。

假設現有模式字元串集合:{abd,abdk, abchijn, chnit, ijabdf, ijaij} 構建AC自動機如下:

說明:

1)當前指針curr指向AC自動機的根節點:curr=root。
2)從文本串中讀取(下)一個字元。
3)從當前節點的所有孩子節點中尋找與該字元匹配的節點:

4)若fail == null,則說明沒有任何子串為輸入字元串的前綴,這時設置curr = root,執行步驟2.
若fail != null,則將curr指向 fail節點,指向步驟3。
理解起來比較復雜,找網上的一個例子,假設文本串text = 「abchnijabdfk」。
查找過程如下:

說明如下:
1)按照字元串順序依次遍歷到:a-->b-->c-->h ,這時候發現文本串中下一個節點n和Trie樹中下一個節點i不匹配,且h的fail指針非空,跳轉到Trie樹中ch位置。
注意c-->h的時候判斷h不為結束節點,且c的fail指針也不是結束節點。
2)再接著遍歷n-->i,發現i節點在Trie樹中的下一個節點找不到j,且有fail指針,則繼續遍歷,
遍歷到d的時候要注意,d的下一個匹配節點f是結束字元,所以得到匹配字元串:ijabdf,且d的fail節點也是d,且也是結束字元,所以得到匹配字元串abd,不過不是失敗的匹配,所以curr不跳轉。

先將目標字元串插入到Trie樹種,然後通過廣度有限遍歷為每個節點的所有孩子節點找到正確的fail指針。
具體步驟如下:
1)將根節點的所有孩子節點的fail指針指向根節點,然後將根節點的所有孩子節點依次入隊列。
2)若隊列不為空:
2.1)出列一個字元,將出列的節點記為curr,failTo表示curr的
fail指針,即failTo = curr.fail 。
2.2) 判斷curr.child[i] == failTo.child[i]是不是成立:
成立:curr.child[i].fail = failTo.child[i]
因為當前字元串的後綴和Tire樹的前綴最長部分是到fail,
且子字元和failTo的下一個字元相同,則fail指針就是
failTo.child[i]。
不成立: 判斷failTo是不是為null是否成立:
成立: curr.child[i].fail = root = null。
不成立: failTo = failTo.fail 繼續2.2
curr.child[i]入列,再次執行步驟2)。
3)隊列為空結束。

每個結點的fail指向的解決順序是按照廣度有限遍歷的順序完成的,或者說層序遍歷的順序進行,我們根據父結點的fail指針來求當前節點的fail指針。

上圖為例,我們要解決y節點的fail指針問題,已經知道y節點的父節點x1的fail是指向x2的,根據fail指針的定義,我們知道紅色橢圓中的字元串序列肯定相等,而且是最長的公共部分。依據y.fail的含義,如果x2的某個孩子節點和節點y表示的表示的字元相等,y的fail就指向它。
如果x2的孩子節點中不存在節點y表示的字元。由於x2.fail指向x3,根據x2.fail的含義,我們知道綠色框中的字元序列是相同的。顯然如果x3的某個孩子和節點y表示字元相等,則y.fail就指向它。

如果x3的孩子節點不存在節點y表示的字元,我們重復這個步驟,直到xi的fail節點指向null,說明我們達到頂層,只要y.fail= root就可以了。
構造過程就是知道當前節點的最長公共前綴的情況下,去確定孩子節點的最長公共前綴。

下圖中,每個節點都有fail虛線,指向根節點的虛線沒畫出,求圖中c的孩子節點h的fail指向:

原圖中,深藍色的框出來的是已經確定fail指針的,求紅色框中h節點的fail指針。
這時候,我們看下h的父親節點c的fail指針指向,為ch中的c(這表示abc字元串的所有後綴bc和c和Trie樹的所有前綴中最長公共部分為c),且這個c節點的孩子節點中有字元為h的字元,所以圖中紅色框中框出的h節點的fail指針指向 ch字元串中的h。

求紅色框中i的fail指針指向,上圖中,我們可以看到i的父親節點h的指向為ch中的h,(也就是說我們的目標字元串結合中所有前綴和字元序列abch的所有後綴在Trie樹中最長前綴為ch。)我們比較i節點和ch中的h的所有子節點,發現h只有一個n的子節點,所以沒辦法匹配,那就繼續找ch中h的fail指針,圖中沒畫出,那麼就是它的fail指針就是root,然後去看root所有子節點中有沒有和i相等的,發現最右邊的i是和我們要找的i相等的,所以我們就把i的fail指針指向i,如後面的圖。

3. 字元串匹配演算法的使用(未完待整理)

字元串的匹配在Java中都知道使用indexOf函數來實現,那麼其匹配演算法是怎麼樣的呢?

單模式和多模式的區別就是一次遍歷主串能否將多個模式的字元串都查找出來。

英文全稱為Brute Force,暴力匹配演算法,匹配字元串的方法比較暴力,也比較簡單易懂。其大概的思路就是:

我們可以看到,在極端情況下,在主串 aaaa...aab 中尋找模式串 aab ,那麼總共需要尋找(n-m+1)次,且每次都需要比對m次,那麼時間復雜度將是 (n-m+1)*m ,即 O(n*m) ;但實際上並不會這么低效,因為我們的使用場景中主串和模式串都不會太長,而且在每個子串和模式串進行比對時,只要中途有一個不匹配,那麼當前比對就會提前結束,因此大部分情況下,時間復雜度都會比 O(n*m) 要好。

我們在BF演算法的基礎上引入哈希演算法,我們不需要將每個子串與模式串逐個字元地進行比較,而是計算得出每個子串的hash值,然後和模式串的hash值進行比較,如果有相等的,那就說明有子串和模式串匹配上了。

雖然我們只需要比對模式串和子串的hash值就能得到匹配結果,次數為(n-m+1),但是對每個子串進行hash計算的時候,是要遍歷每個字元的,因此次數也是m,那麼總的時間復雜度還是 O(n*m) ,並沒有明顯地提升。

那麼我們該如何想出一個辦法,使得每個子串hash值的計算時間得到提升呢?這就是RK演算法的精髓,假設子串包含的字元集中元素個數為k,那麼就用k進制數來代表這個子串,然後hash的過程就是將這個k進制的數轉換為十進制的數,這個十進制的數就是該子串的hash值。

相鄰子串的hash值計算是有規律的,我們只需要遍歷一次主串就能得到所有子串的hash值,演算法復雜度為O(n),而不是像原先一樣,每個子串都需要O(m)的時間復雜度。

然後將模式串的hash值和所有子串的hash值進行比較,每次比較的時間復雜度是 O(1) ,總共比較(n-m+1)次,所以RK演算法的總的時間開銷為 O(n)+O(1)*O(n-m+1) ,即為 O(n) ,時間復雜度比BF演算法更加高效。

當然,有hash的地方就有可能會存在hash沖突,有可能子串和hash值和模式串的hash值是一樣的,但內容就是不一樣,此時怎麼辦呢?其實很簡單,對於hash值一樣的子串,我們增加雙保險,再比較一下這m個字元是否都一樣即可,總的時間開銷為 O(n)+O(1)*O(n-m+1)+O(m) ,即為 O(n) 。

如果極端情況下出現了很多hash沖突呢?我們對於每個和模式串相同hash值的子串都需要逐一再進行比較,那麼總的時間開銷就會為 O(n)+O(1)*O(n-m+1)+O(m)*O(n-m+1) ,即為 O(n*m) ,不過這種概率太小了,大部分情況下都不會這樣。

在真正的文本編輯器中查找和替換某個字元串時,使用的演算法既不是上述的BF演算法,也不是RK演算法;BF演算法只適合不是很長的主串,RK演算法則要設計一個沖突概率很低的hash演算法,這個比較困難,所以實際使用的是BM演算法,它是工程中非常常用的一種字元串匹配演算法,效率也是最高的。

演算法的思想和過程有些復雜,待以後整理。

KMP演算法在本質上是和BM演算法一樣的。演算法的思想和過程有些復雜,待以後整理。

瀏覽器輸入框中的智能輸入匹配是怎麼實現的,它是怎麼做動態字元串匹配查找的呢?這就用到了Trie樹。

又名字典樹,是一種專門用來快速查找字元串前綴匹配結果的樹形結構,其本質就是將所有字元串的重復的前綴合並在一起,構造一個多叉樹。

其中,根節點不包含任何信息,每個節點表示一個字元,從根節點到紅色節點的一條路徑表示存儲的一個字元串。當我們在如上Trie樹中查找"he"時,發現"he"並非是一個字元串,而是"hello"和"her"的公共前綴,那麼就會找到這兩個字元串返回。

Trie樹在內存中是如何存儲的呢?因為每一個節點都可能是包含所有字元的,所以每一個節點都是一個數組(或者散列表),用來存儲每個字元及其後綴節點的指針。

使用Trie樹,最開始構建的時候,時間復雜度為 O(n) ,其中n為所有字元串長度之和,但是一旦構建完成,頻繁地查詢某個字元串是非常高效的,時間復雜度為 O(k) ,其中k為查找字元串的長度。

Trie樹雖然查詢效率很高,但是比較浪費內存,每一個節點都必須維護一個數組存放所有可能的字元數據及其指向下一個節點的指針,因此在所有字元串公共前綴並不多的時候,內存空間浪費地就更多了。這種問題其實也有對應的解決辦法,我們可以不使用數組,而是使用有序數組、散列表、紅黑樹來存放,可以相應地降低性能來節省內存空間。

Trie樹除了可以實現瀏覽器動態輸入內容查找候選項的功能外,還可以實現多模式地敏感詞匹配功能。假設我們需要對用戶輸入的內容進行敏感詞檢查,將所有的敏感內容用***代替,那麼該如何實現呢?

首先我們可以維護一個敏感詞字典,使用上述四種單模式匹配演算法也可以實現,但是需要遍歷N次用戶輸入的內容,其中N是所有敏感詞的模式串,顯得非常低效。但是我們如果將敏感詞字典維護為一個Trie樹,然後將用戶輸入的內容從位置0開始在Trie樹中進行查詢,如果匹配到紅色節點,那麼說明有敏感詞;如果沒有匹配到紅色節點,就從用戶輸入內容的下一個位置開始繼續在Trie樹中查詢,直至將用戶輸入內容遍歷完,因此我們只是遍歷了一遍主串。

然而更高效的多模式字元串匹配使用地更多的是如下的AC自動機。

如果把Trie樹比作BF演算法,KMP演算法是BF演算法的改進,那麼AC自動機就是利用同樣的思想改進了Trie樹。

演算法的思想和過程有些復雜,待以後整理。

4. KMP演算法不是很理解 C++

KMP字元串模式匹配通俗點說就是一種在一個字元串中定位另一個串的高效演算法。簡單匹配演算法的時間復雜度為O(m*n);KMP匹配演算法。可以證明它的時間復雜度為O(m+n).。
一. 簡單匹配演算法
先來看一個簡單匹配演算法的函數:
int Index_BF ( char S [ ], char T [ ], int pos )
{
/* 若串 S 中從第pos(S 的下標0≤pos<StrLength(S))個字元
起存在和串 T 相同的子串,則稱匹配成功,返回第一個
這樣的子串在串 S 中的下標,否則返回 -1 */
int i = pos, j = 0;
while ( S[i+j] != '\0'&& T[j] != '\0')
if ( S[i+j] == T[j] )
j ++; // 繼續比較後一字元
else
{
i ++; j = 0; // 重新開始新的一輪匹配
}
if ( T[j] == '\0')
return i; // 匹配成功 返回下標
else
return -1; // 串S中(第pos個字元起)不存在和串T相同的子串
} // Index_BF

此演算法的思想是直截了當的:將主串S中某個位置i起始的子串和模式串T相比較。即從 j=0 起比較 S[i+j] 與 T[j],若相等,則在主串 S 中存在以 i 為起始位置匹配成功的可能性,繼續往後比較( j逐步增1 ),直至與T串中最後一個字元相等為止,否則改從S串的下一個字元起重新開始進行下一輪的"匹配",即將串T向後滑動一位,即 i 增1,而 j 退回至0,重新開始新一輪的匹配。

5. 指紋自動採集系統的優勢

系統功能特點

◆ 專業領先的指紋識別演算法:

專業的自主知識產權世界領先的指紋識別演算法技術安全可靠;高效的指紋登記入庫率和指紋比對通過率。

◆ 准確快速的活體指紋識別系統:

世界領先的指紋識別演算法;獨特高效的10-15倍專業WSQ指紋圖象壓縮技術;提供即時登記即時查詢驗證功能;提供多指驗證和單指驗證功能

◆ 便捷有效的卡片指紋識別系統:

完美卡片的郵寄列印功能,提供批量列印、信封列印、防偽條碼列印等;獨有的卡片指紋識別演算法,可以全自動尋找區域內捺印指紋快速識
別;快速的卡片指紋掃描錄入系統,提供多批量卡片掃描 ;高精確度的活體與捺印指紋交叉識別功能;創新的防偽條碼加密自動識別功能

◆ 靈活的攜帶型移動指紋識別系統:

提供單機採集在線上載功能;提供獨立的檔案信息錄入功能;提供遠程網路在線身份採集驗證功能。

北圖高科指紋演算法技術的主要特點

◆ 核心比對演算法領先----大大提高中差指紋的處理能力

基於指紋圖向幾何拓撲性質的特殊處理方法及指紋識別並行處理理論,北圖高科指紋技術充分借鑒北大指紋專家的實際經驗,開發出以快速紋型分類和准確提取指紋中心、三角、形態和細節特徵以及統一處理無中心和有中心情況的高效指紋匹配演算法,特別在中差指紋的鑒別和處理上更具有優勢。

◆ 指紋特徵提取准確快速----採用多種圖象處理技術

北圖高科指紋技術在開發採用多種圖象處理技術,由系統自動識別指紋圖象質量、自動進行指紋紋型分類、自動確定指紋的中心和三角、自動提取指紋細節特徵等有關信息,配合北大核心比對演算法,大大提高了比對速度和比對的准確度。

◆ 技術指標權威----經過大容量指紋資料庫的測試

北圖高科指紋技術的技術數據及技術性能中採用大容量的指紋資料庫進行測試,並在實踐中經過了較廣泛的實戰檢驗,技術數據和指標的權威性代表了國內一流水平。同時在指紋的適用群體領域是國內最廣的。

◆ 技術性能穩定適用面廣----採用多種特有設計

北圖高科指紋技術在產品的應用中採用多種特有設計,例如採用國內面積最大的活體指紋採集窗口,使提取的指紋特徵數據多,誤識和拒識率低;採用光電感測模式,使產品的應用環境要求降低;採用WSQ原始指紋壓縮存儲,使得網路傳輸和存儲要求降低等措施,極大的提高了產品的應用面,保證了用戶的實用性

6. 【演算法筆記】字元串匹配

BF 演算法中的 BF 是 Brute Force 的縮寫,中文叫作暴力匹配演算法,也叫樸素匹配演算法:

主串和模式串:
在字元串 A 中查找字元串 B,那字元串 A 就是主串,字元串 B 就是模式串。我們把主串的長度記作 n,模式串的長度記作 m

我們在主串中,檢查起始位置分別是 0、1、2…n-m 且長度為 m 的 n-m+1 個子串,看有沒有跟模式串匹配的。

BF 演算法的時間復雜度是 O(n*m)

等價於

比如匹配Google 和Goo 是最好時間復雜度,匹配Google 和ble是匹配失敗的最好時間復雜度。

KMP演算法是一種改進的字元串匹配演算法,由D.E.Knuth與J.H.Morris和V.R.Pratt同時發現,因此人們稱它為克努特—莫里斯—普拉特演算法。KMP演算法主要分為兩個步驟:字元串的自我匹配,目標串和模式串之間的匹配。

看來網上很多的文章,感覺很多的都沒有說清楚,這里直接復制阮一峰的內容,講的很清晰
內容來自 http://www.ruanyifeng.com/blog/

首先,字元串"BBC ABCDAB ABCDABCDABDE"的第一個字元與搜索詞"ABCDABD"的第一個字元,進行比較。因為B與A不匹配,所以搜索詞後移一位。

因為B與A不匹配,搜索詞再往後移。

就這樣,直到字元串有一個字元,與搜索詞的第一個字元相同為止。

接著比較字元串和搜索詞的下一個字元,還是相同。

直到字元串有一個字元,與搜索詞對應的字元不相同為止。

這時,最自然的反應是,將搜索詞整個後移一位,再從頭逐個比較。這樣做雖然可行,但是效率很差,因為你要把"搜索位置"移到已經比較過的位置,重比一遍。

一個基本事實是,當空格與D不匹配時,你其實知道前面六個字元是"ABCDAB"。KMP演算法的想法是,設法利用這個已知信息,不要把"搜索位置"移回已經比較過的位置,繼續把它向後移,這樣就提高了效率。

怎麼做到這一點呢?可以針對搜索詞,算出一張《部分匹配表》(Partial Match Table)。這張表是如何產生的,後面再介紹,這里只要會用就可以了。

已知空格與D不匹配時,前面六個字元"ABCDAB"是匹配的。查表可知,最後一個匹配字元B對應的"部分匹配值"為2,因此按照下面的公式算出向後移動的位數:

因為 6 - 2 等於4,所以將搜索詞向後移動4位。

因為空格與C不匹配,搜索詞還要繼續往後移。這時,已匹配的字元數為2("AB"),對應的"部分匹配值"為0。所以,移動位數 = 2 - 0,結果為 2,於是將搜索詞向後移2位。

因為空格與A不匹配,繼續後移一位。

逐位比較,直到發現C與D不匹配。於是,移動位數 = 6 - 2,繼續將搜索詞向後移動4位。

逐位比較,直到搜索詞的最後一位,發現完全匹配,於是搜索完成。如果還要繼續搜索(即找出全部匹配),移動位數 = 7 - 0,再將搜索詞向後移動7位,這里就不再重復了。

下面介紹《部分匹配表》是如何產生的。

首先,要了解兩個概念:"前綴"和"後綴"。 "前綴"指除了最後一個字元以外,一個字元串的全部頭部組合;"後綴"指除了第一個字元以外,一個字元串的全部尾部組合。

"部分匹配值"就是"前綴"和"後綴"的最長的共有元素的長度。以"ABCDABD"為例,

"部分匹配"的實質是,有時候,字元串頭部和尾部會有重復。比如,"ABCDAB"之中有兩個"AB",那麼它的"部分匹配值"就是2("AB"的長度)。搜索詞移動的時候,第一個"AB"向後移動4位(字元串長度-部分匹配值),就可以來到第二個"AB"的位置。

BM(Boyer-Moore)演算法。它是一種非常高效的字元串匹配演算法,有實驗統計,它的性能是著名的KMP 演算法的 3 到 4 倍。

BM 演算法包含兩部分,分別是壞字元規則(bad character rule)和好後綴規則(good suffix shift)

未完待續

參考文章:
字元串匹配的Boyer-Moore演算法

7. 誰提供高效的字元串匹配演算法

數據結構的書上提供了幾種匹配的方法。模式匹配,KMP演算法等。KMP演算法的時間復雜度為O(m+n)。具體可以看數據結構的書。KMP演算法即:克努特-莫里斯-普拉特演算法

8. c語言一維數組的查找,輸出位置

這是模式匹配問題,下面我寫了一段簡單模式匹配~~~還有其他的高效的匹配演算法:如KMP匹配、二分匹配等,你可以研究一下~~~~

/*一般模式匹配 */
#include<stdio.h>
#include<string.h>
#define nMAX 1000

char a[nMAX] = {'a','s','d','f','g','h','j','k','l','\0'};
char b[nMAX] = {'j','k','r','\0'};

/*p1:主串 p2:模式串 */
int Find(char p1[],char p2[])
{
int i,len1,len2;
char *pp = p2; //模式串指針pp指向第一個字元
char *t = p1; //主串指針t指向下標i的字元
len1 = strlen(pp); //模式串長度
len2 = strlen(t); // 主串長度
i = 0; //記錄主串位置
while(*pp != '\0' && i <= len2 - len1) //pp未到串尾同時剩餘字元數超過模式串長,則循環
{
if(*pp++ != *t++)
{
pp = p2; //模式串回到第1個字元
t = p1+(++i); //主串回到第i+1位置
}
}
if(*pp == '\0') return i; //若pp已到串尾,則匹配成功
return -1; //否則失敗
}
int main()
{
int d;
// scanf("%s",a);
// scanf("%s",b);
d = Find(a,b);
if(d == -1) printf("b不在a中\n");
else printf("此子串(b)在該字元串(a)的起始位置為:%d\n",d);
return 0;
}

9. 雙目視覺的匹配演算法是不是有好幾種具體是哪幾種

與普通的圖像模板匹配不同的是,立體匹配是通過在兩幅或多幅存在視點差異、幾何畸變、灰度畸變、雜訊干擾的圖像對之間進行的,不存在任何標准模板進行匹配。立體匹配方法一般包含以下三個問題:(1)基元的選擇,即選擇適當的圖像特徵如點、直線、相位等作為匹配基元;(2)匹配的准則,將關於物理世界的某些固有特徵表示為匹配所必須遵循的若干規則,使匹配結果能真實反映景物的本來面目;(3)演算法結構,通過利用適當的數學方法設計能正確匹配所選擇基元的穩定演算法。

根據匹配基元的不同,立體視覺匹配演算法目前主要分為三大類,即區域匹配、相位匹配和特徵匹配:

基於區域灰度的匹配演算法是把一幅圖像(基準圖)中某一點的灰度鄰域作為模板,在另一幅圖像(待匹配圖)中搜索具有相同(或相似)灰度值分布的對應點鄰域,從而實現兩幅圖像的匹配。這類演算法的性能取決於度量演算法及搜索策略的選擇。另外,也必須考慮匹配窗口大小、形式的選擇,大窗口對於景物中存在的遮擋或圖像不光滑的情況會更多的出現誤匹配,小窗口則不具有足夠的灰度變化信息,不同的窗口形式對匹配信息也會有不同的影響。因此應該合理選取匹配區域的大小和形式來達到較好的匹配結果。

相位匹配是近二十年發展起來的一種匹配演算法,相位作為匹配基元,即認為圖像對中的對應點局部相位是一致的。最常用的相位匹配演算法有相位相關法和相位差——頻率法,雖然該方法是一種性能穩定、具有較強的抗輻射抗透視畸變能力、簡單高效、能得到稠密視差圖的特徵匹配方法。但是,當局部結構存在的假設不成立時,相位匹配演算法因帶通輸出信號的幅度太低而失去有效性,也就是通常提到的相位奇點問題,在相位奇點附近,相位信息對位置和頻率的變化極為敏感,因此用這些像素所確定的相位差異來衡量匹配誤差將導致極不可靠的結果。此外,相位匹配演算法的收斂范圍與帶通濾波器的波長有關,通常要考慮相位卷繞,在用相位差進行視差計算時,由於所採用的相位只是原信號某一帶通條件下的相位,故視差估計只能限制在某一限定范圍之內,隨視差范圍的增大,其精確性會有所下降。

基於特徵的圖像匹配方法是目前最常用的方法之一,由於它能夠將對整個圖像進行的各種分析轉化為對圖像特徵(特徵點、特徵曲線等)的分析的優點,從而大大減小了圖像處理過程的計算量,對灰度變化、圖像變形、噪音污染以及景物遮擋等都有較好的適應能力。

基於特徵的匹配方法是為使匹配過程滿足一定的抗噪能力且減少歧義性問題而提出來的。與基於區域的匹配方法不同,基於特徵的匹配方法是有選擇地匹配能表示景物自身特性的特徵,通過更多地強調空間景物的結構信息來解決匹配歧義性問題。這類方法將匹配的搜索范圍限制在一系列稀疏的特徵上。利用特徵間的距離作為度量手段,具有最小距離的特徵對就是最相近的特徵對,也就是匹配對。特徵間的距離度量有最大最小距離、歐氏距離等。

特徵點匹配演算法嚴格意義上可以分成特徵提取、特徵匹配和消除不良匹配點三步。特徵匹配不直接依賴於灰度,具有較強的抗干擾性。該類方法首先從待匹配的圖像中提取特徵,用相似性度量和一些約束條件確定幾何變換,最後將該變換作用於待匹配圖像。匹配中常用的特徵基元有角點、邊緣、輪廓、直線、顏色、紋理等。同時,特徵匹配演算法也同樣地存在著一些不足,主要表現為:

(l)特徵在圖像中的稀疏性決定了特徵匹配只能得到稀疏的視差場,要獲得密集的視差場必須通過使用插值的過程,插值過程通常較為復雜。

(2)特徵的提取和定位的准確與否直接影響特徵匹配結果的精確度。

(3)由於其應用場合的局限性,特徵匹配往往適用於具有特徵信息顯著的環境中,在缺少顯著主導特徵環境中該方法有很大困難。

總之,特徵匹配基元包含了演算法編程上的靈活性以及令人滿意的統計特性。演算法的許多約束條件均能清楚地應用於數據結構,而數據結構的規則性使得特徵匹配非常適用於硬體設計。例如,基於線段的特徵匹配演算法將場景模型描繪成相互聯結的邊緣線段,而不是區域匹配中的平面模型,因此能很好地處理一些幾何畸變問題,對對比度和明顯的光照變化等相對穩定。特徵匹配由於不直接依賴於灰度,計算量小,比基於區域的匹配演算法速度快的多。且由於邊緣特徵往往出現在視差不連續的區域,特徵匹配較易處理立體視覺匹配中的視差不連續問題。

10. bm是什麼意思

BM是一種匹配演算法。

BM演算法被認為是亞線性串匹配演算法,它在最壞情況下找到模式所有出現的時間復雜度為O(mn),在最好情況下執行匹配找到模式所有出現的時間復雜度為O(n/m)。

BM演算法主要思想描述如下:

模式字元串的匹配順序是從右向左:

1、首先將P和T對齊,即p和t對齊;

2、然後匹配從模式字元串P的最右端字元開始,即判斷p[m]和t[m]是否匹配:

如果匹配成功,則向左移動判斷p[m-1]和t[m-1]是否匹配,如此循環下去;如果匹配不成功,則進行字元串滑移。

BM演算法的原理:

不同於樸素模式(brute-force search)的逐個字元對比,Boyer-Moore充分使用預處理 P的信息來盡可能跳過更多的字元。通常,我們比較一個字元串都是從首字母開始,逐個比較下去。一旦發現有不同的字元,就需要從頭開始進行下一次比較。

這樣,就需要將字串中的所有字元一一比較。Boyer-Moore演算法的關鍵在於,當 P的最後一個字元被比較完成後,我們可以決定跳過一個或更多個字元。如果最後一個字元不匹配,那麼就沒必要繼續比較前一個字元。

如果最後一個字元未在 P中出現,那麼我們可以直接跳過 T的n個字元,比較接下來的n個字元,n為 P的長度(見定義)。

如果最後一個字元出現在 P中,那麼跳過的字元數需要進行計算(也就是將 P整體往後移),然後繼續前面的步驟來比較。通過這種字元的移動方式來代替逐個比較是這個演算法如此高效的關鍵所在。

閱讀全文

與高效匹配演算法相關的資料

熱點內容
卡爾曼濾波演算法書籍 瀏覽:763
安卓手機怎麼用愛思助手傳文件進蘋果手機上 瀏覽:841
安卓怎麼下載60秒生存 瀏覽:800
外向式文件夾 瀏覽:233
dospdf 瀏覽:428
怎麼修改騰訊雲伺服器ip 瀏覽:385
pdftoeps 瀏覽:490
為什麼鴻蒙那麼像安卓 瀏覽:733
安卓手機怎麼拍自媒體視頻 瀏覽:183
單片機各個中斷的初始化 瀏覽:721
python怎麼集合元素 瀏覽:477
python逐條解讀 瀏覽:829
基於單片機的濕度控制 瀏覽:496
ios如何使用安卓的帳號 瀏覽:880
程序員公園采訪 瀏覽:809
程序員實戰教程要多長時間 瀏覽:972
企業數據加密技巧 瀏覽:132
租雲伺服器開發 瀏覽:810
程序員告白媽媽不同意 瀏覽:333
攻城掠地怎麼查看伺服器 瀏覽:600