analizer 12.12.2011 15:13 mcabber

алсо, у бывшего коллеги в вконтактике откопал красивую задачку для собеседований: «Напишите функцию выбора случайного элемента из списка неизвестной длины за один проход». Желающие позанудничать и попетросянить могут сразу в приват скинуть заявку на добавление в BL

1. 0xd34df00d 12.12.2011 15:14 Azoth

Бросать монетку каждый раз, если 1, то выбрать текущий элемент, если 0, то перейти на следующий (или в начало списка, если ВНЕЗАПНО конец).
Для любого элемента есть ненулевая вероятность его выбора, а про равномерное распределение никто и не говорил :3

2. arts 12.12.2011 15:15 Psi+

Считаем длину и возвращаем элемент, ну.

3. analizerarts /2 12.12.2011 15:15 mcabber

за один проход

4. artsanalizer /3 12.12.2011 15:15 Psi+

Так один проход же.

5. 0xd34df00danalizer /3 12.12.2011 15:15 Azoth

ПОЧЕМУ ТЫ МЕНЯ ИГНОРИРУЕШЬ (((((

6. analizerarts /4 12.12.2011 15:16 mcabber

«список» подразумевает отсутствие random-access по номеру элемента

7. artsanalizer /6 12.12.2011 15:17 Psi+

А, ок. Тогда вариант дедфуда.

8. analizerarts /7 12.12.2011 15:18 mcabber

а с равномерным распределением слабо?

9. d1ffuz0r 12.12.2011 15:18

>>> x = range(100)
>>> import random
>>> g = lambda xx: random.choice(xx)
>>> g(x)
93
>>> g(x)
75
>>>

10. kb 12.12.2011 15:18 c8541125

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

11. analizerkb /10 12.12.2011 15:19 mcabber

линейная сложность и достаточно простое решение

12. analizerd1ffuz0r /9 12.12.2011 15:19 mcabber

питонисты, они все такие, да

13. artsanalizer /8 12.12.2011 15:19 Psi+

Первым проходом собрать в массив с доступом по индексу, а затем вернуть рандомный элемент:-)

14. analizerarts /13 12.12.2011 15:20 mcabber

/12

15. d1ffuz0ranalizer /12 12.12.2011 15:20

что?

16. kbanalizer /11 12.12.2011 15:20 c8541125

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

17. analizerd1ffuz0r /15 12.12.2011 15:21 mcabber

не ко всему в этом мире можно применить random-access

18. kbanalizer /11 12.12.2011 15:22 c8541125

хотя может эта моя задачка это про список известной длинны.

20. 0x2207 12.12.2011 15:45 epsilon/psi

а каковы стат.свойства случайной величины? распределение должно быть равномерное? список двухсвязный/односвязный? не понятны условия

21. analizer0x2207 /20 12.12.2011 15:45 mcabber

список односвязный, распределение требуется равномерное

22. kb 12.12.2011 15:46

ах да, еще существует "улучшение" этой задачи тем, что требуется решение, пригодное для Map/Reduce (до конца я тут не вдумывался, потому также предлагаю сначала дофантазировать, что имел в виду автор требования)

23. 0x2207 12.12.2011 15:48 epsilon/psi

кажется придумал как это делать. тред не читал, только домой пришел, пора есть и спать.

24. DZhon 12.12.2011 15:56 mcabber.7eb093ad

Хм, для каждого элемента при проходе брать от 0 до RAND_MAX, запоминать максимум. В конце максимум будет сгенеренным числом.

25. DZhonDZhon /24 12.12.2011 15:57 mcabber.7eb093ad

Элемент, стоящий на максимуме, obv.

26. Cthulhuarts /4 12.12.2011 16:01 Miranda

Такие они, питонщики :3

27. rtsome0xd34df00d /1 12.12.2011 16:06

ну и если теперь вероятность смены элемента каждый ход уменьшать, то получится равномерное распределение.
как-то так.

28. analizerrtsome /27 12.12.2011 16:06 mcabber

вопрос в том как её уменьшать

29. rtsomeanalizer /28 12.12.2011 16:07

экспоненциально, каждый раз пополам видимо.

30. analizerrtsome /29 12.12.2011 16:08 mcabber

тогда в списке о трёх элементах вероятность выбора третьего элемента — ¼, а должна быть ⅓

31. DZhonanalizer /30 12.12.2011 16:09 mcabber.7eb093ad

обратно пропорционально ? :)

32. rtsomeDZhon /31 12.12.2011 16:12

вероятность выбора первого элемента зависит от длины списка, а етот элемент мы наблюдаем первым и единственный раз => полный пиздец
тут надо хитрую математику использовать.

33. kbrtsome /32 12.12.2011 16:19 c8541125

на втором элементе отбрасываем первый и второй с вероятностью 1/2, на третьем с вероятностью 2/3-1/2, на на четвертом с вероятностью 3/4-(2/3-1/2). аналогично для остальных. надо додумать вот в эту степь.

34. DZhonkb /33 12.12.2011 16:20

1/2 — вероятность не отбросить первый и второй. И ? У тебя опять не выйдет равномерности.

35. kbDZhon /34 12.12.2011 16:23 c8541125

еще раз. на втором шаге ты оба отбросишь с вероятностью 1/2 (ну, надо додумать чтоб не отбрасывались все и чтоб не невыбрасывались тоже, но тут можно просто в одну из сторон правило определить), если на третьем ты первый и второй отбросишь с вероятностью 2/3-1/2, то в сумме ты их отбросишь с вероятностью 2/3, а третий надо отбрасывать с вероятностью 2/3. когда добавляется 4й элемент тебе надо отбрасывать так, чтоб каждый был выброшен с вероятностью 3/4 и т.п. Ты на каждом шаге делаешь так, что каждый элемент выброшен с вероятностью N-1/N. понимаешь? короче я в эту степь подумаю еще.

36. DZhonkb /35 12.12.2011 16:29

Опять же, вероятность выбора 1-го получается 1/2, разве нет ? Если определять правило в одну сторону, то тебе нужна память :)

37. kbDZhon /36 12.12.2011 16:30 c8541125

ну, когда их двое — да, его выбор 1/2. когда трое — 1/3. типа того.

38. kbDZhon /36 12.12.2011 16:31 c8541125

то есть отбросить мы могли кого-то и с меньшей вероятностью, чем он заслуживает. но выберем не с большей, чем надо. хотя может я и в бреду.

39. DZhonkb /38 12.12.2011 16:35

Если ты не отбрасываешь элемент, то куда ты его деваешь ? Выдаешь в результат, ведь так ? Если ты выбрал для первого элемента шанс отбросить в 1/2, то равновероятным становится событие его не отбросить, т.е. отдать в результат! Что происходит с вероятностью 1/2. Это уже неравномерность.

40. rtsome 13.12.2011 11:53

ответ есть?

41. rtsomertsome /40 13.12.2011 14:48

чорт, он же очевиден.

42. kbrtsome /41 13.12.2011 14:48

и?

43. kbDZhon /39 13.12.2011 15:04

смысл в том, чтоб не отдавать результат пока не дойдём до конца. то есть пока элементов два — да, вероятность того, что он выпадет равна 1/2. но если мы его не отбрасываем на шаге 2, то при шаге 3 вероятность уменьшаем до 1/3. памяти нам потребуется в худшем случае столько, чтоб держать все элементы, но по теории вероятности в среднем должен храниться один элемент :)

44. kbDZhon /39 13.12.2011 15:08

то есть основная идея в том, что если всего элементов N (хотя мы этого не знаем), то в конечном счете мы каждый элемент отбросим с вероятностью (N-1)/N либо же меньше. но если мы какой-то элемент отбросим с меньшей вероятностью (скажем, 1/2), нас это тоже устроит, потому как можно сказать, что вероятность отбрасывания на (N-1)/N равна вероятности "1/2 OR ((N-1)/N — 1/2)"

45. rtsomekb /42 13.12.2011 16:16

вероятность выбора i-ого элемента равна 1/i

46. kbrtsome /45 13.12.2011 16:16 c8541125

тогда ты всегда будешь выбирать 1й элемент. класс!

47. rtsomekb /46 13.12.2011 16:17

правильно, первый элемент всегда выбираем. и идём дальше, до конца.

48. DZhonrtsome /47 13.12.2011 16:20

лол, да :)

