Andrey
ладно, спасибо, пошел пробовать Карла Фридриховича и вспоминать как его получать из равномерного распределения
Andrey
а аналитический вид у этого t наверное ужасный как и у биномиального? я могу пожертвовать точностью ради скорости расчета
Алексей
Точка будет в пределе, но пока мы не перешли к пределу у нас будет бесконечное число делений. Можно просто выбрать какую-нибудь процедуру выбора деления
Алексей
А что требуется считать?
Andrey
Если интересно - расскажу откуда вылезла эта задачка
Алексей
Конечно
Andrey
Мне надо сгенерировать случайным образом граф с заданным числом вершин и ребер. Я свел ее к задаче получения заданного числа равномерно распределенных элементов из длинного вектора. Решал ее в лоб - для длинных векторов долго переводить в сеты уже набранные индексы чтобы потом их снова не выбирать. И придумал следующее - надо получить N равномерных индексов вектора. Я делю вектор пополам, и с какой-то рассчитанной вероятностью делю задачу на 2 подвектора - M в левой половине K в правой. когда N = 0 - я не беру никакую точку, когда 1 - беру равномерно из текущего интервала, когда N = число точек в интервале - беру все. Это граничные условия - а дальше простая рекурсия. В итоге мы тратим О(1) памяти и О(N) времени безо всяких огромных структур данным и мурыжения сетов с юнионами и вычитаниями. Дешево и сердито для больших графов, надо только M и K рассчитывать каждый раз вероятностным способом
Andrey
Второй вопрос - из той же серии, только делим вектор не пополам а в рассчитанной вероятностно пропорции, а N делим пополам
Alexander
а нельзя просто сгенерировать M пар из [1..N] и пересоздавать если такое уже было?
Alexander
где M число ребер
Alexander
поиск наличия ребра O(1)
Andrey
можно, но если тебе надо сгенерировать 100499 ребер из 100500 то под конец долго ждать случайных попаданий
Alexander
если памяти не жалко
Andrey
можно разворачивать если больше половины генерировать отсутствующие ребра конечно
Alexander
генерируй либо наличие, либо отсуствие ребер
Alexander
смотря чего больше
Andrey
но все равно это память, сеты и все такое. я уже думал над этим
Alexander
битвектора ты хотел сказать?
Andrey
мой же алгоритм выше - просто как тот ежик из анекдота - вжух!
Alexander
мы похожую штуку делали
Alexander
можно пронумеровать все выборки
Andrey
ну битвектора, хэши или что там еще - неважно
Alexander
и просто генерировать номер
Alexander
с построить простой алгоритм перевода номера в сет
Alexander
(ну у нас иерархическое дерево было, но там не важно)
Andrey
я это и буду делать. только номера буду генерировать как выше написал
Alexander
1 номер
Andrey
давай на примере
Andrey
кстати, вспомнил что у Гаусса то есть дисперсия…. ее надо как-то оценить по N получается…
Алексей
A какое распредление у случайного графа? И как он представляется в памяти?
Andrey
в моей модели - равномерно распределенная выборка N ребер из свего массива возможных
Andrey
в памяти - неважно, как представлю так и будет
Алексей
Ну то есть все графы, N вершим M ребёр
Andrey
в смысле? V вершин, максимум V*(V-1)/2 ребер в неориентированном, берем из них N равномерно
Alexander
смотри мы можем отметить ребро между вершиной 1 и остуствие 0, рассматриваем в одну сторону
Alexander
чтобы дубли не считать
Alexander
нам нужно выбрать M единичек в отрезке
Alexander
мы можем все варианты упорядочить
Alexander
например для 2 из 4:
Andrey
до битовых полей опускаться? у меня на дне жаваскрипт, есличе, хотя я и не на нем самом пишу. там есть битовые операции?
Alexander
[1100], [1010],[1001],[0110], ...
Alexander
между этим представлением и его порядковым номером существует однозначное соотвествие
Andrey
ты пронумеровал все графы?
Alexander
выражаемое математической формулой, которую можно вывести за полчаса
Alexander
поэтому тебе достаточно выбрать любое число от 0 до C_n^m
Andrey
и увидеть что там не N единичек
Alexander
чо?
Andrey
да и само это число в инт не влезет, подозреваю
Alexander
в инт64 у тебя все влезет
Alexander
в а инт128 ещё и с запасом
Алексей
Andrey
число вершин и ребер фиксировано
Alexander
я так понял, что входные данные M, N - число ребет и графов
Alexander
на выходе нужен граф
Andrey
задается юзером - ему генерится граф
Oleg
Andrey
мои числа вершин не превзойдут 1000
Alexander
какое С_n^M у нас не влезет в int128?
Andrey
но это миллион возможных ребер
Алексей
Алексей
Там факториалы, всёрастёт ОЧЕНЬ быстро
Oleg
http://m.wolframalpha.com/input/?i=log2%28C%281000%2C500%29%29
Oleg
Ааа это, конечно же для 1000 возможных рёбер
Andrey
)))
Oleg
В худшем случае для 1000 вершин будет чото типа 5000 рёбер
Oleg
http://m.wolframalpha.com/input/?i=log2%28C%285000%2C2500%29%29
Oleg
Это 5000 бит
Oleg
Ну вообще как видно C(n, n/2) растёт ненамного медленнее 2^n, так что можно считать n бит для комбинаций n/2 элементов из n
Andrey
Я бы хотел добить свой алгоритм, очень уж он мне кажется симпатичным
Andrey
только аналитический вид формулы получить
Oleg
Восстановление по порядковому номеру, как Александр посоветовал всё равно будет самым эффективным.
Это я помню с каких-то кодфорсес задач
Oleg
И выбрать k целых различных чисел в диапазоне без запоминания довольно простая задача
Andrey
вот ее то я с таким трудом и решаю
Andrey
надо обеспечить равномерность выборки, иначе взял К первых и все )
Oleg
А сколько k?
Oleg
Если k = 2^n - 1 совсем просто
Andrey
а Матлаб остался на старом компе с Виндой, тут мак и нифига нет (…
Oleg
Если другое - не совсем, но тоже несложно
Andrey
К - любое заданное юзером