
Андрей
10.09.2018
20:53:50
у нормального хвосты ненулевые а тут зануление за границами [0, N] - или это погрешности и можно взять нормальное?

Pineapple
10.09.2018
20:54:42
Если экстремальные хвосты важны, то нормальным приближением ползоваться не выйдет
Но в целом пользоваться можно, помня, что это приближение

Андрей
10.09.2018
20:56:29
про второй вопрос не согласен насчет бесконечность способов, но можно оставить его вообще, первого ответа достаточно. значит можно взять экспоненту от квадрата отклонения от N/2 и пообрать множитель чтобы площадь была 1?

Google

Pineapple
10.09.2018
20:57:47
Пусть есть точки [0.1, 0.2, 0.3, 0.4] Любое число 0.2<x<0.3 разбивает отрезок на интервалы с равным числом точек

Андрей
10.09.2018
20:59:16
мы стремим N к бесконечности, получаем в пределе одну точку
но не 0.5
или я что-то упускаю. и не могу нормально сформулировать что имею в виду

Abbath
10.09.2018
21:01:02

Андрей
10.09.2018
21:01:10
ладно, спасибо, пошел пробовать Карла Фридриховича и вспоминать как его получать из равномерного распределения
а аналитический вид у этого t наверное ужасный как и у биномиального? я могу пожертвовать точностью ради скорости расчета

Pineapple
10.09.2018
21:02:10
Точка будет в пределе, но пока мы не перешли к пределу у нас будет бесконечное число делений. Можно просто выбрать какую-нибудь процедуру выбора деления
А что требуется считать?

Андрей
10.09.2018
21:03:13
Если интересно - расскажу откуда вылезла эта задачка

Pineapple
10.09.2018
21:05:23
Конечно


Андрей
10.09.2018
21:09:16
Мне надо сгенерировать случайным образом граф с заданным числом вершин и ребер. Я свел ее к задаче получения заданного числа равномерно распределенных элементов из длинного вектора. Решал ее в лоб - для длинных векторов долго переводить в сеты уже набранные индексы чтобы потом их снова не выбирать. И придумал следующее - надо получить N равномерных индексов вектора. Я делю вектор пополам, и с какой-то рассчитанной вероятностью делю задачу на 2 подвектора - M в левой половине K в правой. когда N = 0 - я не беру никакую точку, когда 1 - беру равномерно из текущего интервала, когда N = число точек в интервале - беру все. Это граничные условия - а дальше простая рекурсия. В итоге мы тратим О(1) памяти и О(N) времени безо всяких огромных структур данным и мурыжения сетов с юнионами и вычитаниями. Дешево и сердито для больших графов, надо только M и K рассчитывать каждый раз вероятностным способом
Второй вопрос - из той же серии, только делим вектор не пополам а в рассчитанной вероятностно пропорции, а N делим пополам

Google

Alexander
10.09.2018
21:13:19
а нельзя просто сгенерировать M пар из [1..N] и пересоздавать если такое уже было?
где M число ребер
поиск наличия ребра O(1)

Андрей
10.09.2018
21:14:29
можно, но если тебе надо сгенерировать 100499 ребер из 100500 то под конец долго ждать случайных попаданий

Alexander
10.09.2018
21:14:29
если памяти не жалко

Андрей
10.09.2018
21:14:52
можно разворачивать если больше половины генерировать отсутствующие ребра конечно

Alexander
10.09.2018
21:14:56
генерируй либо наличие, либо отсуствие ребер
смотря чего больше

Андрей
10.09.2018
21:15:16
но все равно это память, сеты и все такое. я уже думал над этим

Alexander
10.09.2018
21:15:39
битвектора ты хотел сказать?

Андрей
10.09.2018
21:15:51
мой же алгоритм выше - просто как тот ежик из анекдота - вжух!

Alexander
10.09.2018
21:16:22
мы похожую штуку делали
можно пронумеровать все выборки

Андрей
10.09.2018
21:16:34
ну битвектора, хэши или что там еще - неважно

Alexander
10.09.2018
21:16:37
и просто генерировать номер
с построить простой алгоритм перевода номера в сет
(ну у нас иерархическое дерево было, но там не важно)

Андрей
10.09.2018
21:17:22
я это и буду делать. только номера буду генерировать как выше написал

Alexander
10.09.2018
21:17:28
1 номер

Андрей
10.09.2018
21:17:41
давай на примере

Google

Андрей
10.09.2018
21:18:59
кстати, вспомнил что у Гаусса то есть дисперсия…. ее надо как-то оценить по N получается…

Pineapple
10.09.2018
21:23:56
A какое распредление у случайного графа? И как он представляется в памяти?

Андрей
10.09.2018
21:24:43
в моей модели - равномерно распределенная выборка N ребер из свего массива возможных
в памяти - неважно, как представлю так и будет

