漢明距離是以理查德·衛斯里·漢明的名字命名的。在信息論中,兩個等長字符串之間的漢明距離是兩個字符串對應位置的不同字符的個數。換句話說,它就是將一個字符串變換成另外一個字符串所需要替換的字符個數。例如:
1011101 與 1001001 之間的漢明距離是 2。
2143896 與 2233796 之間的漢明距離是 3。
"toned" 與 "roses" 之間的漢明距離是 3。
例如:(00)與(01)的距離是1,(110)和(101)的距離是2。在一個碼組集合中,任意兩個編碼之間漢明距離的最小值稱為這個碼組的最小漢明距離。最小漢明距離越大,碼組越具有抗干擾能力。
計算漢明距離的算法
思路:
01.將兩個給定的數進行 異或(^)運算后保存在變量a,漢明距離就是a的二進制中1的個數
02.當a不為0時,和0x01進行 按位與(&)運算,如果結果為1,則統計變量加一
03.將a右移一位,重復第02步
function hamDist($s1, $s2){ $len1 = strlen($s1); $len2 = strlen($s2); if($len1 != $len2){ return false; } $dist = 0; for($i = 0; $i < $len1; $i++){ if($s1[$i] != $s2[$i]){ $dist++; } } return $dist; } $s1 = "abcde"; $s2 = "acdeb"; echo hamDist($s1, $s2);// 輸出4
/** * 計算編輯距離(Levenshtein Distance) * * @param string $s1 * @param string $s2 */ function levDist($s1, $s2){ $len1 = strlen($s1); $len2 = strlen($s2); if($len1 == 0){ return $len2; } if($len2 == 0){ return $len1; } for($i = 0; $i <= $len1; $i++){ $matrix[$i][0] = 0; } for($j = 0; $j <= $len2; $j++){ $matrix[0][$j] = 0; } for($i = 1; $i <= $len1; $i++){ $ch1 = $s1[$i - 1]; for($j = 1; $j <= $len2; $j++){ $ch2 = $s2[$j - 1]; $temp = $ch1 == $ch2 ? 0 : 1; $arr = array( $matrix[$i - 1][$j] + 1, $matrix[$i][$j - 1] + 1, $matrix[$i - 1][$j - 1] + $temp ); $matrix[$i][$j] = min($arr); } } return $matrix[$len1][$len2]; }
PHP的相似度計算函數:levenshtein 也用到該算法的實現
levenshtein(string1,string2,insert,replace,delete)
參數
- string1 必需。要對比的第一個字符串。
- string2 必需。要對比的第二個字符串。
- insert 可選。插入一個字符的代價。默認是 1。
- replace 可選。替換一個字符的代價。默認是 1。
- delete 可選。刪除一個字符的代價。默認是 1。