Быстрое расстояние Хэмминга между двумя наборами битов

Я пишу программу, которая в значительной степени полагается на (1) доступ к одному биту и (2) вычисления расстояния Хэмминга между двумя наборами битов A и B (то есть количество битов, которые различаются между A и B ). Наборы битов довольно большие, от 10К до 1М бит, и у меня их много. Поскольку во время компиляции узнать размеры набора битов невозможно, я использую vector , но планирую в ближайшее время перейти на boost :: dynamic_bitset .

Ниже приведены мои вопросы:

(1) Есть ли идеи о том, какие реализации имеют самое быстрое время доступа к одному биту?

(2) Для вычисления расстояния Хэмминга наивный подход состоит в том, чтобы перебрать отдельные биты в цикле и подсчитать различия между двумя битовыми наборами. Но я чувствую, что было бы намного быстрее перебрать байты вместо битов, выполнить R = byteA XOR byteB и посмотреть в таблице с 255 записями, какое «локальное» расстояние связано с R. Другим решением было бы сохранить Матрица 255 x 255 и прямой доступ без операции к расстоянию между байтами А и В. Итак, мой вопрос: есть идеи, как реализовать это из std :: vector или boost :: dynamic_bitset? Другими словами, знаете ли вы, есть ли способ получить доступ к массиву байтов или мне нужно все перекодировать с нуля?

5
задан Lightness Races with Monica 21 October 2011 в 15:58
поделиться