
- •Программирование
- •В языках программирования
- •Примеры и контрпримеры
- •Примеры и контрпримеры
- •Определение
- •[Править]Примеры
- •8) Абстрактный автомат
- •Устройство машины Тьюринга
- •[Править]Описание машины Тьюринга
- •Пример машины Тьюринга
- •Метод "пузырька"
- •Сортировка вставками
- •Сортировка посредством выбора
- •Алгоритмы поиска
- •I, j: integer; { индексы массива }
- •16) В программировании [править]Функции
- •17) Перебор с возвратом
- •3.1 Использование рекурсии для записи алгоритма
- •3.2 Примеры решения задач при помощи перебора с возвратом
- •3.3 Возврат
- •Терминология и свойства
- •24) Топологическая сортировка — упорядочивание вершин бесконтурного ориентированного графа согласно частичному порядку, заданному ребрами орграфа на множестве его вершин. Пример
- •[Править]Алгоритм
- •[Править]Пример работы алгоритма
Сортировка посредством выбора
Идея сортировки с помощью выбора не сложнее двух предыдущих. На j-ом этапе выбирается элемент наименьший среди M[j], M[j+1],. . ., M[N](см. процедуру FindMin) и меняется местами с элементом M[j]. В результате после j-го этапа все элементы M[j], M[j+1],. . ., M[N]будут упорядочены.
Сказанное можно описать следующим образом:
нц для j от 1 до N-1 выбрать среди M[j],. . ., M[N] наименьший элемент и поменять его местами с M[j] кц
Более точно:
begin for j:=1 to N-1 do begin FindMin(j, i); swap(M[j],M[i]) end end; |
В программе, как уже было сказано, используется процедура FindMin, вычисляющая индекс lowindex элемента, наименьшего среди элементов массива с индексами не меньше, чемstartindex:
procedure FindMin(startindex: integer; var lowindex: integer); var lowelem: ...; u: integer; begin lowindex := startindex; lowelem := M[startindex]; for u:=startindex+1 to N do if M[u] < lowelem then begin lowelem := M[u]; lowindex := u end end; |
Оценивая эффективность применения , учтите что в демонстрации сортировки выбором отсутствует пошаговое выполнение этой процедуры.
14)
Алгоритмы поиска
Примеры поиска : поиск требуемого элемента в базе данных (телефонный справочник); поиск вхождения одного фрагмента текста в другой (сравнение двух текстов, антиреферат, поиск плагиата) и т.д. Результат поиска как правило булевский, или указание места расположения эле-мента. ЛИНЕЙНЫЙ ПОИСК Простейший алгоритм поиска - линейный. Эталонный массив просматривается последователь-но от первого до последнего элемента. Наихудший случай - слова нет в массиве (не найдено) – вывод можно сделать после просмотра всего массива. Достоинство – простота реализации. Недостаток – большое время. Если используется for всегда выполняется ровно n операций сравнения, независимо от того, найдено слово или нет. Разумно прекращать поиск если, слово найдено (если не требуется найти все вхождения слова). При равномерном распределении элементов в массиве среднее время поиска обычно пропор-ционально величине n/2. Во всех ниже изложенных алгоритмах будем считать, что производится поиск в массиве A из N целых чисел элемента, равного X. Различают первое вхождение элемента в список, последнее вхождение, все вхождения. ПОИСК С БАРЬЕРОМ Идея поиска с барьером : не проверять каждый раз в цикле условие достижения границы мас-сива. Это обеспечивают, установив в массиве: любой элемент, который удовлетворяет условию по-иска. Тем самым будет ограничено изменение индекса. В качестве баръера можно установить искомый элемент добавив его в конец массива. Достоинство: на одну проверку меньше в цикле. Выход из цикла, в котором теперь остается только условие поиска, может произойти либо на найденном элементе, либо на барьере. Таким образом, после выхода из цикла проверяется, не барьер ли мы нашли? Вычислительная сложность поиска с барьером меньше, чем у линейного поиска, но имеет тот же порядок. Существует два способа установки барьера: дополнительный элемент или вместо крайнего элемента массива. ДВОИЧНЫЙ (БИНАРНЫЙ) ПОИСК Алгоритм двоичного поиска используется только в упорядоченных массивах по требуемому свойству. Так при поиске числа с заданным значением необходимо иметь массив, упорядоченный по воз-растанию или по убыванию значений элементов. А, например, при поиске числа с заданной суммой цифр массив должен быть упорядочен по возрастанию или по убыванию сумм цифр элементов. Идея алгоритма: массив каждый раз делится пополам и выбирается та часть, где может нахо-диться нужный элемент. Деление продолжается пока подмассив больше одного элемента, после чего остается проверить этот оставшийся элемент на выполнение условия поиска. Существуют две модификации этого алгоритма для поиска первого и последнего вхождения. Все зависит от того, как выбирается средний элемент: округлением в меньшую или большую сторону. В первом случае средний элемент относится к левой части массива, а во втором - к правой. В алгоритме двоичного поиска размер фрагмента, где этот поиск должен продолжаться, каж-дый раз уменьшается примерно в два раза. Это обеспечивает вычислительную сложность алго-ритма порядка логарифма N по основанию 2, где N - количество элементов массива. ИНТЕРПОЛЯЦИОННЫЙ ПОИСК Предполагается, что массив упорядочен по величинам ключей элементов. Идея алгоритма: предполагается равномерное распределение величин в некотором их диапазо-не от u до l. Поэтому, зная величину Х ключа поиска, можно предсказать более точное положе-ние искомой записи, чем просто в середине некоторого отрезка файла. Интерполяционный по-иск ассимптотически предпочтительнее бинарного. Алгоритм основан на формуле i=l+trunc((u-l)*(X-K[l])/(K[u]-K[l])) Время t работы алгоритма оценивается формулой: t=a*logN ПОИСК минимума и максимума При поиске минимума или максимума используют дополнительную переменная min (или max): 1) промежуточной переменной присваивается значение первого числа из последовательности, т.е. принимается, что первое число является текущим минимумом (максимумом); 2) начиная со второго числа, производится сравнение этого числа со значением переменной min (или max) и если число из массива меньше min (больше max), то на место min (max) записыва-ется это число. Теперь это число будет текущим минимумом (максимумом); После просмотра всех чисел в переменной min (или max) будет находиться окончательное зна-чение минимума (или максимума).
15) Описание двумерного массива Паскаля.
Существует несколько способов объявления двумерного массива Паскаля.
Мы уже умеем описывать одномерные массивы, элементы которых могут иметь любой тип, а, следовательно, и сами элементы могут быть массивами. Рассмотрим следующее описание типов и переменных:
Пример описания двумерного массива Паскаля
Type
Vector = array [1..5] of <тип_элементов>;
Matrix= array [1..10] of vector;
Var m: matrix;
Мы объявили двумерный массив Паскаля m, состоящий из 10 строк, в каждой из которых 5 столбцов. При этом к каждой i -й строке можно обращаться m [ i ], а каждому j -му элементу внутри i -й строки – m [ i , j ].
Определение типов для двумерных массивов Паскаля можно задавать и в одной строке:
Type
Matrix= array [1..5] of array [1..10] of < тип элементов >;
или еще проще:
type
matrix = array [1..5, 1..10] of <тип элементов>;
Обращение к элементам двумерного массива имеет вид: M [ i , j ]. Это означает, что мы хотим получить элемент, расположенный в i -й строке и j -м столбце. Тут главное не перепутать строки со столбцами, а то мы можем снова получить обращение к несуществующему элементу. Например, обращение к элементу M [10, 5] имеет правильную форму записи, но может вызвать ошибку в работе программы.
Основные действия с двумерными массивами Паскаля
Все, что было сказано об основных действиях с одномерными массивами, справедливо и для матриц. Единственное действие, которое можно осуществить над однотипными матрицами целиком – это присваивание. Т.е.,если в программе у нас описаны две матрицы одного типа, например,
type
matrix= array [1..5, 1..10] of integer;
var
a , b : matrix ;
то в ходе выполнения программы можно присвоить матрице a значение матрицы b ( a := b ). Все остальные действия выполняются поэлементно, при этом над элементами можно выполнять все допустимые операции, которые определены для типа данных элементов массива. Это означает, что если массив состоит из целых чисел, то над его элементами можно выполнять операции, определенные для целых чисел, если же массив состоит из символов, то к ним применимы операции, определенные для работы с символами.
Ввод двумерного массива Паскаля
Для последовательного ввода элементов одномерного массива мы использовали цикл for, в котором изменяли значение индекса с 1-го до последнего. Но положение элемента в двумерном массиве Паскаля определяется двумя индексами: номером строки и номером столбца.
Это значит, что нам нужно будет последовательно изменять номер строки с 1-й до последней и в каждой строке перебирать элементы столбцов с 1-го до последнего. Значит, нам потребуется два цикла for , причем один из них будет вложен в другой.
Рассмотрим пример ввода двумерного массива Паскаля с клавиатуры:
type
matrix= array [1..5, 1..10] of integer;
var
a, : matrix;