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

Вы можете подписаться на RSS ленту новых тестов сервиса Quizful, в том числе и отдельно по каждой категории

Лента обновлений
ссылка Aug 23 22:40
Комментарий от qweky:
Жесткий тест, даже в oracle тысты по началу, хоть и на анг...
ссылка Aug 23 12:03
Комментарий от necromancer:
Отличный тест для подготовки к собеседованию на джун...
ссылка Aug 23 07:59
Комментарий от BUBLIC:
Отличная статья
ссылка Aug 22 22:14
Комментарий от adzero:
Для меня тоже открытие, я всегда их стороной обходил, а т...
ссылка Aug 22 22:07
Комментарий от adzero:
Сколько раз втык получал за s = "" + l; но тем не менее э...
Статистика

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

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

Автор: 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...
art   kaktus312   zZoMROT   lazik234   atomix   k06a   KvanGee   SkyFreeLancer   Engineer9   krazh   Deadly   Ingaf   worm2   vasyura   SirSlava   lamed33   azarov   Ibanez   doubt   xornotxor