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

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

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

1. Обработка строк

Строка обычно представляет собой особый вид информации, которая хранится в виде вектора из элементов типа "символ" и рассматривается как единое целое. Для хранения символа используется либо 1 байт, либо 2 байта. Над элементами строки определены те же операции, что и над символами. Если в языке программирования выделается понятие строки, то обычно в нем предусмотрены дополнения, которые отличают строку от вектора символов, при этом используется один из двух способов представления строки:

1. вектор символов дополняется специальным символом, который является признаком конца строки. В Си - это символ с кодом 0;

2. В строке вместе с символами храниться особый элемент, значение которого определяет длину строки. Например, в Pascal - это символ с индексом 0, код которого равен числу символов в строке. Т.о. строковый тип в Pascal позволяет хранить строки длиной от 0 до 255 символов, которые занимают от 1 до 256 байт.

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

1.1 Функции обработки строк

1. Создание строки.

Выделяется память в размере длины строки плюс 1. Затем посимвольно инициализируются элементы строки, и в конце записывается признак конца строки.

2. Тестирование элементов строки.

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

3. Длина строки.

Если форма хранения строки предполагает наличие ее длины, то необходимо считать длину. В Pascal’е необходимо обратиться к элементу с индексом 0.

В Си:

char *S; l=0;

while(*S++)l++;

4. Конкатенация (сцепление) строк.

Операндами этой функции являются 2 строки. Результатом является 1 строка,

в которой последовательно записана первая строка без признака конца строки и вторая строка.

Алгоритм:

Отводится память l1+l2+1, где l1, l2 – длины 1 и 2 строк. Используется 2 счетчика:

1 – для индекса результата

2 – для индексов исходных строк Организуется два цикла:

1 – с количеством итераций l1

2 – с количеством итераций l2+1

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

5. Нахождение подстроки в строке.

Аргументы: две строки; возвращаемое значение: 0 – вторая строка не встречается в первой, либо номер символа, начиная с которого вторая строка расположена в первой.

Алгоритм:

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

int i,j,A;

#define N 7 #define M 4

char x[M], y[N]; i=0;

do{

j=0;

do{

A=x[j]==y[j+i];

j++;

}

while(A&&(j<M));

if(j==M) return i;

i++;

}

while(!A&&(i<N-M)); return -1;

6. Сравнение строк.

Строка A больше строки B, если первый несовпадающий символ имеет код в первой строке больше, чем во второй. Строки могут сравниваться в зависимости от регистра и без этой зависимости.

Алгоритм аналогичен поэлементному сравнению векторов с дополнением для инвариантности к регистру (прописные, строчные буквы) фрагмента, приводящего обе строки к одному регистру.

7. Копирование строки.

Отводится память под новую строку, после чего ее элементам присваивается значение элементов исходной строки.

8.Определение количества заданных символов в строке.

Выполняется подсчет результатов сравнений.

9.Заполнение строки символами.

Аргументы: строка, символ или набор символов, количество повторений.

10, 11. Определение первого и последующего вхождений подстроки в строку.

Используется алгоритм из 5 с запоминанием в глобальной переменной результата текущего поиска для его использования в …

12. Функции смены регистра.

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

13. Функции преобразования из числовых типов в строчные и обратно.

Используются, если стандартные функции форматированного ввода-вывода не могут быть использованы.

14. Работа со специальными типами строк.

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

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

1.Строка как особый вид информации

2.Основные алгоритмы обработки строк

2. Процессы обработки информации

Большинство задач, связанных с обработкой и поиском информации, решаются быстрее, проще и эффективнее, если данные хранятся в памяти ЭВМ в определенном порядке.

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

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

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

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

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

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

Например, сортировка по алфавиту – упорядочивание по значению букв. При наличии операции сравнения строк упорядочивание производится по

строкам. В этом случае возможна сортировка по нескольким ключам.

Впроцессе сортировки, записи могут физически перемещаться в памяти

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

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

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

винформационном массиве требует пересортировки всех его инверсных копий.

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

Сортировка, как программное обеспечение, обычно поставляется в составе системного ПО, либо с ОС, либо со средствами разработки программ.

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

1.Сортировка, необходимость сортировки

2.Инверсные массивы

3.Критерии оценки различных методов сортировки

3. Методы сортировки линейных структур данных

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

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

3.1 Метод выбора.

void swap (int*, int*);

int minx (int*, int);

void main (){ int x[N], i;

for( i=0; i<N-1; i++) swap(x[i], x[minx (x, i)]);

}

void swap (int *A, int *B){ int S;

S=*A;

*A=*B;

*B=S;

}

int minx (int x[N], int i){ int j, max;

min=i;

for( j=i-1; j<N; j++) if(x[min] < x[j])

min=j; return min

}

3.2 Метод обмена.

#define N 100 int x[N];

int I, j; int NS;

for(i=N-1; i>0; i--){ NS=1;

for(j=0; j<i; j++) if(x[j] > x[j+1]){

swap(&x[i], &x[j+1]);

NS=0;

}

if(NS==1)

break;

}

}

N 2

Среднее число сравнений – 4

3.3 Метод подсчета

Не применим для массивов с повторяющимися элементами. Количество перестановок равно нулю, количество сравнений при каждом проходе – N2.

#define N 100

int i, j, k, A[N], B[N]; for(i=0; i<N; i++){

k=0;

for(j=0; j<N; j++) if(A[i]>A[j])

k++;

B[k]=A[i];

}

3.4 Метод Шелла

Год появления – 1959. представляет собой модификацию метода вставок. Упорядочиванию подвергаются не все элементы последовательности сразу, а элементы группы, члены которой определяются шагом. На первом проходе шаг принимается равным N/2 (N – количество элементов). В результате образуется N/2 групп по два элемента, если N четно и одна из одного элемента, если N нечетно. Метод вставок выполняется для каждой из групп, после чего шаг уменьшается в два раза и вызов метода вставок осуществляется для вновь образованных групп. Процедура повторяется до тех пор, пока не будет вызвана сортировка для группы с шагом один.

Алгоритм:

Программа использует подпрограмму метода вставок, получающую в качестве параметров адрес начала массива, шаг и количество элементов в массиве.

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

В основной программе используется два вложенных цикла. Цикл верхнего уровня для шага равного N/2 (деление нацело), пока шаг больше нуля. Модификация шага – шаг делится нацело на два.

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

3.5 Метод вставок

#define N 100

int A[N], B[N], i,j,k; for(i=0;i<N;i++){

for(j=0; j<i && A[i]>B[j]; j++) for(k=i; k>j; k--)

B[k]=B[k-1]; B[j]=A[i];

}

3.6 Древовидная сортировка

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

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

3.7 Внешняя сортировка

1 этап. Разбиение на участки возможной длины, которые сортируются по какому-либо алгоритму внутренней сортировки. Отсортированные участки разносятся по N внешним ЗУ.

2 этап. N-ленточное слияние. Данные с ВЗУ объединяются в единый массив с учетом присутствующей упорядоченности. После этого исходный массив опять разносится на N устройств. Процедура повторяется до тех пор, пока не будет получена полная упорядоченность. Размер упорядоченных групп возрастает после каждого слияния в N раз. Количество слияний – N.

3.8 Факторы, учитываемые при выборе метода сортировки.

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

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

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

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

4.Исходное распределение данных. В большинстве случаев распределение записей в исходной последовательности является случайным, т.е. любой из порядков следования ключей равновероятен, однако, является возможным, что процедура сбора данных обеспечивает частичное упорядочивание. Выявление закономерностей в исходном распределении записей позволит выбрать метод сортировки, обеспечивающий минимальное число сравнений при данном распределении ключей. Например, существует телефонная база, упорядоченная по значению поля Фамилия, для нее сформировано обновление, содержащее список новых абонентов. Метод – вставок или слияние.

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

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

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

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

1.Основные методы сортировки

2.Метод Шелла

3.Внешняя сортировка

4.Факторы, учитываемые при выборе метода сортировки

4.Поиск информации

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

Основной задачей информационного поиска является решение вопросов по соответствию данных, содержащихся в записи массива установленным критериям поиска. Например: существует файл, содержащий набор записей. Требуется вывести определенную запись из файла. Для этого файл должен быть просмотрен, а необходимая запись опознана. Для этого устанавливается, удовлетворяет ли эта запись запросу на поиск. В зависимости от запроса, аргумент поиска может иметь различную форму и степень сложности. В простом случае, когда необходимо найти запись, характеризующую объект, обладающий определенным признаком, аргументом поиска будет являться этот признак. Данный вид поиска называют одноаспектным. Если аргумент поиска содержит перечень признаков, то такой поиск называется многоаспектным. Аргумент может представлять из себя формулу булевой алгебры или теории множеств, содержать перечень признаков и логических операций над ними либо операции теории множеств (объединение, пересечение, разность).

Существуют следующие виды информационного поиска:

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

2.Поиск по интервалу. В отличие от поиска по совпадению, аргумент поиска содержит границы изменения значений признаков. Попадание в эти границы сигнализирует о выполнении условий запроса.

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

4.2. Логика и стратегия поиска.

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

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