Найти - Пользователи
Полная версия: Хитрый поиск в списке
Начало » Центр помощи » Хитрый поиск в списке
1 2
lyapun
Здраствуйте!

Помогите придумать как лучше сделать такую задачку:

Есть список из чисел от 1 до N. Числа расположены в случайном порядке. Необходимо, проверить что в списке есть все числа от 1 до N при этом каждое число встречается только один раз.

Спасибо
Isem
if len(lst) == N == len( set(lst) ):
print( "Да" )
Здесь lst - список, содержащий числа от 1 до N
.Serj.
def f(num,lst): return reduce(lambda x,y:x+y,map(lambda x: num==x,lst))

def g(numlst,lst):
for num in numlst:
if f(num,lst) != 1:
return False
return True
In [44]: l
Out[44]: [1, 3, 9, 0, 5, 1, 8, 3, 4, 10, 100500, 100500]

In [45]: set(l)
Out[45]: set([0, 1, 3, 4, 5, 8, 9, 10, 100500])

In [46]: g([1,2,3],l)
Out[46]: False

In [47]: g([1,2,3],set(l))
Out[47]: False

In [48]: g([0,1,3],l)
Out[48]: False

In [49]: g([0,1,3],set(l))
Out[49]: True
Zubchick
Довольно порочный метод, со сложностью аж N^3
Тут не надо умничать, надо пройтись старым добрым циклом, увеличивая значение переменной счетчика внутри цикла… вот и все. И будет квадратичная сложность :)
lyapun
Спасибо всем!
Заюзал вариант Isem'a
doza_and
Вообще задача вроде линейной сложности.
a=numpy.zeros(N)
a[arr]=1
if min(a)==0:
print "не хватает"
arr это ваш массив с данными
Zubchick
да, я напутал не квадратичная а 2*N
Isem
Тогда со сложностью O(N), а именно N:
if 6*sum( i*i for i in lst ) == N*(N+1)*(2*N+1):
print( "Да, это так" )
Ну если мне покажут, что это не так, тогда возьмем третью степень (…) и упремся в теорему Ферма.
doza_and
Спасибо за интересное решение. Но ему не хватает конструктивного указания как выбирать степень при разном N.
“Поиск метода доказать что это не так” - очень лестное предложение, было-бы интересно заняться, но наверное требуется побольше времени. :) Интересующиеся могут посмотреть что такое десятая проблема Гильберта. http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B_%D0%93%D0%B8%D0%BB%D1%8C%D0%B1%D0%B5%D1%80%D1%82%D0%B0

Если у вас Isem есть предложения - не скромничайте - озвучте.
doza_and
9^2 + (9 - 1)^2 == 12^2 + 1 True
10^3 + (10 - 1)^3 == 12^3 + 1 True

поэтому предлагаемый вами алгоритм некорректен.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB