Spam291203 Ответов: 2

Как мне реализовать этот алгоритм для больших чисел?


Рассмотрим следующий алгоритм, который генерирует (не обязательно равномерно) случайную перестановку чисел от 1 до N:

P := [1, 2, ..., N]
for i in 1..N do
j := rand(1, N)
swap(P[i], P[j])

Здесь rand(1, N) возвращает равномерно случайное целое число от 1 до N включительно. Обозначим вероятность того, что перестановка, сгенерированная этим алгоритмом, равна P на p(P).

Найти перестановки P1, такой, что Р(П1) является максимально возможной и перестановки Р2, таких, что Р(Р2) является минимально возможной.

Что я уже пробовал:

Я грубо форсировал его до N=7 и отвечал с помощью предварительного расчета, но для большего N (N<=17) ot застревает. O(N^17)!

Как я могу реализовать этот код?

Кроме того, существует ли какая-либо формула для вычисления вероятности того, что число заканчивается на определенном индексе в неравномерной линейной перетасовке?

Spam291203

Любая помощь будет оценена по достоинству!

2 Ответов

Рейтинг:
2

KarstenK

Для генерации случайных чисел вы можете использовать функция rand Он должен быть инициализирован перед первым вызовом с srand. Может быть, вы тоже посмотрите на это Учебник по C++ когда вам понадобятся дополнительные базовые знания.d

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

Удачи тебе с домашним заданием. У него есть цель, которая ВЫ узнайте больше об этом материале.


Spam291203

Я думаю, что вы неправильно поняли этот вопрос. Я не спрашивал, как сгенерировать случайное число.
Дело в том, чтобы найти перестановку, которая имеет минимальную вероятность быть сгенерированной при выборе случайных чисел в линейной сортировке.
Проверьте эти сайты: https://blog.codinghorror.com/the-danger-of-naivete/

https://www.quora.com/Why-does-shuffling-array-by-iterating-over-it-and-swapping-it-with-a-random-element-between-0-to-the-last-element-of-the-array-not-produce-a-uniformly-distributed-shuffle

Проверьте ответ Шанкера С.

Надеюсь, вы понимаете, в чем именно заключается мое домашнее задание!

KarstenK

Это определенно не вопрос кодирования (для чего сделан этот форум), а какая-то высокоуровневая статистическая проблема.

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

Это ваша главная работа?

Spam291203

Поверьте мне, это вопрос кодирования.

Я не знаю, что вы подразумеваете под мастерством работы!

Spam291203

оператор импорта

N = 10
Р = []
для i в диапазоне(1, N + 1):
P += [i]
д = {}
для ind1 в диапазоне(N):
lv1 = P
Л. В. 1[0], Л. В. 1[ind1] = Л. В. 1[ind1], Л. В. 1[0]
для ind2 в диапазоне(N):
лв2 = Л. В. 1
lv2[1], lv2[ind2] = lv2[ind2], lv2[1]
для ind3 в диапазоне(N):
сайту lv3 = лв2
сайту lv3[2], сайту lv3[ind3] = сайту lv3[ind3], сайту lv3[2]
для ind4 в диапазоне(N):
lv4 = сайту lv3
lv4[3], lv4[ind4] = lv4[ind4], lv4[3]
для ind5 в диапазоне(N):
lv5 = lv4
lv5[4], lv5[ind5] = lv5[ind5], lv5[4]
для ind6 в диапазоне(N):
lv6 = lv5
lv6[5], lv6[ind6] = lv6[ind6], lv6[5]
для ind7 в диапазоне(N):
lv7 = lv6
lv7[6], lv7[ind7] = lv7[ind7], lv7[6]
для ind8 в диапазоне(N):
lv8 = lv7
lv8[7], lv8[ind8] = lv8[ind8], lv8[7]
для ind9 в диапазоне(N):
lv9 = lv8
lv9[8], lv9[ind9] = lv9[ind9], lv9[8]
для ind10 в диапазоне(N):
lv10 = lv9
lv10[9], lv10[ind10] = lv10[ind10], lv10[9]
s = " ".join(map(str, lv10))
если в д:
d[s]+=1
еще:
d[s]=1
d = сортировка(d.items(), key=operator.itemgetter(1))
print(d[0])
печать(D[-1])

Это код грубой силы, который я написал для N=9. Есть ли способ оптимизировать это? Кстати, код написан на Python!

Рейтинг:
1

Member 13979697

Это проблема с онлайн-конкуренцией в России. codechef.com, речь идет о нарушениях Кодекса поведения codechef


Patrice T

Ca, вы даете ссылку на конкурс ?