Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

4 курс / Практика / Справочник по алгоритмам

.pdf
Скачиваний:
12
Добавлен:
17.04.2015
Размер:
627.78 Кб
Скачать

данных. Например, информация представлена в виде массива, хранящегося в оперативной памяти. В этом случае можно использовать прямой поиск с использованием непосредственного доступа по индексу элемента. Если используется ВЗУ с файловой системой, нужно учесть, что доступ к элементу файла возможен только через последовательный просмотр всех предыдущих элементов файла. Операционная система может предоставлять прямой доступ к файлам, но на физическом уровне он будет реализован через последовательный доступ. Только если используется низкоуровневый доступ к секторам диска, возможно реальное осуществление прямого доступа.

Существует аппаратный и программный поиск. Последний реализуется с помощью программ, составленным по алгоритмам поиска. В вычислительных системах, имеющих ассоциативные ЗУ, поисковые операции могут выполняться аппаратными средствами.

4.3. Последовательный поиск

Выполняется последовательное считывание записей массива, по каждой из которых принимается решение о выдачи в качестве результата в соответствии с аргументом поиска. Перед каждой процедурой считывания записи осуществляется проверка достижения конца массива. Среднее число операций сравнения – N/2 (N – объем массива). Если в информационный массив добавить N+1 запись, удовлетворяющую критерию выдачи, то проверку на конец массива можно исключить, заменив ее проверкой после получения результата.

4.4. Ускоренные методы поиска

Ускоренные методы поиска применяются для упорядоченных массивов. Метод исключения интервалов. К этой категории относят бинарный поиск,

при котором массив делится пополам и отбрасывается часть массива, заведомо не содержащая требуемую запись. Методы дихотомии, при которых последовательность делится на равные части и метод Фибоначчи, в котором последовательность делится на интервалы в пропорции чисел Фибоначчи. Для бинарного поиска максимальное количество сравнений log2 N , минимальное – 1, в среднем – log2 (N 1) .

4.5. Блочный поиск

массив разбивается на равные блоки. В процессе поиска сравнение производится с последней записью блока. Если определяется, что запись содержится в блоке, поиск производится внутри блока. Рекомендуется в качестве числа блоков использовать N . В этом случае количество сравнений в среднем равно N . Бинарный и блочный поиски применяют к массивам с записями фиксированной длины. Блочный поиск лучше бинарного в плане расчета индекса следующей анализируемой записи. В блочном поиске каждый из блоков может

быть поделен на подблоки, но использование более двух уровней делений нецелесообразно.

4.6. Поиск по двоичному дереву

Связанное хранение древовидных структур позволяет осуществить поиск в массивах с записями переменной длины. Поиск по дереву осуществляется в соответствии с принципами его формирования. Максимальное число сравнений равно количеству уровней дерева. Средние характеристики соответствуют бинарному поиску при наличии сбалансированного двоичного дерева.

4.7. Поиск с использованием прямого доступа к данным. Хеширование

Формируется хеш-функция, позволяющая преобразовать значение ключевого поля в адрес, например, если ключевое поле – целое число и в массиве присутствует N записей, то в качестве хеш-функции используется сложение по модулю N соответствующего количества цифр ключевого поля. Обычно тяжело подобрать хеш-функцию, дающую функциональное соответствие ключа и адреса. При получении адреса, совпавшего с ранее полученным для другой записи выполняется рехеширование, в качестве которого используется либо поиск первого свободного участка памяти, либо изначальное определение в качестве результата выполнения хеш-функции адреса блока участка памяти, внутри которого размещаются записи с одинаковыми значениями хеш-функции.

4.8. Многоаспектный поиск

При поиске с использованием аргумента с несколькими полями выполняют либо последовательно несколько одноаспектных поисков с образованием подмассивов, удовлетворяющих последовательно применяемым одноаспектным поискам, либо используют инвертированные массивы, упорядоченные каждый по своему ключу. Подмассивы, полученные в каждом из инвертированных массивов, используют в качестве аргументов операции пересечения, результат которой и будет результатом многоаспектного поиска.

