發表時間: 2013年1月17日 | 做者: 陳杰斌 | 所屬分類: C語言 | 評論: 0 | 瀏覽: 1376java
在龐果網上看到計算兩個字符串的漢明距離問題,要求用java實現。本身不熟悉java,就想着用c嘗試下。漢明距離就是兩個等長字符串對應位置的不一樣字符的個數。例如:app
「toned」和」roses」的漢明距離是3。測試
1011101和1001001的漢明距離是2。編碼
2173896和2233796的漢明距離是3。spa
c語言的實現代碼:code
1 |
int hamdist( char *a, char *b) |
2 |
{ |
3 |
int dist = 0; |
4 |
5 |
while (*a && *b) { |
6 |
dist += (*a != *b) ? 1 : 0; |
7 |
*a++; |
8 |
*b++; |
9 |
} |
10 |
11 |
return dist; |
12 |
} |
這裏沒有考慮兩個字符串長度不一致的狀況,若是長度不一致則涉及到編輯距離,關於編輯距離維基百科上有相關說明,這裏就不介紹了。該方法的執行時間由字符串長度決定,時間複雜度是O(n)。用兩個字符串來測試一下:字符串
1 |
#include <stdio.h> |
2 |
3 |
int main() |
4 |
{ |
5 |
char *a, *b; |
6 |
a = "00001001000001110000000000100001" ; |
7 |
b = "00101000000101110000010000100001" ; |
8 |
9 |
int dist = hamdist(a, b); |
10 |
//輸出4 |
11 |
printf ( "%d\n" , dist); |
12 |
13 |
return 0; |
14 |
} |
另外若是要計算兩個整數的二進制的漢明距離,可使用以下方法,效率更高。get
1 |
int hamdist( int a, int b) |
2 |
{ |
3 |
int dist = 0, val = a ^ b; |
4 |
printf ( "%d\n" , val); |
5 |
while (val) { |
6 |
++dist; |
7 |
val &= val - 1; |
8 |
} |
9 |
10 |
return dist; |
11 |
} |
這邊while循環的次數其實就是漢明距離。io
小結
漢明距離是以理查德·衛斯里·漢明的名字命名的,有興趣的朋友能夠了解下這位先輩。除了漢明距離,還有漢明重量、漢明碼等理論在信息論、編碼理論、密碼學等領域都有應用。