238328 27.01.2013 18:13

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

1. kb 27.01.2013 18:22

Показалось, что ты написал "эффективные решения сосут хуй", потому вот:

filter(partial(eq(item)), map(add, combinations(l, 2)))

2. 238328kb /1 27.01.2013 18:23

а главное память совсем не ест!

3. kb238328 /2 27.01.2013 18:24 04a3831c

но ведь не ест! (если питон третий)

4. 238328kb /3 27.01.2013 18:24 36505204751359295494234510

дунно //3.3 никто не использует

5. kb238328 /4 27.01.2013 18:25

ну возьми итеративные аналоги, хуле (imap, ifilter)

6. 238328kb /5 27.01.2013 18:26 36505204751359295494234510

а combinations? или оно итератор возвращает? ну норм тогда //в питон2 всё равно ненорм

7. kb238328 /6 27.01.2013 18:26 04a3831c

да, оно в itertools

8. kbkb /5 27.01.2013 18:26

ну и результат проверять не как len() а как [0] нужно брать и блять ловить кейэррор (если тебя только интересует есть там или нет хоть одна такая сумма)

9. 238328kb /8 27.01.2013 18:31 36505204751359295494234510

неэффективно

10. kb238328 /9 28.01.2013 04:06

Почему?

11. 238328kb /10 28.01.2013 04:46

ну ок, неэффективно для большого количества получаемых чисел N

12. kb238328 /11 28.01.2013 05:12

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

13. kb 28.01.2013 07:53

У тупого перебора сложность n^2. Вариант с меньшей сложностью (если я правильно всё понял, n*log(n) сложность считается, правда, конечно же, это всё для худшего случая):
1. отсортировать массив
2. взять два указателя, один на конец, другой на начало.
3. идти первым вверх пока сумма меньше N, идти вторым вниз пока сумма больше N.

Ну, ты понял идею.

14. 238328kb /13 28.01.2013 14:07 33682188341359381337153957

да, только после сортировки лущ сделать так: отфильтровать ненужные значения(убрать все числа больше N), а потом для каждого элемента i бинарный поиск на оставшемся отрезке N-i

15. kb238328 /14 28.01.2013 14:14

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

а по поводу бинарного поиска — ну хуже ведь, а не лучше.

16. 238328kb /15 28.01.2013 14:15 33682188341359381337153957

не хуже, а работает

Do you really want to delete ?