4.9. Справочники

Для ускорения поиска в массивах на ВЗУ используют общие, единые и основанные на структуре сбалансированного дерева справочники.

Общий справочник

Для каждой записи основного массива создается одна справочная запись, содержащая значение ключевого поля записи и указатель на эту же запись в основном информационном массиве. Общий справочник упорядочивается по значению ключа и позволяет применить ускоренные методы поиска для определения адреса в основном массиве, по которому осуществляется доступ.

logN

Единый справочник

Основной массив упорядочивается по значению ключей, после чего делится на блоки. На каждый блок приходится одна статья, состоящая из поля ключа и поля указателя. Поле ключа содержит значение ключа последней записи блока, а поле указателя – адрес первой записи блока.

Справочник на основе сбалансированного дерева

Сбалансированным (Б-деревом) называется дерево, у которого количество уровней каждой из ветвей равно или отличается от соседнего на единицу.

Многоуровневый справочник строится по принципу наращивания сбалансированного дерева. Этот справочник называют индексом, а уровни справочника – уровнями индекса. Каждая вершина древовидного справочника представлена блоком из N ячеек памяти. В каждой ячейке размещается справочная запись, состоящая из поля ключа и поля указателя, связывающего каждую ячейку блока с порожденным блоком или с записью в основном массиве. Верхний уровень индекса делит весь информационный массив на N интервалов. Каждый из интервалов делится на N подинтервалов. Количество уровней индекса определяется как от объема массива. Количество сравнений равно количеству

уровней. Последняя ячейка каждого блока содержит значение ключа порожденной ячейки. Формирование справочника в зависимости от состояния текущего нижнего уровня производится следующим образом:

3 варианта

1.В соответствующем блоке нижнего уровня индекса есть свободная ячейка. В этом случае новая запись содержащая ключ и указатель размещается этой ячейке, при этом записи упорядочиваются по возрастанию ключа.

2.В нужном блоке нижнего уровня индекса отсутствует свободная ячейка. Записи нижнего уровня перемещаются в сторону ближней свободной ячейки другого блока. в освободившуюся ячейку добавляется новая запись, при этом корректируются по необходимости вышележащие уровни для сохранения правила о том, что значение ключа последней ячейки блок равно значению ключа порожденной ячейки.

3.Индекс нижнего уровня заполнен полностью. Для включения в дерево новой справочной статьи выделяется область памяти и

начинается формирование следующего уровня индекса. В последней ячейке вновь образованных блоков записываются значения ключей порожденных ячеек, а новая запись заносится в блок, наиболее подходящий по значению ключей.

Вопросы по теме

1.Основные принципы информационного поиска

2.Виды информационного поиска

3.Логика поиска

4.Стратегия поиска

5.Последовательный поиск

6.Ускоренные методы поиска. Блочный поиск и поиск по двоичному дереву.

7.Хеширование

8.Многоаспектный поиск

9.Справочники

10.Справочники на основе сбалансированного Б-дерева

5. Численные методы. Оптимизация функции одного аргумента

Оптимизация – нахождение наибольшего или наименьшего значения какой-либо функции, или выбор наилучшего варианта из множества возможных.

x* – точка минимума, если в ее окружности выполняется условие f(x)>f(x*). Необходимое условие минимума: значение первой производной в данной точке должно быть равным нулю. Достаточное условие минимума: вторая производная функции в этой точке больше нуля. Функция называется унимодальной, если на отрезке [a, b] имеется единственная точка, удовлетворяющая условию минимума.

5.1. Методы исключения интервалов

Оптимизационные задачи решаются определением двух ситуаций:

1.Определяется, является ли данная точка точкой минимума.

2.Если данная точка не является точкой минимума, то каким образом

можно достигнуть минимума.