Pineapple
10.09.2018
21:25:29
Ну то есть все графы, N вершим M ребёр

Андрей
10.09.2018
21:26:46
в смысле? V вершин, максимум V*(V-1)/2 ребер в неориентированном, берем из них N равномерно

Alexander
10.09.2018
21:26:48
смотри мы можем отметить ребро между вершиной 1 и остуствие 0, рассматриваем в одну сторону
чтобы дубли не считать
нам нужно выбрать M единичек в отрезке
мы можем все варианты упорядочить
например для 2 из 4:

Андрей
10.09.2018
21:27:50
до битовых полей опускаться? у меня на дне жаваскрипт, есличе, хотя я и не на нем самом пишу. там есть битовые операции?

Alexander
10.09.2018
21:27:52
[1100], [1010],[1001],[0110], ...
между этим представлением и его порядковым номером существует однозначное соотвествие

Андрей
10.09.2018
21:28:19
ты пронумеровал все графы?

Alexander
10.09.2018
21:28:32
выражаемое математической формулой, которую можно вывести за полчаса
поэтому тебе достаточно выбрать любое число от 0 до C_n^m

Андрей
10.09.2018
21:29:22
и увидеть что там не N единичек

Alexander
10.09.2018
21:29:36
чо?

Андрей
10.09.2018
21:29:46
да и само это число в инт не влезет, подозреваю

Google

Alexander
10.09.2018
21:29:57
в инт64 у тебя все влезет
в а инт128 ещё и с запасом

Pineapple
10.09.2018
21:31:00

Андрей
10.09.2018
21:31:17
число вершин и ребер фиксировано

Alexander
10.09.2018
21:31:21
я так понял, что входные данные M, N - число ребет и графов
на выходе нужен граф

Андрей
10.09.2018
21:31:29
задается юзером - ему генерится граф

Oleg
10.09.2018
21:31:38

Андрей
10.09.2018
21:32:02
мои числа вершин не превзойдут 1000

Alexander
10.09.2018
21:32:04
какое С_n^M у нас не влезет в int128?

Андрей
10.09.2018
21:32:25
но это миллион возможных ребер

Pineapple
10.09.2018
21:36:07
Там факториалы, всёрастёт ОЧЕНЬ быстро

Oleg
10.09.2018
21:37:19
http://m.wolframalpha.com/input/?i=log2%28C%281000%2C500%29%29
Ааа это, конечно же для 1000 возможных рёбер

Андрей
10.09.2018
21:38:31
)))

Oleg
10.09.2018
21:39:11
В худшем случае для 1000 вершин будет чото типа 5000 рёбер
http://m.wolframalpha.com/input/?i=log2%28C%285000%2C2500%29%29
Это 5000 бит

Google

Oleg
10.09.2018
21:41:20
Ну вообще как видно C(n, n/2) растёт ненамного медленнее 2^n, так что можно считать n бит для комбинаций n/2 элементов из n

Андрей
10.09.2018
21:41:22
Я бы хотел добить свой алгоритм, очень уж он мне кажется симпатичным
только аналитический вид формулы получить

Oleg
10.09.2018
21:42:23
Восстановление по порядковому номеру, как Александр посоветовал всё равно будет самым эффективным.
Это я помню с каких-то кодфорсес задач
И выбрать k целых различных чисел в диапазоне без запоминания довольно простая задача

Андрей
10.09.2018
21:44:09
вот ее то я с таким трудом и решаю
надо обеспечить равномерность выборки, иначе взял К первых и все )

Oleg
10.09.2018
21:46:19
А сколько k?
Если k = 2^n - 1 совсем просто

Андрей
10.09.2018
21:46:48
а Матлаб остался на старом компе с Виндой, тут мак и нифига нет (…

Oleg
10.09.2018
21:46:56
Если другое - не совсем, но тоже несложно

Андрей
10.09.2018
21:47:04
К - любое заданное юзером
из ваших слов следует что мы можем выбрать нужное нам к а остальные отбросить и будет несложно? )
что-то сомнительно мне…

Oleg
10.09.2018
21:50:05
Как велико k?

Андрей
10.09.2018
21:50:27
а отбрасывать тоже хитро придется?
к - как захочет юзер, от 1 до порядка миллионов
но это я загнул немного, миллион ребер мало кто захочет, но алгоритм хорошо бы чтобы переварил

Alexander
10.09.2018
21:52:24
@IIvana можно и как ты решаешь

Oleg
10.09.2018
21:52:56
Ну давайте простые случаи.
Представим, что k = 2 и у нас равномерное непрерывное на [0;1], тогда какова вероятность, что
большее из двух чисел не больше x?

Alexander
10.09.2018
21:52:57
тебе нужно расставить номера из [1..N] для M позиций