Определение конкретного числа в времени и пространстве (наихудший случай)


10

Учитывая, что A[1..n] являются целыми числами, такими, что 0A[k]m для всех 1kn , и вхождением каждого число, кроме определенного числа в A[1..n] является нечетным числом. Попробуйте найти число, вхождение которого является четным числом.

Существует алгоритм Θ(nlogn) : мы сортируем A[1..n] на B[1..n] и разбиваем B[1..n] на множество частей, значения элементов которых являются то же самое, поэтому мы можем посчитать вхождение каждого элемента.

Я хочу найти алгоритм O(n) -время-и- O(n) -пространства в худшем случае .

Предположим, что m=Ω(n1+ϵ) и ϵ>0 , поэтому радикальная сортировка недопустима. Двоичные побитовые операции допустимы, например, A[1]xorA[2] .


Ответ Арьябхаты, приведенный ниже, показывает, что общий случай не очень хорош, но, возможно, у вас есть дополнительные ограничения? Простое (но большое) ограничение заключается в обеспечении того, чтобы все записи в массиве имели размер O(n) . Это дало бы довольно тривиальный линейный алгоритм.
Люк Мэтисон

1
@LukeMathieson: я удалил этот ответ, поскольку еще не уверен, что цитируемый мной документ будет работать без каких-либо изменений, и, кроме того, OP, похоже, интересуется только моделью оперативной памяти с одинаковыми затратами.
Арьябхата

@Aryabhata: хе-хе, хорошо, что ответа там нет! Из интересного и, возможно, полезного для Фрэнка, как вы думаете, была проблема с адаптацией результата в газете? Беглый взгляд подсказал, что это применимо, но я, очевидно, не читал это.
Люк Мэтисон

@LukeMathieson: тот факт, что другие элементы должны появляться нечетное количество раз в текущей задаче. Так как я тоже просмотрел доказательства ...
Арьябхата

Было бы интересно, если вас интересуют теоретические результаты или практические решения. С точки зрения теории, мой первый быстрый ответ заключается в том, что вы можете отсортировать список целых чисел быстрее, чем . Существует детерминированный алгоритм Хана, который выполняется за . Для рандомизированных алгоритмов известны еще лучшие результаты, например, Хан и Торуп нашли алгоритм ожидаемого времени . Тем не менее, я думаю, что ваша проблема не должна требовать сортировки. O(nlogn)O(loglogn)O(nloglogn)
А.Шульц

Ответы:


2

Вот идея простого алгоритма; просто посчитай все вхождения!

  1. Найти . - времяm=maxAΘ(n)
  2. «Выделить» массив . - время ¹C[0..m]O(1)
  3. Итерируйте по и увеличивайте на единицу всякий раз, когда вы найдете . Если было , добавить до линейного списка . - времяAC[x]A[_]=xC[x]0xLΘ(n)
  4. Переберите и найдите элемент с . - время .LxeC[xe]O(n)
  5. Вернуть .xe

В общем, это дает вам алгоритм линейного времени, который может использовать (в смысле выделения) много памяти. Обратите внимание, что возможность произвольного доступа к в постоянное время независимо от имеет решающее значение.Cm

При таком подходе дополнительная оценка является более сложной; Я не знаю какой-либо словарной структуры данных, которая предлагает поиск времени. Вы можете использовать хеш-таблицы, для которых здесь есть реализации с ожидаемым временем поиска ( размером таблицы, числом хранимых элементов), так что вы можете получить сколь угодно хороший результат с линейным пространством - в ожидании. Если все значения в соответствуют одному и тому же хеш-значению, вы облажались.O(n)O(1)O(1+k/n) nkA


  1. В оперативной памяти это сделано неявно; все, что нам нужно, это начальная позиция и, возможно, конечная позиция.

0

Почти тривиальное решение - использующее, однако, пространство - это использование хэш-карты. Напомним, что хэш-карта имеет амортизированную среду выполнения для добавления и поиска элементов.Θ(n)O(1)

Следовательно, мы можем использовать следующий алгоритм:

  1. Выделяют хэш - карту . Итерация над . Для каждого элемента увеличьте количество видимых случаев, т.е. .HAiAH(i)++

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

Теперь это простой алгоритм, который не использует какой-то большой трюк, но иногда даже этого достаточно. Если нет, вы можете указать, какие ограничения пространства вы накладываете.


Я все еще хотел бы знать, существует ли нерандомизированный алгоритм времени , использующий полиномиальное пространство. В частности, есть ли какие-либо теоретические доказательства того, что найти единственный четный предмет сложнее, чем найти единственный странный предмет? O(n)
А.Шульц

@ A.Schulz Я думаю, что это алгоритм с ожидаемым временем с использованием хеш-таблицы. Я помню, что кто-то сказал мне -алгоритм (или для какого-то особого случая, скажем, нечетного = 1 и четного = 2), возможно, со стеком, но я не могу вспомнить его. O(n)O(n)
Yai0Phah

Не каждая реализация с хеш-таблицами имеет это свойство; обычно поиск не является , даже не амортизируется (afaik). Фактически, предшествующее обсуждение не дало никакой реализации, которая имеет постоянный поиск по времени. Можете быть более конкретными? O(1)
Рафаэль
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.