Как решить проблему расстояния Хэмминга в C++, вопрос интервью Google

Как решить проблему расстояния Хэмминга в C++, вопрос интервью Google

7 марта 2022 г.

В этом уроке мы найдем количество позиций, в которых биты различны для данного ввода.


Введение


В этом вопросе мы найдем количество позиций, в которых соответствующие биты различны.


Постановка задачи


По заданным целым числам x, y находит позиции, в которых соответствующие биты различны.


Пример 01:


```java


Вход: х = 1, у = 8


Выход: 2


Объяснение:


1 (0 0 0 1)


8 (1 0 0 0)


↑ ↑


Пример 02:


```java


Вход: х = 12, у = 15


Выход: 2


Объяснение:


12 (1 1 0 0)


15 (1 1 1 1)


Решение


Мы решаем это с помощью операции сдвига, а затем переходим к решению более оптимальным способом.


Битовый сдвиг


Этот подход лучше, так как требует временной сложности O(1). Мы сдвигаем биты влево или вправо, а затем проверяем, является ли бит единицей или нет.


Алгоритм


Мы используем операцию сдвига вправо, где каждый бит должен быть сдвинут в крайнее правое положение.


После сдвига мы используем либо % по модулю (т. е. i % 2), либо операцию & (т. е. i & 1).


Код


Подсказка: вы можете проверить, не равно ли число 0, с помощью оператора ^.


нажмите лайк


include <иопоток>


использование пространства имен std;


пустота hammingDistance (int a, int b) {


интервал xorVal = а ^ б;


расстояние = 0;


в то время как (xorVal ^ 0) {


если(xorVal% 2 == 1){


расстояние += 1;


xorVal >>= 1;


cout << "Расстояние Хэмминга между двумя целыми числами равно" << Distance << endl;


интервал основной () {


инт а = 1;


интервал б = 8;


расстояние Хэмминга(а, б);


вернуть 0;


Анализ сложности


Временная сложность: O(1). Для «32-битного» целого числа алгоритм потребовал бы не более 32 итераций.


Пространственная сложность: O(1). Память постоянна независимо от ввода.


Алгоритм Брайана Кернигана


В приведенном выше подходе мы сдвигали каждый бит один за другим. Итак, есть ли лучший подход к нахождению расстояния Хэмминга? да.


Алгоритм


Когда мы выполняем & битовую операцию между числами n и (n-1), самый правый бит единицы в исходном числе n будет очищен.


нажмите лайк


п = 40 => 00101000


п - 1 = 39 => 00100111


(n & (n - 1)) = 32 => 00100000


Код


Основываясь на приведенной выше идее, мы можем посчитать расстояние за 2 итерации, а не за все итерации смещения, которые мы делали ранее. Давайте посмотрим код в действии.


нажмите лайк


include <иопоток>


использование пространства имен std;


int hammingDistance(int a, int b){


интервал xorVal = а ^ б;


расстояние = 0;


в то время как (xorVal != 0) {


расстояние += 1;


xorVal &= ( xorVal - 1); // равно xorVal = xorVal & ( xorVal - 1);


обратное расстояние;


интервал основной () {


инт а = 1;


интервал б = 8;


cout << "Расстояние Хэмминга между двумя целыми числами равно" << hammingDistance(a, b);


вернуть 0;


Анализ сложности


Временная сложность: O(1). Размер ввода «целого числа» фиксирован, у нас постоянная временная сложность.


Пространственная сложность: O(1). Память постоянна независимо от ввода.


  • Впервые опубликовано [здесь] (https://dev.to/ggorantala/hamming-distance-kcm)*


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE