- •Содержание
- •Введение
- •Структуры данных Классификация структур данных
- •Операции над данными
- •Понятие алгоритма
- •Массивы Описание массива
- •Представление массивов в памяти
- •Рис 1. Представление вектора в памяти
- •Рис 2. Представление вектора ml в памяти
- •Алгоритмы поиска
- •Алгоритмы сортировки
- •Пример сортировки простыми вставками.
- •Описание записи
- •Операции над записями
- •Записи с вариантами
- •Представление записи в памяти
- •Общие процедуры и функции для работы с файлами
- •Процедуры и функции для работы с типизированными файлами.
- •Сортировка содержимого файлов (Внешняя сортировка)
- •Пример внешней сортировки прямым слиянием
- •Пример внешней сортировки естественным слиянием
- •Динамическая память и данные с динамической структурой
- •Ссылочный тип в языке Pascal
- •Типизированные указатели
- •Нетипизированные указатели
- •Операции над переменными ссылочного типа.
- •Динамические списки
- •Реализация списков на языке Pascal.
- •Стек, очередь, дек
- •Рекурсия
- •Нелинейные структуры данных. Деревья
- •Бинарные деревья
- •Реализация бинарных деревьев
- •Способы обхода бинарных деревьев
- •Сортировка с прохождением бинарного дерева
Общие процедуры и функции для работы с файлами
Rename (<ф.п>, <новое имя>) заменяет имя файла, связанного с ф.п., на новое.
Erase (<ф.п>) уничтожает файл. Перед выполнением этой процедуры необходимо файл закрыть!
EOF (<ф.п>): Boolean — функция, тестирующая достигнут ли конец файла. True — если указатель стоит в конце файла. При записи это означает, что очередной компонент будет добавлен в конец файла, а при чтении — файл исчерпан.
EOLn (<ф.п>): Boolean — функция принимает значение True, когда достигнут конец строки при чтении файла.
При работе с файлами могут возникать динамические ошибки ввода/вывода. Поэтому необходимо предусмотреть обработку таких ситуаций. Для этого используют директиву компилятора {$I +/-} её смысл заключается в следующем: если директива отключена, то при возникновении динамической ошибки при попытке ввода/вывода НЕ ПРОИЗОЙДЕТ немедленного завершения программы.
Т.о., если возможна ошибка ввода/вывода, то перед выполнением операторов ввода/вывода эту директиву отключают {$I-}, а после выполнения — включают {$I+}. После включения, проверяют значение функции IOResult. Эта функция возвращает 0, если операторы ввода/вывода были выполнены успешно, и любое другое целочисленное значение, если возникли ошибки.
Замечание:
Вызов функции IOResult ОБЯЗАТЕЛЕН. Т.к. будут блокированы все дальнейшие действия до тех пор, пока она не будет вызвана.
var
FSt: file of String;
Begin
assign(FSt, 'someFile.dat');
{$I-}
reset(FSt);
{$I+}
if IoResulto<>0 then
write ('ошибка')
else
begin
writeln(fileSize(FSt));
а:='абв где ёжз';
write(FSt,s);
writeln(fileSize (FSt)) ;.'
close (FSt);
end;
End.
Процедуры и функции для работы с типизированными файлами.
Seek(<ф.п.>, <№>) устанавливает маркер считывания на элемент с заданным номером.
FilePos (<ф.п>) — функция, которая возвращает номер текущего элемента.
FileSize (<ф.п>) - функция, возвращающая текущий размер файла (количество записей).
Замечание: нумерация компонент файла начинается с нуля (0).
SeekEOF (<ф.п>): Boolean — функция, тестирующая достигнут ли конец файла. True - если указатель достиг конец файла (символ пробела и табуляции не учитывается).
SeekEOLn (<ф.п>): Boolean — функция принимает значение True, когда достигнут конец строки при чтении файла (символ пробела и табуляции не учитывается). Т.е. если в строке ещё остался пробел, то SeekEOLn(f) = True, a EOLn(f) = False.
Сортировка содержимого файлов (Внешняя сортировка)
Внешние сортировки - это сортировки, применяемые к данным, которые находятся во внешней памяти. В этом случае говорят, что данные представляют собой последовательный файл, состоящий из записей или элементов. В каждый момент непосредственно доступен для считывания только один элемент.
Примечание: если в случае необходимости сортировки данных из внешней памяти, есть возможность загрузить их в оперативную память и упорядочить эти данные там, тогда рекомендуется использовать её, поскольку время обращения к оперативной памяти гораздо меньше, чем время обращения к внешней памяти.
Большинство внешних сортировок основано на слиянии частично упорядоченных вспомогательных файлов.
Слияние означает объединение 2-ух (или более) последовательностей в одну единственную упорядоченную последовательность с помощью повторяющегося выбора из доступных в данный момент элементов. Вводиться понятие серии. Серия — это упорядоченная последовательность элементов. Длина серии — количество элементов серии. Отрезок, состоящий из одного элемента, упорядочен всегда.
Суть: сначала серии распределяются на два или несколько вспомогательных файлов. Распределение серий идёт поочередно, т.е. 1-ая серия записывается в 1-ый вспомогательный файл, 2-ая — во 2-ой и т.д. После того, как произошла запись в последний файл, опять начинается запись серии 1-ый вспомогательный файл. После распределения всех серий, они объединяются в более длинные упорядоченные отрезки: из каждого вспомогательного файла берётся по одной серии, и они сливаются. Если в каком то файле серия заканчивается, то следующая пока не рассматривается. Сформированная более длинная серия записывается либо в исходный файл, либо в какой-то из вспомогательных файлов, это зависит от вида выбранной сортировки. После того, как все серии из всех вспомогательных файлов объединены в новые серии, опять начинается их распределение. Так продолжается до тех пор, пока все данные не будут упорядочены.
Простое слияние
Не обращая внимания на содержимое заданного исходного файла, его рассматривают как состоящий из серий длиной 1. Разделяя этот файл на два и, производя их слияние, получают упорядоченные пары, т.е. серии длиной 2. На следующих шагах упорядоченные пары сливаются в упорядоченные четвёрки, четвёрки сливают в восьмёрки и т.д. Весь процесс повторяется до тех пор, пока не будет упорядочен весь файл. Таким образом на k-ом каждом проходе длина серии удваивается, причём если длина исходного файла n не является степенью 2, то последняя серия будет иметь число элементов равное n-2k.
В качестве улучшения алгоритма может служить использование внутренней сортировки в качестве вспомогательной. В этом случае на 1-ом проходе часть данных (фиксированное количество) переписывается в оперативную память, и там упорядочивается. Т.о. сразу формируется серия большой длины, и для дальнейшего слияния потребуется меньшее количество проходов.
Условия окончания сортировки простым слиянием:
- длина серии не меньше количества элементов в файле (после фазы слияния);
- количество серий - одна (на фазе слияния).