В прикладной математике перестановка с обратным битом — это перестановка последовательности элементов , где — степень двойки . Она определяется индексацией элементов последовательности числами от до , представлением каждого из этих чисел его двоичным представлением (дополненным до длины, равной ), и сопоставлением каждого элемента с элементом , представление которого имеет те же биты в обратном порядке.
Повторение одной и той же перестановки дважды возвращает элементы к исходному порядку, поэтому перестановка с обратным битом является инволюцией .
Эта перестановка может быть применена к любой последовательности за линейное время , выполняя только простые вычисления индекса. Она имеет приложения в генерации последовательностей с низким расхождением и в оценке быстрых преобразований Фурье .
Рассмотрим последовательность из восьми букв abcdefgh . Их индексами являются двоичные числа 000, 001, 010, 011, 100, 101, 110 и 111, которые при перестановке становятся 000, 100, 010, 110, 001, 101, 011 и 111. Таким образом, буква a в позиции 000 отображается в ту же позицию (000), буква b в позиции 001 отображается в пятую позицию (ту, которая имеет номер 100) и т. д., давая новую последовательность aecgbfdh . Повторение той же перестановки в этой новой последовательности возвращает к исходной последовательности.
Записывая индексные числа в десятичной системе счисления (но, как и выше, начиная с позиции 0, а не с более традиционного начала 1 для перестановки), перестановки с обратным порядком битов для элементов выглядят следующим образом: [1]
Каждая перестановка в этой последовательности может быть сгенерирована путем конкатенации двух последовательностей чисел: предыдущей перестановки с удвоенными значениями и той же последовательности с каждым значением, увеличенным на единицу. Таким образом, например, удвоение перестановки длины 4 0 2 1 3 дает 0 4 2 6 , добавление единицы дает 1 5 3 7 , а конкатенация этих двух последовательностей дает перестановку длины 8 0 4 2 6 1 5 3 7 . [2]
Обобщение для представлений с основанием , для и для , является перестановкой с обратным знаком , в которой базовые цифры индекса каждого элемента меняются местами для получения переставленного индекса. Та же идея может быть обобщена и для смешанных систем счисления с основанием. В таких случаях перестановка с обратным знаком должна одновременно менять местами цифры каждого элемента и основания числовой системы, так что каждая перевернутая цифра остается в пределах диапазона, определяемого ее основанием. [3]
Перестановки, которые обобщают перестановку битов путем изменения последовательности смежных блоков битов в двоичных представлениях их индексов, могут использоваться для чередования двух последовательностей данных одинаковой длины на месте. [4]
Существует два расширения перестановки бит-реверсии для последовательностей произвольной длины. Эти расширения совпадают с перестановкой бит для последовательностей, длина которых является степенью 2, и их цель — разделить смежные элементы в последовательности для эффективной работы алгоритма Качмажа . Первое из этих расширений, называемое эффективным упорядочением , [5] работает с составными числами и основано на разложении числа на его простые компоненты.
Второе расширение, называемое EBR (extended bit-reversal), по духу похоже на bit-reversal. При наличии массива размером , EBR заполняет массив перестановкой чисел в диапазоне за линейное время. Последовательные числа разделяются в перестановке по крайней мере позициями. [6]
Инверсия бит наиболее важна для алгоритмов Кули-Тьюки FFT с основанием 2 , где рекурсивные этапы алгоритма, работающие на месте , подразумевают инверсию бит входов или выходов. Аналогично, инверсии цифр смешанного основания возникают в БПФ Кули-Тьюки со смешанным основанием. [7]
Перестановка с обратным порядком битов также использовалась для разработки нижних границ в распределенных вычислениях. [8]
Последовательность Ван дер Корпута , последовательность чисел с низким расхождением в единичном интервале , формируется путем переинтерпретации индексов перестановки с обратным битом как двоичных представлений с фиксированной точкой двоично -рациональных чисел .
Перестановки с обратным битом часто используются для поиска нижних границ динамических структур данных . Например, при определенных допущениях стоимость поиска целых чисел между и включительно в любом бинарном дереве поиска, содержащем эти значения, равна , когда эти числа запрашиваются в обратном порядке битов. Эта граница применима даже к таким деревьям, как раскидистые деревья , которым разрешено переставлять свои узлы между доступами. [9]
В основном из-за важности алгоритмов быстрого преобразования Фурье были разработаны многочисленные эффективные алгоритмы для применения перестановки битов с обратным порядком следования к последовательности. [2]
Поскольку перестановка с инверсией битов является инволюцией, ее можно легко выполнить на месте (без копирования данных в другой массив) путем обмена пар элементов. В машине с произвольным доступом , обычно используемой в анализе алгоритмов, простой алгоритм, который сканирует индексы в порядке ввода и меняет местами всякий раз, когда сканирование встречает индекс, инверсия которого большее число, будет выполнять линейное число перемещений данных. [10] Однако вычисление инверсии каждого индекса может занять непостоянное число шагов. Альтернативные алгоритмы могут выполнять перестановку с инверсией битов за линейное время, используя только простые вычисления индексов. [11] Поскольку перестановки с обратным битом могут повторяться несколько раз как часть вычисления, может быть полезно отделить шаги алгоритма, которые вычисляют индексные данные, используемые для представления перестановки (например, с помощью метода удвоения и конкатенации), от шагов, которые используют результаты этого вычисления для перестановки данных (например, путем сканирования индексов данных по порядку и выполнения обмена всякий раз, когда переставленное местоположение больше текущего индекса, или с помощью более сложных операций векторного рассеивания-сбора ). [2]
Другим соображением, которое еще более важно для производительности этих алгоритмов, является влияние иерархии памяти на время выполнения. Из-за этого эффекта более сложные алгоритмы, которые учитывают блочную структуру памяти, могут быть быстрее, чем это наивное сканирование. [2] [10] Альтернативой этим методам является специальное компьютерное оборудование, которое позволяет получать доступ к памяти как в обычном, так и в обратном порядке. [12]
Улучшение производительности инверсий битов как в однопроцессорных, так и в многопроцессорных системах получило серьезное внимание в области высокопроизводительных вычислений. Поскольку разработка алгоритмов с учетом архитектуры может наилучшим образом использовать аппаратные и программные ресурсы системы, включая кэши, TLB и многоядерные процессоры, значительно ускоряя вычисления. [13]