Топ контрибуторов
loading
loading
Знаете ли Вы, что

Список полученных сертификатов находится на странице Вашего профиля. Сертификаты можно распечатать или разместить на Вашем сайте.

Лента обновлений
ссылка Sep 19 23:47
Комментарий от panalex79:
Спасибо, Вы правы
ссылка Sep 19 23:11
Комментарий от ksp107:
Такое сообщение об ошибке возможно если I1 или/и I2 не об...
ссылка Sep 19 15:31
Комментарий от panalex79:
public class C implements I2, I1{}
подчеркивает I2, ...
ссылка Sep 19 15:29
Комментарий от panalex79:
IDEA с таким написания кода не соглашается и выдает ош...
ссылка Sep 15 05:04
Комментарий от OlehD:
какие книжки можете посоветовать почитать о сервлетах?
Статистика

Тестов: 153, вопросов: 8596. Пройдено: 487841 / 2378461.

Задачи / Поиск уникального значения

Автор: k06a  к списку      

Вопрос
Имеется массив натуральных чисел. Каждое из чисел присутствует в массиве ровно два раза и только одно из чисел не имеет пары. Необходимо предложить алгоритм, чтобы за минимальное число проходов по массиву определял число не имеющее пары.

Необходимо также предложить алгоритм, если уникальных числа два.
Ответ
Первая задача решается за один проход по массиву.
Необходимо подсчитать XOR-сумму всех чисел массива.
Таким образом пары чисел "уничтожат" друг друга (A xor A = 0).

Для решения второй задачи необходимо разбить диапазон возможных значений чисел на несколько одинаковых по размеру поддиапазонов, например строго пополам. За один проход по массиву нужно вычислять XOR-суммы в поддиапазонах по-отдельности. Далее необходимо делить на поддиапазоны, объединение тех диапазонов, где XOR-сумма получилась не ноль. Как только при подсчёте XOR-сумм найдутся 2 диапазона с ненулевой XOR-суммой, это и будут искомые значение.

Например, для однобайтовых чисел и двух поддиапазонов: после первого прохода будут посчитанны XOR-суммы чисел диапазонов 0-127 и 128-255. Таким образом, если числа были в разных диапазонах, то обе XOR-суммы окажутся ненулевыми.

Для увеличения скорости поиска нужно использовать большее число поддиапазонов. Число проходов равно O(logA(B)), где A - число поддиапазонов (ячеек памяти для хранения XOR-сумм), а B - разрядность чисел в массиве.

Если Вам понравился вопрос, проголосуйте за него

Голосов: 20  loading...
k06a   vasyura   lamed33   art   xornotxor   kaktus312   doubt   SirSlava   SkyFreeLancer   lazik234   krazh   zZoMROT   Engineer9   KvanGee   Deadly   azarov   atomix   worm2   Ingaf   Ibanez