Задачки про деку и сферку

Jan 25, 2007 00:28

Задачку про деку задал elephantum во времена, когда работал в Невале, кодал Героев5, вел перепалки за Петон и в общем и целом сколько-то относился к геймдев-тусовке (как это я забыл его зафрендить). Вот пусть расскажет о том, как ему тот геймдев и Невал видиццо столько времени опосля.
Задачка типа сложная и на просветление. Помнится, первый решил zemedelec минут ( Read more... )

problems

Leave a comment

jakobz January 25 2007, 12:22:20 UTC
Что-то типа половинного деления:
предполагаем что длина дека от n = 1 до m = 1
Меняем один элемент в начале, прокручиваем на m, считая сумму элементов по модулю 2, прокручиваем назад. Меняем элемент обратно, повторяем процедуру. Если суммы равны - то n = m; m *= 2 иначе мы имеем границы длины очереди. Когда границы есть - продолжаем в том же духе, только как следующее приближение берем середину интервала. В общем половинное деление получается, N*log(N).
Вот как-то так, как будет время - напишу в коде.

Reply

sim0nsays January 25 2007, 17:16:19 UTC
Йеп. Это решение. Я сейчас стал задумываться, что у решения с маркером наверно меньшая сложность по вероятности.

Reply

Вопрос автору решения baturadima June 3 2008, 11:49:01 UTC
Что делать после того как проверили середину, и она не подходит?

Reply

Re: Вопрос автору решения sim0nsays June 10 2008, 22:17:13 UTC
Автор что-то не отвечает. Если середина не подходит - значит, решение между нижней границей и серединой, иначе между серединой и верхней границей.

Reply

Re: Вопрос автору решения baturadima June 13 2008, 16:01:01 UTC
Думаю можно в это решение добавить маркер (может это в среднем добавит эффективности).
Если бежать на m вперед и считать не сумму эл-в, а сумму маркеров.

Не посмотрел на даты, думал это все совсем недавно. Спасибо за ответ. Когда прочитал решение протупил)

Reply

Re: Вопрос автору решения sim0nsays June 13 2008, 16:02:36 UTC
Мне кажется, это не изменит алгоритмической сложности.

Reply

Re: Вопрос автору решения baturadima June 17 2008, 08:29:16 UTC
Я имел в виду доходить всегда до маркера (не дописал этого).

Reply

Re: Вопрос автору решения baturadima June 17 2008, 14:24:22 UTC
Если мы знаем ск-ко маркеров от начала до левой и правой границы, то останавливаемся на маркере со средним номером.

Тогда сложность будет O(n*log(кол-во маркеров)), кол-во маркеров длины k в среднем примерно равно n/2^k.

log(n/2^k) = log(n) - k.
Так что если угадать с длиной маркера (log(n)), то сложность в среднем получиться O(n).

Reply

Re: Вопрос автору решения sim0nsays June 18 2008, 17:33:25 UTC
Будут неконстантные затраты памяти на маркер.

Reply

Re: Вопрос автору решения baturadima June 19 2008, 08:30:42 UTC
При выборе длины маркера, мы не знаем размер дека, поэтому размер маркера не может зависеть от размера дека (константен).

Более строго наверно сказать так:). При затратах памяти C, мы со средней сложностью O(n) сможем определять размер дека, при log(n) <= C. :)

Я не утверждаю, что таким алгоритмом можно получить решение со средней сложностью O(n), это только попытка описать влияние длины маркера на среднюю сложность алгоритма.

Спасибо за замечание.

Reply

Re: Вопрос автору решения sim0nsays June 19 2008, 12:13:06 UTC
Мне кажется, это все равно неконстантные затраты памяти. Т.е. либо мы ограничиваем длину маркера неким C, и для достаточно больших N получаем O(n*log(n)) (длина маркера уходит в коэффициент перед O), либо С начинает зависить от N для лучшей сложности, и тогда затраты памяти неконстантны.

Reply

Решение O(n) baturadima June 17 2008, 08:48:01 UTC
1. Делаем тоже самое (m*=2), пока m не привысит размер дека (скажем используя маркер). Сложность O(n). При этом m < 2 * size.
2. Ищем в послед-ти эл-в длины m, максимальное число(k) идущих подряд маркеров (возможно их неск-ко). Берем любую и добавляем еще один -> теперь у нас есть уникальный маркер в деке (послед-ть k+1 выбранного маркера) и сложность его определения O(n).
3. Бежим по кругу и считаем ск-ко элем-в (с учетом уникального маркера легко). O(n).
4. Вытираем добавленный маркер.

По-моему лучше всего использовать маркер единичной длины.

Reply


Leave a comment

Up