用C語言實現計算兩個字符串的漢明距離


發表時間: 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

查看源代碼打印幫助it

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

小結

漢明距離是以理查德·衛斯里·漢明的名字命名的,有興趣的朋友能夠了解下這位先輩。除了漢明距離,還有漢明重量、漢明碼等理論在信息論、編碼理論、密碼學等領域都有應用。

相關文章
相關標籤/搜索