Задача оптимизации функции одной переменной может быть решена методом исключения интервалов.

Дана функция f(x) унимодальная на [a, b]. Определить, является ли рассматриваемая точка точкой минимума, если нет, то каким образом ее достичь. Для функции одной переменной могут быть использованы методы, ориентированные на поиск минимума внутри интервала унимодальности путем последовательного исключения подинтервала и уменьшения интервала поиска, основанного на предположении о унимодальности, которое позволяет использовать значение функции в двух точках для определения подинтервала, содержащего точку оптимума. Пусть даны x1 и x2, такие, что a<x1<x2<b, тогда могут иметь место 3 варианта:

1.

f(x)

 

 

 

 

 

x

 

 

x* x

 

 

a x

1

2

b

 

 

 

 

f(x1)>f(x2)

x* [x1, b];

2.

 

 

f(x)

 

 

 

 

 

 

x

 

 

x*

 

 

 

a x

1

x

2

b

f(x1)<f(x2)

x* [a, x2];

3.

 

 

f(x)

 

 

 

 

 

 

 

x

 

 

 

x*

 

 

 

 

a x

1

x

2

b

 

 

 

 

 

 

f(x1)=f(x2)

 

x* [x1, x2].

 

 

Данное правило положено в основу группы методов исключения интервалов. Поиск оптимума завершается, когда интервал уменьшается до достаточно малых размеров. Все методы данной группы выполняются в два этапа: первый –

установление границ поиска; второй – уменьшение интервала.

На первом этапе выбирается начальная точка x0, затем подбирается относительно широкий интервал, содержащий точку оптимума. В качестве алгоритма определения границ можно использовать эвристический метод Свена. В

соответствии с этим методом, границы интервала определяются по рекуррентной формуле

xk+1=xk+2k , где k=0,1,2…

x0 – предварительно выбранная точка, – предварительно выбранная величина шага. Знак зависит от результата сравнения трех величин: f(x0-| |), f(x0), f(x0+| |). Возможны 4 варианта:

1.f(x0-| |) f(x0) f(x0+| |). Точка оптимума лежит левее x0.

2.f(x0-| |) f(x0) f(x0+| |). Точка оптимума лежит правее x0.

3.f(x0-| |) f(x0) f(x0+| |). Точка оптимума лежит внутри интервала, поиск завершен.

4.f(x0-| |) f(x0) f(x0+| |). Поиск минимума невозможен, т.к. функция не удовлетворяет условию унимодальности.

Определив , увеличиваем на каждом шаге его значение в два раза до тех пор, пока не будет истинным третье неравенство.

В зависимости от абсолютного значения варьируется эффективность поиска границ интервала. Большое значение дает более быстрый положительный результат, меньшее – дает меньшее значение интервала.

5.2. Метод деления отрезка пополам (метод дихотомии)

Данный метод позволяет исключить половину интервала на каждой итерации. Его реализация основана на выборе трех точек, равномерно распределенных в интервале поиска.

Алгоритм:

1.

Положить xn

a b

; l b a , вычислить

f (xn ) .

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

2.

Принять x

a

l

; x

 

b

l

, вычислить

f (x ) и f (x

) .

 

2

 

 

1

4

 

 

 

4

 

1

2

 

 

 

 

 

 

 

 

 

 

 

3.

Если f (x1 ) < f (xn ) , то исключить интервал xn , b , b x2 , xn x1 , перейти

 

на 5, иначе – 4.

 

 

 

 

 

 

a, xn , a xn , xn x2 ,

4.

Если f (x2 )

< f (xn )

 

,

то исключить

интервал

 

перейти на 5, иначе – исключить a, x1 ,

x2 , b , a x1, b x2 .

5.

Вычислить

l b a

,

если l , где

– точность вычислений,

 

определяемая как требуемая минимальная длина интервала, то конец,

 

иначе – 2.

 

 

 

 

 

 

 

 

 

 

 

 

 

