- •Передачу параметров в функцию по значению, а не по ссылке (при этом передача по ссылке эмулируется с помощью указателей);
- •Области действия имён; (область видимости переменной).
- •Достоинства:
- •Представление целых чисел в эвм
- •Основные типы данных, операции над ними.
- •Операции
- •Преобразование типов
- •Особенности операций для вещественных чисел
- •3.1. Операторы и блоки.
- •3.2. Оператор if – else
- •3.3. Конструкция else-if.
- •3.4. Оператор switch
- •3.5. Циклы while и for
- •3.6. Цикл do-while
- •3.7. Операторы break и continue
- •3.8. Оператор goto и метки
- •3.9. Оператор return
- •Инвариант
- •Указатели
- •Массивы
- •Связь между указателями и массивами
- •Представление в эвм
- •Создание указателя на массив
- •Инициализация массивов
- •Операции над указателями
- •Замечание! 2 указателя нельзя суммировать, но можно прибавлять константу. Сравнивать допустимо только с указателями того же типа или с null
- •Метод барьера в линейном поиске
- •Метод барьера при быстрой сортировке массива
- •Сортировка методом вставки. В отсортированной части массива последний элемент – барьер.
- •Процедуры
- •Локальные и глобальные переменные
- •Локальные переменные
- •Глобальные переменные
- •Средний и наихудший случай
- •Дополнительно (то же самое)
- •Анализ эффективности алгоритмов не должен зависеть от:
- •Временная сложность алгоритма
- •Некоторые свойства временной сложности алгоритма (функции f(n) )
- •Характеристики рекурсии
- •Виды рекурсии
- •Когда не нужно применять рекурсию
- •Применение эвристик.
- •Метод ветвей и границ (доп. Из Wikipedia)
- •Алгоритм Неймана.
- •Линейный конгруэнтный метод
- •Выбор параметров, выбор модуля и множителя.
- •Сдвиг на несколько символов: Если не совпадает , то сдвигаем образ вправо до последнего его стоп-символа. Если «стоп-символа» вообще нет в образе, то образ смещается за этот символ.
- •Вопросы на экзамен по информатике:
- •Перевести отрицательное целое число (он любое может назвать) в дополнительный код.
- •Есть ли смысл применять метод барьера в поиске подстроки в строке?
- •Задачи на экзамене:
- •Задача о Ханойских башнях
- •Бинарный поиск элемента в массиве
- •Сумма цифр в числе
- •Число различных элементов в символьном массиве
- •Сгенерировать все перестановки в целочисленном массиве (Билет 1).
- •Функция, возвращающая I и j такие, чтобы сумма эл-тов в I-ой строке равнялась сумме в j-ом столбце.
- •Есть одномерный массив целых чисел и нужно построить функцию, получающую на вход вещественное число X и возвращающую индекс элемента, который ближе всего к этому числу.
- •Функция strcpy (char *s1, char *s2) , билет 12.
- •Реализация strcat(); Билет 7.
- •Билет 5. Функция, выдаёт частное и остаток от деления X на y, нельзя пользоваться / и % .
- •Метод генерации случайной перестановки ( Тасование Фишера-Йетса).(не ок)
Выбор параметров, выбор модуля и множителя.
Выбор
модуля m.
Нужно,
чтобы значение модуля было достаточно
большим, поскольку длина не может быть
больше модуля. Другой фактор – скорость
вычислений, нужно, чтобы быстрее
вычислялось. Потому можно взять m
равным размеру слова (т.е. на единицу
больше максимального целого числа,
помещающегося в слове вычислительной
машины). m
=
где k
– число битов в машинном слове. Это
позволяет избавиться от относительно
медленной операции приведения по
модулю. Но!
При выборе m
= 2^k
младшие цифры числа Хn
намного менее случайны, чем старшие.
Это можно показать:
Пусть d – делитель числа m. Yn = Xn mod d( Формула определяет новую последовательность остатков)
// дальше из лекции //
Y n+1 = (aYn + c) mod d.
Если m=w=2^k, то d=2^I, i<k. Отсюда младшие I бит образуют новую последовательность с периодом не превышающим 2^i, тогда младшие 4 бита числа Хn представляют число Yn = Xn mod 2^4. То есть младшие биты образуют кп с периодом меньше или равным 16. Тогда 5 битов периодичны с периодом самое большее 32. Самый младший бит Xn либо постоянен, либо строго периодически меняется от 0 до 1. Все степени двойки образуют собственные подпоследовательности.
Если m = 2^k +-1 – число нечётное, не будет такого д (степень двойки), нет собственных подпоследовательностей. Но мы не выбираем такой модуль, поскольку при этом большой мощности добиться не удаётся, потому что нужно с=0, а оно
Выбор множителя a.
Выберем множитель так, чтобы получить период максимальной длины. Когда период имеет длину m, то каждое число (0… m-1) встречается за период 1 раз.
Теорема 1. Длина периода ЛКП равна m тогда и только тогда, когда
С и m - взаимно простые числа. (НОД (с, m) =1.
(а-1) кратно р для любого р, если m кратно р и р – простое.
(а-1) кратно 4, если m кратно 4.
Эту
теорему доказывал Гринберг для случая
m
= 2^k
, для общего случая и достаточность
условий доказаны Халлом и Добеллом.
При
генерируемые числа будут иметь меньший
период, чем при
,
но при определенных условиях можно
получить период длинной
,
если
–
простое число. Тот факт, что условие
может
приводить к появлению более длинных
периодов, был установлен В. Е. Томсоном
и независимо от него А. Ротенбергом .
Чтобы
гарантировать максимальность цикла
повторения последовательности при
,
необходимо в качестве значения
параметра
выбирать
простое число, а это ограничивает длину
периода.
Чтобы упросить многие формулы, определим b = (a-1).
Случай, когда а=1. Тогда Xn = (Xo+nc)mod m, видно что последовательность не случайная. Ещё хуже,когда а=0.
Тогда а>=2, b>=1. Можем выразить (n+k)й член через n-й.
Xn+k = (a^k*Xn + (a^k-1)c/b)mod m, k>=0, n>=0.
Статистические свойства получаемой последовательности случайных чисел полностью определяются выбором коэффициентов a и c заданной разрядности машинного слова.
Младшие двоичные разряды сгенерированных таким образом случайных чисел демонстрируют поведение, далёкое от случайного (либо чередуется 010101, либо постоянен), поэтому рекомендуется использовать только старшие разряды.
Понятие мощности
Чуть раньше + страница 36 и далее Кнут 2 том.
Алгоритм выбора правильных параметров ЛКГ
1) Число X0 - произвольно. Хороший вариант – как srand(time(NULL))
2) m = 2k, где k — длина машинного слова. (Но нельзя брать младшие биты результата в качестве выходного значения).
3) а и с выбираются следующим образом: a mod c =5, c - нечетно. При этом достигаются максимальные значения периода и мощности.
4)
0,01m
0.99m
– а не очень большое и не очень маленькое,
а то если а маленькое, то первые числа
очень маленькие. a
не должно иметь неслучайный вид, по
крайней мере в 2й, 10й и 16й системах
счисления. (нельзя 1111, 12345 и т.д.).
5) Xn – не двоичные, а десятичные.
Стандартные параметры, которые и используются в компиляторе Borland C/C++:
m=232, a=22695477, c=1
Проверка генератора на случайность
Проверка качества полученной последовательности с помощью вероятностных тестов:
Подсчитать сумму бит в каждом разряде числа: генерируем n чисел, считаем сумму бит. Если она близка к n/2, то тест считается пройденным. Суть данного теста заключается в определении соотношения между нулями и единицами во всей двоичной последовательности. Цель — выяснить, действительно ли число нулей и единиц в последовательности приблизительно одинаковы, как это можно было бы предположить в случае истинно случайной бинарной последовательности. Тест оценивает, насколько близка доля единиц к 0,5. Таким образом, число нулей и единиц должно быть примерно одинаковым. Если вычисленное в ходе теста значение вероятности p < 0,01, то данная двоичная последовательность не является истинно случайной. В противном случае последовательность носит случайный характер. Стоит отметить, что все последующие тесты проводятся при условии, что пройден данный тест.
Другой тест, служащий для проверки генераторов псевдо-случайных чисел на криптостойкость. Тест гласит, что не должно существовать полиномиального алгоритма, который, зная первые k битов случайной последовательности, сможет предсказать k+1 бит с вероятностью большей ½.
В теории алгоритмов классом P (от англ. polynomial) называют множество алгоритмов, время работыкоторых не слишком сильно зависит от размера входных данных (не превосходит многочлена от размераданных). Алгоритмы, принадлежащие классу P, считаются быстрыми. Класс P включён в более широкиеклассы сложности алгоритмов.
Тесты
Кнута основаны на статистическом критерии
.
Вычисляемое значение статистики
сравнивается
с табличными результатами, и в зависимости
от вероятности появления такой статистики
делается вывод о ее качестве. Среди
достоинств этих тестов — небольшое
их количество и существование быстрых
алгоритмов выполнения. Недостаток —
неопределенность в трактовке результатов.
Вот краткое описание этих тестов:
2) Тест перестановок: генерируем n групп чисел по t элементов в каждой. Сопоставляем некоторую перестановку.
Данный тест проверяет равномерность распределения символов в исследуемой последовательности, анализируя взаимное расположение чисел в подпоследовательностях.
2.1.) Проверка комбинаций. Последовательность разбивается на подпоследовательности определённой длины, и исследуются серии, состоящие из различных комбинаций чисел.
Особенностью линейного конгруэнтного метода является то, что если сомножитель и модуль соответствующим образом подобраны, то результирующая последовательность чисел будет статистически неотличима от случайной последовательности. Однако, все элементы этой последовательности однозначно определяются четырьмя параметрами X0,a,c,m.
Если криптоаналитик знает об использовании алгоритма линейного конгруэнта, и если ему известны его параметры, то известной становится вся последовательность чисел. Однако, даже если криптоаналитик знает только о использовании алгоритма линейного конгруэнта, то информация о небольшой части последовательности достаточна для выявления параметров алгоритма и всех последующих чисел. В частности, если криптоаналитику известны значения X0,X1,X2,X3, то они удовлетворяют системе уравнений из которой можно получить значения параметров а, с и m. Поэтому, хотя линейный конгруэнтный метод порождает статистически хорошую псевдослучайную последовательность чисел, он не является криптографически стойким.
Билет 17. Алгоритм поиска подстроки в строке.
Поиск информации — одно из основных использований компьютера. Одна из простейших задач поиска информации — поиск точно заданной подстроки в строке. Тем не менее, эта задача чрезвычайно важна для любых систем обработки текстов.
Алгоритм прямого поиска:
Его можно определить как: Пусть у нас есть Char s [N], char p[M], M<<N, M>0 . Здесь S можно считать некоторым текстом, а Р – образом, или словом.
Поиск обнаруживает первое вхождение Р в Sl. Результат - индекс i, указывающий на первое с начала строки совпадение. Сам алгоритм основывается на повторяющихся сравнениях.
Int i=-1;
Int j=0;
while ( j < M && (++i) <= N-M)
{
j=0;
while ( j < M && s[ i+ j ] == p[ j ] ) j++;
}
Идея алгоритма:
Сравнить i-тый символ массива s[N] с первым символом массива p[M].
Если совпадение - сравнивать вторые символы.
Несовпадение – инкремент i и переход на п.1.
Условия окончания поиска:
Совпадают подряд M символов (подстрока найдена)
I+ M> N, то есть слово не найдено
Анализ прямого поиска:
Алгоритм достаточно эффективен, если несовпадение обнаруживается после немногих проверок.
C – число сравнений, R – мощность алфавита ( количество различных символов в алфавите).
Cmin = i+M (доходим до образца максимально быстро). aaaabaa и baa
Cmax = i*(M-1)+M (совпадают почти все, кроме последнего) ( i это i+1)
Ccp
=
примерно равно i+M
(С позиции i встречается образец).
Средний случай означает, что из множества R могут попасться любые символы.
Алгоритм Бойера — Мура.
Алгоритм основывается на сравнении символов с конца. Преимущество этого алгоритма в том, что ценой некоторого количества предварительных вычислений над шаблоном (но не над строкой, в которой ведётся поиск) шаблон сравнивается с исходным текстом не во всех позициях — часть проверок пропускаются как заведомо не дающие результата. Наиболее эффективен, если образец длинный, а мощность R велика.
Основные идеи алгоритма:
