Вы можете сделать это в линейном времени и в постоянном пространстве.
Каждый бит в a
будет сравниваться с |b| - |a| + 1
битами в b
, и каждое несовпадение добавит 1 к сумме всех Расстояния Хэмминга.
Кроме того, для каждого бита a
нам не нужно знать всю битовую последовательность, с которой она будет сравниваться, начиная с b
. Нам нужно только знать, сколько нулей и сколько их. По мере продвижения вперед на один бит в a
соответствующий диапазон сдвигается вперед на один бит в b
, и мы можем легко обновить эти значения в постоянное время.
Вот реализация в python:
def HammingSum(a,b):
# compare initial range in b to first bit in a
range0 = len(b)-len(a)+1
numZeros = 0
numOnes = 0
for i in range(range0):
if b[i]=='0':
numZeros += 1
else:
numOnes += 1
total = numOnes if a[0]=='0' else numZeros
#adjust the range as we compare to the other bits
for i in range(len(b)-range0):
#count the bit we're adding to the end of the range
if b[range0+i]=='0':
numZeros += 1
else:
numOnes += 1
#uncount the bit we remove from the start of the range
if b[i]=='0':
numZeros -= 1
else:
numOnes -= 1
#compare range with bit in a
total += numOnes if a[i+1]=='0' else numZeros
return total