真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

levenshtein函數(shù)怎么在PHP中使用-創(chuàng)新互聯(lián)

levenshtein函數(shù)怎么在PHP中使用?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

十年的金華網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都全網(wǎng)營銷的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整金華建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“金華網(wǎng)站設(shè)計”,“金華網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。

 levenshtein() 函數(shù)的說明:

levenshtein() 函數(shù)返回兩個字符串之間的 Levenshtein 距離。

Levenshtein 距離,又稱編輯距離,指的是兩個字符串之間,由一個轉(zhuǎn)換成另一個所需的最少編輯操作次數(shù)。許可的編輯操作包括將一個字符替換成另一個字符,插入一個字符,刪除一個字符。

例如把 kitten 轉(zhuǎn)換為 sitting:

sitten (k→s)
sittin (e→i)
sitting (→g)levenshtein() 函數(shù)給每個操作(替換、插入和刪除)相同的權(quán)重。不過,您可以通過設(shè)置可選的 insert、replace、delete 參數(shù),來定義每個操作的代價。

語法:

levenshtein(string1,string2,insert,replace,delete)

參數(shù) 描述

string1 必需。要對比的第一個字符串。
string2 必需。要對比的第二個字符串。
insert 可選。插入一個字符的代價。默認(rèn)是 1。
replace 可選。替換一個字符的代價。默認(rèn)是 1。
delete 可選。刪除一個字符的代價。默認(rèn)是 1。
提示和注釋

如果其中一個字符串超過 255 個字符,levenshtein() 函數(shù)返回 -1。
levenshtein() 函數(shù)對大小寫不敏感。
levenshtein() 函數(shù)比 similar_text() 函數(shù)更快。不過,similar_text() 函數(shù)提供需要更少修改的更精確的結(jié)果。
例子


復(fù)制代碼 代碼如下:


    echo levenshtein("Hello World","ello World");
    echo "
";
    echo levenshtein("Hello World","ello World",10,20,30);
    ?>


輸出: 1 30

源碼分析
levenshtein() 屬于標(biāo)準(zhǔn)函數(shù),在/ext/standard/目錄下有專門針對此函數(shù)實現(xiàn)的文件:levenshtein.c。

levenshtein()會根據(jù)參數(shù)個數(shù)選擇實現(xiàn)方式,針對參數(shù)為2和參數(shù)為5的情況,都會調(diào)用 reference_levdist() 函數(shù)計算距離。其不同在于對后三個參數(shù),參數(shù)為2時,使用默認(rèn)值1。

并且在實現(xiàn)源碼中我們發(fā)現(xiàn)了一個在文檔中沒有說明的情況: levenshtein() 函數(shù)還可以傳遞三個參數(shù),其最終會調(diào)用 custom_levdist() 函數(shù)。它將第三個參數(shù)作為自定義函數(shù)的實現(xiàn),其調(diào)用示例如下:


復(fù)制代碼 代碼如下:


echo levenshtein("Hello World","ello World", 'strsub');


執(zhí)行會報Warning: The general Levenshtein support is not there yet。這是因為現(xiàn)在這個方法還沒有實現(xiàn),僅僅是放了一個坑在那。

reference_levdist() 函數(shù)的實現(xiàn)算法是一個經(jīng)典的DP問題。

給定兩個字符串x和y,求最少的修改次數(shù)將x變成y。修改的規(guī)則只能是如下三種之一:刪除、插入、改變。
用a[i][j]表示把x的前i個字符變成y的前j個字符所需的最少操作次數(shù),則狀態(tài)轉(zhuǎn)移方程為:


復(fù)制代碼 代碼如下:


當(dāng)x[i]==y[j]時:a[i][j]  = min(a[i-1][j-1], a[i-1][j]+1, a[i][j-1]+1);
當(dāng)x[i]!=y[j]時:a[i][j] =  min(a[i-1][j-1], a[i-1][j], a[i][j-1])+1;


