Лекция 2 Алгоритмы обработки данных.pptx
- Количество слайдов: 21
Алгоритмы обработки данных Лекция 2
Виды алгоритмов • • • Алгоритмы работы со структурами данных. Они определяют базовые принципы и методологию, используемые для реализации структур данных. К таким структурам относятся связные списки и строки, деревья, стеки и очереди. Алгоритмы сортировки, предназначенные для упорядочения массивов и файлов, имеют особую важность. С алгоритмами сортировки связаны, в частности, очереди по приоритету, задачи выбора и слияния. Алгоритмы поиска и выборки, предназначенные для поиска конкретных элементов в больших коллекциях элементов. К ним относятся основные и расширенные методы поиска с использованием деревьев и преобразований цифровых ключей, в том числе деревья цифрового поиска, сбалансированные деревья, хеширование, а также методы, которые подходят для работы с очень крупными файлами. Алгоритмы на графах полезны при решении ряда сложных и важных задач. Общая стратегия поиска на графах разрабатывается и применяется к фундаментальным задачам связности, в том числе к задаче отыскания кратчайшего пути, построения минимальногоостовного дерева, к задаче о потоках в сетях и задаче о паросочетаниях. Алгоритмы обработки строк включают ряд методов обработки (длинных) последователей символов. Поиск в строке приводит к сопоставлению с эталоном, что в свою очередь ведет к синтаксическому анализу. К этому же классу задач можно отнести и технологии сжатия файлов. Геометрические алгоритмы – это методы решения задач с использованием точек и линий (и других простых геометрических объектов), которые вошли в употребление достаточно недавно. К ним относятся алгоритмы построения выпуклых оболочек, заданных набором точек, определения пересечений геометрических объектов, решения задач отыскания ближайших точек и алгоритма многомерного поиска. Многие из этих методов дополняют простые методы сортировки и поиска.
Поиск • Поиск – получение конкретного фрагмента или фрагментов информации из больших объемов ранее сохраненных данных. Как и с случае алгоритмов сортировки, мы работаем с данными, разделенными на записи (элементы), каждая из которых имеет ключ, используемый при поиске. Цель поиска – отыскание элементов с ключами, значения которых соответствуют ключу поиска. • Структуру данных, в которой проводится поиск, можно рассматривать как таблицу символов (таблицу имен или таблицу идентификаторов) – структуру, содержащую ключи и данные, и допускающую две операции – вставку нового элемента и возврат элемента с заданным ключом. • Иногда таблицы символов называют словарями по аналогии с хорошо известной системой упорядочивания слов в алфавитном порядке: слово – ключ, его толкование – данные.
Методы поиска • Основные методы поиска: • Поиск с использованием индексации по ключам. Пусть ключи – различные небольшие числа. В этом случае простейший алгоритм поиска предполагает хранение элементов в массиве St, проиндексированном значениями ключей. Изначально массив проинициализирован значениями Null. Затем можно вставить элемент со значением K записав его в St[K] или найти его, обратившись к St[K]. Удалить элемент K можно записав в St[K] значение Null. • Последовательный поиск • Бинарный поиск
Последовательный и бинарный поиски Последовательный Sequential. Search(list. target, N) list список для просмотра target целевое значение N число элементов в списке for i=l to N do if (target=list[i]) return i end if end for return 0 Бинарный Binary. Search(list, target, N) list список для просмотра target целевое значение N число элементов в списке start=l end=N while start<=end do middle=(start+end)/2 select(Compare(list[middle]. target)) from case -1: start=middle+l case 0: return middle case 1: end=middle-l end select end while return 0
Сортировка • Цель сортировки – в переупорядочении элементов таким образом, чтобы элементы следовали в соответствии с четко определенными правилами (обычно это цифровой или алфавитный порядок). • На ряду с сортировкой массивов большой интерес представляет изучение методов сортировки связных списков (динамических структур). Однако большинство классических методов сортировки массивов обладают столь высокой степенью абстракции, что могут без труда быть применены к сортировке связных списков.
Методы сортировок • • • Можно выделить пять типов алгоритмов сортировки: Обменом – выполняются проходы по файлу с обменом местами элементов, до тех пор, пока файл не будет окончательно отсортирован. Вставками – отдельно анализируется каждый конкретный элемент, который затем помещается на надлежащее ему место среди других, уже отсортированных элементов Выбором – сначала отыскивается наименьший элемент массива, затем он меняется местами с элементом, стоящим первым в сортируемом массиве и т. д. Слиянием – сортируемый файл, расположенный во внешней памяти, разбивается на части, которые могут быть считаны в память, отсортированы каким-либо методом и записаны в отдельные временные файлы. Затем отсортированные временные файлы сливаются попарно с сохранением порядка сортировки. И так до тех пор, пока все временные файлы не будут объединены в один отсортированный файл. Сортировка деревом – сортируемые элементы добавляются в бинарное дерево. Отсортированный массив формируется путем концевого обхода построенного дерева.
Сортировка обменом Пузырьковая сортировка Основной принцип состоит в выталкивании маленьких значений на вершину списка в то время, как большие значения опускаются вниз. Алгоритм пузырьковой сортировки совершает несколько проходов по списку. При каждом проходе происходит сравнение соседних элементов. Если порядок соседних элементов неправильный, то они меняются местами. Каждый проход начинается с начала списка. Сперва сравниваются первый и второй элементы, затем второй и третий, потом третий и четвертый и так далее; элементы с неправильным порядком в паре переставляются. При обнаружении на первом проходе наибольшего элемента списка он будет переставляться со всеми последующими элементами пока не дойдет до конца списка. Bubble. Sort(list, N) list сортируемый список элементов N число элементов в списке number. Of. Pairs=N swapped. Element s=true while swapped. Elements do number. Of. Pairs=number. Of. Pairs-l swapped. Elements=false for i=l to numberdf. Pairs do if list[i] > list[i+l] then Swap(list[i] , list[i+l]) swapped. Elements=true end if end for end while
Сортировка вставками считает первый элемент любого списка отсортированным списком длины один. Двухэлементный отсортированный список создается добавлением второго элемента исходного списка в нужное место одноэлементного списка, содержащего первый элемент. Теперь можно вставить третий элемент исходного списка в отсортированный двухэлементный список. Этот процесс повторяется до тех пор, пока все элементы исходного списка не окажутся в расширяющейся отсортированной части списка. !При добавлении нового элемента в уже отсортированный список его стоит сразу вставлять в нужное место Insertion. Sort(list, N) list сортируемый список элементов N число элементов в списке for i=2 to N do new. Element=list[i] location=i-l while(location >= 1) and (list [location]>new. Element) do // сдвигаем все элементы, большие очередного list [location+l]=list[location] location=location-l end while list[location+1]=new. Element end for
Сортировка выбором Шаги алгоритма: • находим номер минимального значения в текущем списке • (только в устойчивых реализациях) если значения элементов неравны, то • производим обмен этого значения со значением первой неотсортированной позиции • теперь сортируем хвост списка, исключив из рассмотрения уже отсортированные элементы Selection_Sort (A [1. . n]) A[1. . n]) – массив размерностью n for i=1 to n-1 do imin= i for j =i+1 to n do if A[j]<A[imin] then imin= j temp =A[imin] A[imin]= A[i] A[i]= temp end if end for End for Return A end
Сортировка слиянием • Сортировка слиянием разбивает список на одноэлементные куски, а затем постепенно сливает их. • Merge. Sort разбивает список пополам при движении по рекурсии вниз, а затем на обратном пути сливает отсортированные половинки списка. • Merge. Lists, которая сливает эти два списка, в результате чего получается отсортированный список длины в два раза больше Merge. Sort(list, first, last) list сортируемый список элементов first номер первого элемента в сортируемой части списка last номер последнего элемента в сортируемой части списка if first<last then middle=(first+last)/2 Merge. Sort(list. first. middle) Merge. Sort(list, middle+l, last) Merge. Lists(list. first. middle, middle+l, last) end if
Характеристики сортировок Основной характеристикой алгоритма сортировки является время, затраченное на его выполнение. Так для массива из N элементов: • Сортировка выбором производит в среднем N^2 / 2 операций сравнения и N операций обмена • Сортировка вставками – в среднем N^2 / 4 сравнений и N^2 / 4 операций полуобмена (перемещений) и в два раза больше в наихудшем случае • Сортировка обменом (метод пузырька) – N^2 / 2 операций сравнения и N^2 / 2 обменов как в среднем так и наихудшем случае • Сортировка деревом – N * log (N) операций сравнения и N операций вставки
Алгоритмы на графах Граф — это абстрактное представление множества объектов и связей между ними. Графом называют пару (V, E) где V это множество вершин, а E множество пар, каждая из которых представляет собой связь (эти пары называют рёбрами). Граф может быть ориентированным или неориентированным. В ориентированном графе, связи являются направленными (то есть пары в E являются упорядоченными, например пары (a, b) и (b, a) это две разные связи). В свою очередь в неориентированном графе, связи ненаправленные, и поэтому если существует связь (a, b) то значит что существует связь (b, a).
Представление графов Матрица смежности Списки смежности
Алгоритмы на графах • Алгоритмы обхода • Алгоритм поиска минимального остовного дерева • Алгоритм поиска кратчайшего пути • И другие
Структуры данных Структура данных — программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных. Структуры данных: • Связный список • Стек, очередь • Деревья • И другие (http: //ru. wikipedia. org/wiki/%D 0%A 1%D 0%BF%D 0%B 8%D 1%81%D 0%BE%D 0%BA_%D 1%81%D 1%82%D 1%8 0%D 1%83%D 0%BA%D 1%82%D 1%83%D 1%80_%D 0%B 4%D 0%B 0%D 0%BD%D 1%8 B%D 1%85)
Связные списки • связный список — структура данных, состоящая из узлов, каждый из которых содержит как собственно данные, так и одну или две ссылки ( «связки» ) на следующий и/или предыдущий узел списка • Линейный список • Двунаправленный список • Кольцевой список
Стек (англ. stack — стопка) — структура данных, в которой доступ к элементам организован по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел» ). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.
Очередь • Очередь — структура данных с дисциплиной доступа к элементам «первый пришёл — первый вышел» (FIFO, First In — First Out). • Добавление элемента (принято обозначать словом enqueue — поставить в очередь) возможно лишь в конец очереди, выборка — только из начала очереди (что принято называть словом dequeue — убрать из очереди), при этом выбранный элемент из очереди удаляется. • Массив • Линейный список
Бинарное дерево поиска Двоичное дерево поиска - это двоичное дерево, для которого выполняются следующие дополнительные условия : • Оба поддерева — левое и правое, являются двоичными деревьями поиска. • У всех узлов левого поддерева произвольного узла X значения ключей данных меньше, нежели значение ключа данных самого узла X. • В то время, как у всех узлов правого поддерева того же узла X значения ключей данных не меньше, нежели значение ключа данных узла X.
К лекции 3 (к практике) • Кормен (Глава 11) • Макконел (Глава 2, 3, 6) • Роберт В Себеста Основные концепции языков программирования (глава 1, 2) • К практике – Синтаксис Assembler
Лекция 2 Алгоритмы обработки данных.pptx