
minesweeper.pptx
- Количество слайдов: 29
Minesweeper и теория кодирования А. Гуфан, 2014
О чем будет рассказано, почему и зачем ● по содержанию - рассказ об одном эпизоде из жизни: решении искусственной задачи ● по подразумеваемому смыслу - нечто вроде предложения перенять поведенческий шаблон ● лично мне недоставало таких вещей в студенческие годы ● думаю, некоторым будет полезно или хотя бы интересно посмотреть, как оно иногда бывает
Minesweeper
Стартовая расстановка мин задача: расставить k мин в n ячейках очевидный алгоритм: последовательно ставить случайным образом, каждый раз проверяя, свободно ли очередное поле. ● проверка на каждом шаге ● ожидаемое количество шагов (и проверок!) сложным образом растет с ростом k
Стартовая расстановка мин
Стартовая расстановка мин P=0. 01 P=0. 000001 P=0. 0000000001
Стартовая расстановка мин задача: расставить k мин в n ячейках очевидный алгоритм: последовательно ставить случайным образом, каждый раз проверяя, свободно ли очередное поле. ● проверка на каждом шаге ● ожидаемое количество шагов (и проверок!) сложным образом растет с ростом k ожидаемое количество шагов можно посчитать. проще это сделать, начав с оценки количества заминированных полей после m случайных шагов без проверок на поле из n ячеек обычно такие задачи на практике решаются начиная с выписывания нескольких первых значений. тогда можно попробовать угадать решение и доказать, что оно подходит.
Ожидаемое количество шагов Проверяем:
Ожидаемое количество шагов теперь можно посчитать, сколько приблизительно придется сделать шагов (m), чтобы получилось нужное количество мин (k):
Ожидаемое количество шагов
Стартовая расстановка мин • • вообще-то нужно исследовать немного более подробно: помимо матожидания нужна, как минимум, дисперсия, чтобы знать, на что можно рассчитывать в реальности. неплохо выглядит вариант “гибридного” вероятностного алгоритма: расставить сначала сколько-то не глядя, а потом аккуратно, уже с проверками, довести количество мин до k. детерминированный алгоритм: • • можно попробовать брать [псевдо]случайную точку напрямую из пространства сочетаний из n по k. для этого введем какое-нибудь отношение порядка и будем выбирать элемент упорядоченного списка сочетаний по его [псевдо]случайно сгенерированному номеру - числу из интервала от 1 до значения длины списка. хранить упорядоченный список нерационально: в нем было бы слишком много элементов, а нужен из них только один. будем вместо этого пытаться преобразовывать сгенерированный [псевдо]случайный номер в сам элемент списка.
Лексикографический порядок 0 10 1 11 2 12 3 13 4 14 5 . . . 6 . . . 7 25 8 26 9 27
Лексикографический порядок 0 00000011 10 00100001 1 00000101 11 0010 2 00000110 12 00100100 3 00001001 13 00101000 4 00001010 14 00110000 5 00001100 . . . 6 0001 . . . 7 00010010 25 10010000 8 00010100 26 10100000 9 00011000 27 11000000
Алгоритм преобразования номера сочетания в само сочетание для начала выясним, чем является номер сочетания в последовательности относительно характеристик самого сочетания. номер - это [количество сочетаний, стоящих в списке выше “нашего”] - 1. посчитаем, сколько сочетаний стоит выше - узнаем номер. ● сочетаний, совпадающих с “нашим” левее позиции номер n 1 будет ● совпадающих левее позиции n 2 - ● … итого: штук.
Отступление в сторону: вычисление биномиальных коэффициентов “по определению” вычислять плохо: нужно вычислять факториалы, перемножать и делить длинные числа. можно попробовать воспользоваться приближением Стирлинга: в принципе это должно быть довольно быстро. но такими формулами обычно пользуются в задачах вроде асимптотических оценок, где по самой постановке проблемы достаточно этого “O”. нам же нужно получать значения биномиальных коэффициентов. на какую точность можно рассчитывать?
Отступление в сторону: вычисление биномиальных коэффициентов
Отступление в сторону: вычисление биномиальных коэффициентов на самом деле проще всего вычислять так:
Алгоритм преобразования номера сочетания в само сочетание
Алгоритм преобразования номера сочетания в само сочетание n=7, k=4, №=30 n 1=6, № 1=15 n 2=5, № 2=5 n 3=3, № 3=2 n 4=2, № 4=0
При чем здесь кодирование 0 00000011 10 00100001 1 00000101 11 0010 2 00000110 12 00100100 3 00001001 13 00101000 4 00001010 14 00110000 5 00001100 . . . 6 0001 . . . 7 00010010 25 10010000 8 00010100 26 10100000 9 00011000 27 11000000
При чем здесь кодирование 0 00000011 1010 00100001 1 00000101 1011 0010 10 00000110 1100 00100100 11 00001001 1101 00101000 100 00001010 1110 00110000 101 00001100 . . . 110 0001 . . . 111 00010010 110010000 1000 00010100 110100000 1001 00011000 11011 11000000 1 -5 бит 8 бит
Какие проблемы придется решить при разработке формата хранения данных ● что должно храниться в “заголовке”: ○ длина блока данных? или это константа? ○ количество единиц в кодируемой последовательности ● как разделять поля - экономно, но надежно: ○ префиксное кодирование? ○ специальная последовательность бит? ● - неудобная граница для двоичного числа ○ нельзя ли тут сэкономить? ●. . .
Грубая оценка эффективности сжатия бит данных, из них единиц. Относительное количество последовательностей с заданным количеством единиц: Итого в среднем бит на запись количества единиц.
Грубая оценка эффективности сжатия Для каждого конкретного количества единиц закодированная информация будет представлена битами данных. Сколько в среднем?
Грубая оценка эффективности сжатия Для каждого конкретного количества единиц закодированная информация будет представлена битами данных. Сколько в среднем?
Грубая оценка эффективности сжатия ~ итого n 10 2. 871093750 5. 451171875 8. 5 100 6. 003226989 93. 68925026 99. 7 300 7. 995369400 292. 9057539 301 500 8. 311404717 492. 5188577 501 ● “случайные” данные (а последовательностей, похожих на случайные, большинство) обычно почти не сжимаются. плюс плохой “протокол”. ● приличное сжатие можно получить на достаточно разреженных последовательностях.
Как решают задачи
Как решают задачи
Контакты https: //vk. com/solertia_rostov http: //news. studhack. ru/