web-dev-qa-db-ja.com

2つのバイナリ文字列間のハミング距離が機能しない

this サイトでハミング距離を計算するための興味深いアルゴリズムを見つけました:

def hamming2(x,y):
    """Calculate the Hamming distance between two bit strings"""
    assert len(x) == len(y)
    count,z = 0,x^y
    while z:
        count += 1
        z &= z-1 # magic!
    return count

重要なのは、このアルゴリズムはビット文字列でのみ機能し、バイナリであるが文字列形式の2つの文字列を比較しようとしているということです。

'100010'
'101000'

どうすればこのアルゴリズムでそれらを機能させることができますか?

6
Hyperion

それを実装します:

def hamming2(s1, s2):
    """Calculate the Hamming distance between two bit strings"""
    assert len(s1) == len(s2)
    return sum(c1 != c2 for c1, c2 in Zip(s1, s2))

そしてそれをテストします:

assert hamming2("1010", "1111") == 2
assert hamming2("1111", "0000") == 4
assert hamming2("1111", "1111") == 0
26
dlask

元のアルゴリズムを使用する場合は、ビット演算子を使用できるように文字列を整数に変換する必要があります。

def hamming2(x_str, y_str):
    """Calculate the Hamming distance between two bit strings"""
    assert len(x_str) == len(y_str)
    x, y = int(x_str, 2), int(y_str, 2)  # '2' specifies we are reading a binary number
    count, z = 0, x ^ y
    while z:
        count += 1
        z &= z - 1  # magic!
    return count

次に、次のように呼び出すことができます。

print(hamming2('100010', '101000'))

このアルゴリズムは目新しいものとしてはかっこいいですが、文字列に変換する必要があると、速度の利点が失われる可能性があります。 @dlaskが投稿した答えははるかに簡潔です。

5
Adam Hammes

これは私がハミング距離を計算するために使用するものです。
同じ長さの文字列間の差異の数をカウントします。

def hamdist(str1, str2):
    diffs = 0
    for ch1, ch2 in Zip(str1, str2):
        if ch1 != ch2:
            diffs += 1
    return diffs
5
Panos Kal.

これはよく説明できると思いますThe Hamming distance2つの文字列の間

def hammingDist(s1, s2):
    bytesS1=bytes(s1, encoding="ascii")
    bytesS2=bytes(s2, encoding="ascii")
    diff=0
    for i in range(min(len(bytesS1),len(bytesS2))):
        if(bytesS1[i]^bytesS2[i]!=0):
            diff+=1
    return(diff)
0