Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Алгоритм] Наименьшее натуральное число


Автор: fsherstobitov 19.6.2010, 08:09
Дан массив натуральных чисел. Необходимо найти наименьшее натурально число, не входящее в данный массив. Алгоритм должен выполняться за О(n).

Автор: Фантом 19.6.2010, 14:15
Заводим массив 1:n из булевских переменных B, весь забитый, например, false. Проходимся один раз по исходному массиву, для каждого элемента со значением q устанавливая в булевском массиве элемент B[q] в true (если q>n, то ничего не делаем).
Затем проходимся по булевскому массиву и ищем номер первого элемента, имеющего значение false. Это и есть ответ.

Автор: bems 19.6.2010, 19:40
Фантом, это О(2n). Нет?

Автор: Фантом 19.6.2010, 20:02
Цитата(bems @  19.6.2010,  19:40 Найти цитируемый пост)
это О(2n). Нет?

И нет, и да.  smile  Смысл O-символики при оценке сложности алгоритма (во всех других случаях, впрочем, тоже) в том, что если количество операций алгоритма зависит от n как f(n), то сложность алгоритма O(g(n)) должна быть такой, чтобы предел f(n)/g(n) при n, стремящемся к бесконечности, оказался ненулевым и конечным.

Как следствие, O(n) и O(2*n) попросту ничем не отличаются (и второй вариант при описании асимптотической сложности алгоритмов не используется). Это, кстати, логично не только с формальной точки зрения: поскольку мы не знаем точно, какое количество тактов процессора будет использовано для выполнения той или иной операции, то сравнивать линейные по n алгоритмы по коэффициенту малоосмысленно - вполне возможно, что какой-либо "однопроходный" алгоритм за счет большей трудоемкости обработки одной ячейки массива будет выполняться дольше, чем мой "двупроходный". 

Другое дело, что бывают случаи, когда для алгоритма, например, с O(n^3) для некоторого диапазона n на некоторой определенной архитектуре можно получить более быструю реализацию, чем для другого алгоритма с O(n^2), но это уже совсем другая задача, для которой нужно конкретизировать и "стоимость" элементарных операций, и максимальные n, для которых нужно найти эффективное решение.

Автор: bems 19.6.2010, 21:25
К стати в большинстве случаев подойдет найти минимум массива и отнять единицу. Есть мысли как адаптировать это чтоб работало всегда?

Автор: Фантом 19.6.2010, 21:31
Цитата(bems @  19.6.2010,  21:25 Найти цитируемый пост)
К стати в большинстве случаев подойдет найти минимум массива и отнять единицу.

Нет, не годится. Допустим, массив заполнен числами 10,11,12,13 и т.д. Ответ должен равняться 1, а не 9.

Собственно говоря, тут возможны только два варианта - либо минимум не равен 1, и тогда ответ - единица. Либо минимум равен 1 и это не дает вообще никакой информации об ответе.

Автор: bems 19.6.2010, 21:34
Цитата(Фантом @  19.6.2010,  21:31 Найти цитируемый пост)
Нет, не годится. Допустим, массив заполнен числами 10,11,12,13 и т.д. Ответ должен равняться 1, а не 9.
Я дичайше затупил.


Автор: fsherstobitov 20.6.2010, 21:13
Цитата(Фантом @ 19.6.2010,  14:15)
Заводим массив 1:n из булевских переменных B, весь забитый, например, false. Проходимся один раз по исходному массиву, для каждого элемента со значением q устанавливая в булевском массиве элемент B[q] в true (если q>n, то ничего не делаем).
Затем проходимся по булевскому массиву и ищем номер первого элемента, имеющего значение false. Это и есть ответ.

Спасибо за ответ!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)