- •Методы программирования
- •Структуры данных. Деревья.
- •Прошитые бинарные деревья
- •Представление деревьев в виде бинарных деревьев
- •Структуры данных. Линейные списки.
- •Пользовательские интерфейсы
- •Сортировка и поиск
- •Методы сортировки выбором
- •Сортировка простым выбором.
- •Сортировка квадратичным выбором
- •Сортировка кубическим выбором
- •Естественное двухпутевое слияние
- •Методы сортировки подсчётом
- •Пирамидальная сортировка
- •Сортировка убывающими вставками. Метод Шелла
- •Метод Хоара
- •Поразрядная обменная сортировка
- •Методы поиска
- •Методы поиска среди упорядоченных данных
- •Семестр 2
- •Алгоритмы
- •Обход графа в глубину
- •Обход графа по уровням
- •Транзитивное замыкание
- •Поиск сильносвязных компонентов в графе
- •Поиск кратчайших путей
- •Минимальное остовное дерево
- •Генерация случайных чисел
- •Другие методы генерации последовательностей
- •Статистические критерии
- •Эмпирические критерии
- •Технологии параллельных вычислений
- •Порождение сочетаний, перестановок, кодов Грея
- •Программирование защиты от ошибок
- •Проверка допустимости промежуточных результатов
- •Сквозные просмотры
- •Метод оценки программ
- •Метод структурного тестирования
- •Функциональное тестирование
Генерация случайных чисел
Метод фон-Неймана.
577215649^2 = 33317[792380594]909201
Линейный конгруэнтный метод
Формула линейного конгруэнтного метода: X_n+1 = (a*x_n+c) mod m
X_0 = seed
Все величины не должны превышать m.
m = 10, x_0 = a = c = 7
7,6,9,0,7,6,9,0...
Если c = 0, то называют мультипликативный конгруэнтный метод, иначе — смешанным.
Ситуация с a = 1 считается плохой. Желательно m брать больше.
Выбор множителя с т.з. периода максимальной длины. Если Aи C = 1, период максимален, но случайности нет.
Теорема.
Линейная конгруэнтная последовательность, определённая числами m,a,x0 имеет период длины m тогда и только тогда, когда числа c и m взаимно простые (нет общих множителей, кроме 1), b = a-1 кратно p для каждого простого p, являющегося делителем m. B кратно 4, если m кратно 4.
m=153, a=52,c=19
a = z^k + 1
z <= k < e
x_n+1 = ((z^k+1)x_n+1) mod z^e
z — основание системы счисления
Потенциал линейной конгруэнтной последовательности с максимальным периодом это наименьшее целое s, такое, что b^s \eq 0 mod m.
Пример:
m = 2^35
b^2 = 2^(2*18) = 2^36
Если потенциал <4, последовательность неудачная.
Другие методы генерации последовательностей
Квадратичный конгруэнтный метод
X_n+1 = (dx_n^2 + a*x_n + c) mod m
Метод Ковэю
X0 mod 4 = 2
X_n+1 = x_n*(1+x_n) mod 2^e
Фибоначчи
x_n+1 = (xn + x_n-1) mod m
Длина периода m^2
x_n+1 = (x_n + x_n-k) mod m
k рекомендуется брать большим.
Метод Митчела и Мура
x_n = (x_n-2 + x_n-55) mod m , n >= 55
m — чётное, x0,x1,... - все целые.
Период 2^55 — 1
Обратная конгруэнтная последовательность
x_n+1 = (a*x_n^-1 + c) mod m
Статистические критерии
Число Пи = 3,14159265358979323846264338327950
Теоретические критерии
Критерий хи-квадрат
Рассмотрим ситуацию. Две игральных кости.
S = 2 3 4 5 6 7 8 9 10 11 12
Ps = 1/36 1/18 1/12 1/9 5/36 1/6 5/36 1/9 1/12 1/18 1/36
n=144
S = 2 3 4 5 6 7 8 9 10 11 12
Ys = 2 4 10 12 22 29 21 15 14 9 6
n*Ps= 4 8 12 16 20 24 20 16 12 8 4
V = (Y2 — nP2)^2 + (Y3-nP3)^2 + … + (Y12-nP12)^2
V = sum_s=1^(k=11): (Ys — nPs)^2 / n*Ps
Y1 + Y2 + … + Yk = n
P1 + P2 + … = 1
V = 1/n * sum_s=1^k: (Ys^2/Ps)-n
|
P=1% |
P=5% |
P=25% |
P=50% |
P=75% |
P=95% |
P=99% |
\nu = 1 |
0.00016 |
|
|
|
|
|
6,6 |
\nu = 2 |
0,6 |
|
|
|
|
|
0,2 |
\nu = 5 |
2,6 |
|
|
|
|
|
15,1 |
\nu = 10 |
7,6 |
|
6,7 |
|
|
18,3 |
23,2 |
... |
|
|
|
|
|
|
|
\nu = 20 |
|
|
|
|
|
|
|
\nu = 50 |
29,7 |
|
|
|
|
|
76,2 |
В нашем случае число степеней свободы \nu = 10 (число вариантов -1)
Значение на пересечении (\nu = 10) = 18,3 для столбца, показывающую величину 95%, означает, что значения критерия хи-квадрат не будет превышать 18,3 в 95% случаев.
Можно провести 3 эксперимента. Если из 3 экспериментов два оказались подозрительными, то последовательность не является случайной. Подозрительные - \nu < 1%, либо \nu > 99%
Критерий Колмогорова-Смирнова
F(x) = P(X <= x)
N независимых наблюдений X1,X2,...,Xn. Упорядочиваем по возрастанию.
Kn+ = \sqrt(n) * max_(1<=j<=n) (j/n — F(x))
Kn- = \sqrt(n) * max_(1<=j<=n) (F(x_j) — (j-1)/n)