49. kbrtsome /47 13.12.2011 16:20 c8541125

и что в конце? какой выбираем?

50. DZhonkb /49 13.12.2011 16:22

запоминаешь последний выбранный)

51. rtsomekb /49 13.12.2011 16:22

какой последний выбрали тот и возращаем.
да всё очевидно же, чото вчера сразу не допёр.

52. kbrtsome /51 13.12.2011 16:23 c8541125

ну вот всего их три. третий не выбрал, а выбрал второй. получается ты его с вероятностью 1/2 выбрал, да?

53. kbrtsome /51 13.12.2011 16:24 c8541125

точнее 2/3 — 1/2 вероятность того, что второй выберешь

54. DZhonkb /52 13.12.2011 16:24

всего их три! у тебя было 3 шанса выбрать 1.

55. kbDZhon /54 13.12.2011 16:29 c8541125

понял

56. analizerrtsome /40 13.12.2011 16:54 mcabber

он был ещё до поста.

57. analizerkb /43 13.12.2011 16:55 mcabber

по теории вероятности рано или поздно случится худший случай

58. kbanalizer /57 13.12.2011 16:56

по теории вероятности рано или поздно вероятность худшего случая будет нулём.

59. analizerkb /58 13.12.2011 16:57 mcabber

не занудничай. не надо ничего хранить. расход памяти у решения — константный, сложность — линейная

60. kbanalizer /59 13.12.2011 16:58 c8541125

да уже rtsome всё решил же )

61. analizerrtsome /45 13.12.2011 16:59 mcabber

ну да, именно так. можно даже строгое доказательство в лучших традициях ТерВера сделать

62. DZhonkb /58 13.12.2011 17:09

Закон больших чисел и я не согласны с тобой.

63. analizerDZhon /62 13.12.2011 17:09 mcabber

и я, а это двое пстачевцев — это куда хуже чем какой-то там математический закон

64. DZhonanalizer /63 13.12.2011 17:12

Сколько нужно пстачевцев, чтобы закидать угнича говном ?

65. analizerDZhon /64 13.12.2011 17:13 mcabber

ни одного, настоящий пстачевец отрицает существование угнича

66. kbanalizer /65 13.12.2011 17:14 c8541125

отрицает закон угнича

Do you really want to delete ?