Я искал алгоритм подсчета битов в Интернете и нашел эту страницу , которая имеет несколько хороших алгоритмов.Моя любимая есть однострочная функция, которая утверждает, что работает для Python 2.6 / 3.0:
return sum( b == '1' for b in bin(word1 ^ word2)[2:] )
У меня нет Python, поэтому я не могу проверить, но если эта не работаетпопробуйте один из других.Ключ состоит в том, чтобы посчитать количество единиц в битовой XOR ваших двух слов, потому что для каждой разницы будет 1.
Вы вычисляете Расстояние Хэмминга , верно?
РЕДАКТИРОВАТЬ: я пытаюсь понять ваш алгоритм, и то, как вы манипулируете входами, похоже, что они на самом деле массивы, а не просто двоичные числа.Поэтому я ожидаю, что ваш код будет выглядеть примерно так:
return sum( a != b for a, b in zip(word1, word2) )
EDIT2: я понял, что делает ваш код, и это совсем не расстояние Хемминга!На самом деле это расстояние Левенштейна , которое подсчитывает, сколько добавлений, удалений или подстановок необходимо, чтобы превратить одну строку в другую (расстояние Хэмминга учитывает только подстановки, поэтому подходит только для строк цифр одинаковой длины),Глядя на страницу Википедии, ваш алгоритм является более или менее прямым портом псевдокода, который у них там есть.Как они указывают, временная и пространственная сложность сравнения строк длиной m и n составляет O (mn) , что довольно плохо.У них есть несколько предложений по оптимизации в зависимости от ваших потребностей, но я не знаю, для чего вы используете эту функцию, поэтому я не могу сказать, что будет лучше для вас.Если расстояние Хемминга достаточно для вас, приведенного выше кода должно хватить (сложность по времени O (n) ), но он дает разные результаты для некоторых наборов строк, даже если они имеют одинаковую длину, например'0101010101' и '1010101010', которые имеют расстояние Хемминга 10 (перевернуть все биты) и расстояние Левенштейна 2 (удалите первые 0 и добавьте их в конце)