Окончание алгоритма включает в себя x* x , f (x* ) f (x ) .

 

 

 

 

 

 

 

 

 

 

 

 

 

n

n

 

 

5.3. Метод Фибоначчи.

Алгоритм деления отрезка пополам не приводит за n вычислений значения функции к минимально возможному значению длины интервала. Алгоритм, обладающий этим свойством должен основываться на том, что для каждого вычисления функции исключается интервал наибольшей длины. Для этого, точки,

разбивающие интервал на три подинтервала, должны выбираться из соображения симметрии так, что на каждой следующей итерации будет использоваться значение одной из точек, вычисленной на предыдущей итерации. Для этого могут быть использованы значения членов ряда Фибоначчи, для которого k-й член ряда Fk = Fk-1+Fk-2, где k=3,4,5… F1=F2=1.

Если нужно достичь минимума за N шагов, то первая точка отрезка

выбирается как (a b)

Fn 1

, где Fn – N-й член ряда Фибоначчи. Вторая точка

F

 

 

 

n

 

выбирается как симметричная первой. На каждой итерации исключается один из подинтервалов и вторая точка выбирается из соображений симметрии.

5.4. Метод «золотого сечения»

Отношение соседних чисел ряда Фибоначчи при стремлении N к бесконечности стремится к пропорции золотого сечения. Отрезок можно считать разбитым в пропорции золотого сечения, если отношение большей части отрезка к меньшей его части равно отношению всего отрезка к его большей части. Величина

этого отношения равна

1

5

1,618 . Вычислив значение золотого сечения с

2

 

 

 

 

максимальной точностью, можно определить значение минимума с максимально допустимой точностью за минимальное число итераций.

Методы исключения интервалов применимы только для унимодальных функций, как непрерывных, так и дискретных.

Вопросы по теме

1.Задача оптимизации

2.Методы исключения интервалов

3.Эвристический метод Свена

4.Метод деления отрезка пополам

5.Метод Фибоначчи и метод «золотого сечения»

6. Генерация псевдослучайной последовательности.

Случайной называется величина из заданного диапазона, вероятность появления которой определяется функцией закона распределения. Пример: равномерное распределение дискретной случайной величины в диапазоне 1-6 – вероятность равна 1/6.

Получение действительно случайного значения возможно только в том случае, если используется физический или химический процесс в качестве задающего механизма. С помощью ЭВМ можно получить псевдослучайные последовательности. Для них характерно, что выбор одинаковых начальных значений приводит к генерации одинаковых последовательностей и существует такое N, что N+1 член равен первому члену последовательности.

В Си присутствуют функции, позволяющие генерировать последовательность псевдослучайных целых чисел, задавать начальное значение последовательности, задавать начальное значение случайным образом (в зависимости от системного времени).

Далее рассматриваются методы генерации псевдослучайных чисел.

6.1. Метод средних квадратов

а) Выбирается произвольное целое 2k-значное число x0, которое возводится в квадрат, в результате получается 4k-значное число, из него выбираются средние 2k знака, которые образуют следующее случайное число. Процедура повторяется нужное число раз.

б) Берутся два произвольных 2k-значных числа, которые перемножаются и дополняются до 4k-значности. Из середины берутся 2k знака, следующее число получается из произведения полученного числа и предыдущего.

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

6.2. Мультипликативный метод

Задаются константы C и m. Берется произвольное число, следующим псевдослучайным числом будет текущее, умноженное на C и разделенное по модулю m.

6.3. Аддитивный метод (генератор Фибоначчи)

Определяется цело число m. Берутся два целых числа. Следующее число равно сумме двух предыдущих, взятой по модулю m.

6.4. Линейный метод

Определяется набором целых чисел a[j], j [1,k] и целым m. Первоначально берутся k целых чисел. Следующее псевдослучайное число равно сумме по j от 1 до k произведений a[j]xi+1-j деленной по модулю m.

