задачка (программистское)
Jan. 5th, 2011 04:08 pmЗадачка для программистов и интересующихся. Наверняка известная, но мне в такой форме не встречалась, и понравилась.
Дан массив размером N, в нем есть только числа от 1 до N-1 (необязательно все, необязательно по порядку). Очевидно, какие-то из них повторяются. Найти какое-то число, которое встречается в массиве больше одного раза.
Суть в том, чтобы сделать это с как можно лучшей сложностью времени и места. Скажем, тривиально сделать это за O(N) времени с O(N) места. Можно лучше. Исходный массив не бесплатный: его можно менять, но это считается в бюджет места.
Update: все скрытые комментарии с правильными решениями раскрываются. Не заглядывайте в комментарии, если хотите дальше думать сами - там есть много правильных решений. Оптимальное решение этой проблемы выполняет задачу за O(N) времени, O(1) места.
Дан массив размером N, в нем есть только числа от 1 до N-1 (необязательно все, необязательно по порядку). Очевидно, какие-то из них повторяются. Найти какое-то число, которое встречается в массиве больше одного раза.
Суть в том, чтобы сделать это с как можно лучшей сложностью времени и места. Скажем, тривиально сделать это за O(N) времени с O(N) места. Можно лучше. Исходный массив не бесплатный: его можно менять, но это считается в бюджет места.
Update: все скрытые комментарии с правильными решениями раскрываются. Не заглядывайте в комментарии, если хотите дальше думать сами - там есть много правильных решений. Оптимальное решение этой проблемы выполняет задачу за O(N) времени, O(1) места.
Re: За один проход, с одной переменной
Date: 2011-01-05 04:28 pm (UTC)Re: За один проход, с одной переменной
Date: 2011-01-05 04:30 pm (UTC)Это неправда. Он ищет элемент который стречается чаще всех.
Re: За один проход, с одной переменной
Date: 2011-01-05 04:33 pm (UTC)Re: За один проход, с одной переменной
Date: 2011-01-05 04:34 pm (UTC)Re: За один проход, с одной переменной
Date: 2011-01-05 04:36 pm (UTC)Re: За один проход, с одной переменной
Date: 2011-01-05 07:13 pm (UTC)http://en.wikipedia.org/wiki/Bloom_filter
и отбираем в ассоциативный массив только те числа которые "потенциально уже есть". Потом проходим второй раз и проверям уже только их. Оценочную функцию прикинуть не берусь ;)
Re: За один проход, с одной переменной
Date: 2011-01-05 07:17 pm (UTC)Re: За один проход, с одной переменной
Date: 2011-01-05 08:41 pm (UTC)for(var i=0;;i++) {
int p = N[i];
if (p == N[p-1]) {
print(p); break;
} else {
swap(N[i],N[p-1])
}
}
Re: За один проход, с одной переменной
Date: 2011-01-05 08:44 pm (UTC)Re: За один проход, с одной переменной
Date: 2011-01-05 08:57 pm (UTC)Re: За один проход, с одной переменной
Date: 2011-01-05 08:59 pm (UTC)Re: За один проход, с одной переменной
Date: 2011-01-05 09:01 pm (UTC)Re: За один проход, с одной переменной
Date: 2011-01-06 09:05 am (UTC)