在用狀態(tài)轉(zhuǎn)移方程前,我們需要初始化(n+1)(m+1)的矩陣d,并讓第一行和列的值從0開始增長。 掃描兩字符串(nm級的),對比字符,使用狀態(tài)轉(zhuǎn)移方程,最終$a[$l1][$l2]為其結(jié)果。

簡單實現(xiàn)過程如下:


復(fù)制代碼 代碼如下:


    $s1 = "abcdd";
    $l1 = strlen($s1);
    $s2 = "aabbd";
    $l2 = strlen($s2);

 
    for ($i = 0; $i < $l1; $i++) {
        $a[0][$i + 1] = $i + 1;
    }
    for ($i = 0; $i < $l2; $i++) {
        $a[$i + 1][0] = $i + 1;
    }

    for ($i = 0; $i < $l2; $i++) {
        for ($j = 0; $j < $l1; $j++) {
            if ($s2[$i] == $s1[$j]) {
                $a[$i + 1][$j + 1] = min($a[$i][$j], $a[$i][$j + 1] + 1, $a[$i + 1][$j] + 1);
            }else{
                $a[$i + 1][$j + 1] = min($a[$i][$j], $a[$i][$j + 1], $a[$i + 1][$j]) + 1;
            }
        }
    }

    echo $a[$l1][$l2];
    echo "n";
    echo levenshtein($s1, $s2);


在PHP的實現(xiàn)中,實現(xiàn)者在注釋中很清楚的標(biāo)明:此函數(shù)僅優(yōu)化了內(nèi)存使用,而沒有考慮速度,從其實現(xiàn)算法看,時間復(fù)雜度為O(m×n)。其優(yōu)化點在于將上面的狀態(tài)轉(zhuǎn)移方程中的二維數(shù)組變成了兩個一組數(shù)組。簡單實現(xiàn)如下:


復(fù)制代碼 代碼如下:


    $s1 = "abcjfdkslfdd";
    $l1 = strlen($s1);
    $s2 = "aab84093840932bd";
    $l2 = strlen($s2);

    $dis = 0;
    for ($i = 0; $i <= $l2; $i++){
        $p1[$i] = $i;
    }

    for ($i = 0; $i < $l1; $i++){
        $p2[0] = $p1[0] + 1;

        for ($j = 0; $j < $l2; $j++){
            if ($s1[$i] == $s2[$j]){
                $dis = min($p1[$j], $p1[$j + 1] + 1, $p2[$j] + 1);
            }else{
                $dis = min($p1[$j] + 1, $p1[$j + 1] + 1, $p2[$j] + 1);  // 注意這里最后一個參數(shù)為$p2 
            }
            $p2[$j + 1] = $dis;
        }
        $tmp = $p1;
        $p1 = $p2;
        $p2 = $tmp; 
    }

    echo "n";
    echo $p1[$l2];
    echo "n";
    echo levenshtein($s1, $s2);



如上為PHP內(nèi)核開發(fā)者對前面經(jīng)典DP的優(yōu)化,其優(yōu)化點在于不停的復(fù)用兩個一維數(shù)組,一個記錄上次的結(jié)果,一個記錄這一次的結(jié)果。如果按照PHP的參數(shù),分別給三個操作賦值不同的值,在上面的算法中將對應(yīng)的1變成操作對應(yīng)的值就可以了。 min函數(shù)的第一個參數(shù)對應(yīng)的是修改,第二個參數(shù)對應(yīng)的是刪除源碼天空,第三個參數(shù)對應(yīng)的是添加。

Levenshtein distance說明
Levenshtein distance最先是由俄國科學(xué)家Vladimir Levenshtein在1965年發(fā)明,用他的名字命名。不會拼讀,可以叫它edit distance(編輯距離)。Levenshtein distance可以用來:
Spell checking(拼寫檢查)
Speech recognition(語句識別)
DNA analysis(DNA分析)
Plagiarism detection(抄襲檢測) LD用mn的矩陣存儲距離值。

看完上述內(nèi)容,你們掌握levenshtein函數(shù)怎么在PHP中使用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


本文標(biāo)題:levenshtein函數(shù)怎么在PHP中使用-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://weahome.cn/article/dspicg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部