6.5. Комбинированный метод

Берется целое 2k-значное число x0. Число

x0’ представляет собой последние 2k разряда квадрата x0,

x0’’ – первые 2k разряда произведения C x0’ (С – целое число), x0’’’ – первые 2k разряда квадрата x0’’,

x0’’’’ – последние 2k разряда квадрата x0’’’, x0’’’’’ – сумма x0’’ и x0’’’’.

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

одинаковой.

Вопросы по теме

1.Случайные и псевдослучайные величины

2.Основные алгоритмы генерации псевдослучайной последовательности

7.Кодирование информации

7.1. Кодирование как средство криптографической защиты информации

Шифр простой подстановки

Буквы кодируемого сообщения прямо заменяются буквами того же или иного алфавита. Если сообщение состоит из k различных букв, то существует k! способов кодирования. В соответствии с тем, что для каждого языка известна вероятность присутствия каждой буквы в сообщении, шифр не обладает высокой степенью закрытости.

Шифр Вижинера

степень надежности повышается за счет нарушения статистического закона появления букв алфавита. Ключ – некоторая последовательность символов. Закодированное сообщение представляет собой символы, код которых получен суммированием по модулю длины алфавита кода буквы исходного сообщения и кода буквы ключа, который используется циклически для всего сообщения, если его длина меньше длины сообщения. Чем больше длина ключа, тем выше степень защиты.

Шифрование гаммированием.

Получение кодированного сообщения аналогично алгоритму Вижинера, но в качестве ключа используется псевдослучайная последовательность. Степень защиты выше, чем у шифра Вижинера, но если становится известна часть исходного сообщения, кодированное сообщение легко расшифровывается.

DES

сообщение представляется в виде последовательности бит, которые модифицируются с помощью последовательности операций сложения и сдвига. Ключ генерируется на этапе шифрования. DES-алгоритм основан на 64-битном ключе и в настоящее время не считается надежным, т.к. может быть раскрыт на современных ЭВМ.

ГОСТ-алгоритм

Обладает 256-битным ключом и в настоящее время считается лучшим алгоритмом шифрования.

Использование любых средств шифрования запрещено на территории всех стран без государственной лицензии.

7.2. Компрессия данных

Эффективное кодирование

Основная теорема Шеннона для передачи информации по каналу без помех:

1.При любой производительности источника сообщений, меньшей пропускной способности канала существует кодирование, позволяющее передать все сообщения, вырабатываемые источником.

2.Не существует способа кодирования, обеспечивающего передачу

сообщений без накопления информации, если производительность источника больше пропускной способности канала.

Эффективное кодирование основано на следующем положении: если символ повторяется в последовательности с вероятностью, максимальной для данного сообщения, то для его кодирования необходимо использовать минимальное число бит, а. символы, повторяющиеся реже, должны кодироваться большим количеством бит, тогда длина кодированного сообщения будет минимальной из возможных. Эта методика была предложена Шенноном и Фано. Получаемые коды переменной длины должны удовлетворять условию префиксности.

Код Шеннона-Фано

Строится алфавит сообщения. Для каждого символа определяется вероятность его появления в сообщении. Алфавит упорядочивается по значению вероятности. Затем алфавит делится на две группы таким образом, чтобы суммарная вероятность групп была примерно одинаковой. Первому биту кода символа присваивается ‘0’ для символов первой группы и ‘1’ для символов второй группы. Затем каждая группа рассматривается отдельно, процедура деления повторяется для вновь получившихся групп. Эта процедура заканчивается, когда в группе остается один символ

Код Хаффмана

Код Хаффмана обладает большей эффективностью по сравнению с кодом Шеннона-Фано, за счет того, что во время кодирования символы объединяются в группы, которые затем рассматриваются как отдельные символы алфавита, которые на каждом шаге переупорядочиваются в соответствии с новым значением вероятности групповых символов.