Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
infa.docx
Скачиваний:
16
Добавлен:
27.09.2019
Размер:
305.64 Кб
Скачать

37 Таблицы с прямым доступом.

  1. В 2х словах: ускорение работы с таблицей за счёт хеширования (перевода ключей элементов из литерной (символьной) формы в число, которое является указателем в памяти на этот элемент).

  2. {ведь обращение к элементу (чтение, запись, удаление) в конечном итоге есть обращение к памяти, так почему бы не начать сразу обращаться к памяти, пропуская сравнения ключей и всякое остальное}

  3. {для такого финта ушами нужно поместить таблицу с массив (доступ за постоянное время)}

  4. Для этого перевода нужна хеш-функция (отображение H ключей элементов в адреса памяти).

  5. Простейший пример хеш-функции: функция получения числового кода литера

  6. (если литеров несколько, то можно воспользоваться схемой Горнера: А = б + (i – 1) * sizeof(T), где б – адрес начала массива, i – индекс компоненты вектора, отсчитываемый от “1”, sizeof(T) – размер компоненты вектора).

  7. Проблема в том, что разные ключи могут соответствовать одному адресу. Такие случаи называются коллизиями.

  8. На такой случай нужно предусмотреть операцию рехеширования – переадресация, в случае занятости адреса (запись нового элемента) или в случая, когда по данному адресу находится элемент с другим ключом (чтение).{2 способа:

  9. организовать список строк с идентичным первичным ключом H(k) (этот список может расположить где душе угодно, но такой способ вызовет увеличение расхода памяти);

или, при занятости данной ячейки памяти, “впихнуть” наш элемент куда-нибудь рядом}

  1. Достоинства таблицы с прямым доступом (хеш-таблицы) в том, что при линейных сложностях операций хеширования и рехеширования можно обрабатывать таблицу (читать, искать, добавлять новый элемент и удалять старые) за постоянное время.

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

38 Алгоритмы сортировки. Сортировка называется устойчивым (стабильным), если в процессе сортировки относительное расположение элементов с равными ключами не изменилось.

  1. Характеристики методов сортировки

  2. Время — основной параметр, характеризующий быстродействие алгоритма. Называется также вычислительной сложностью. Для упорядочения важны худшее, среднее и лучшее поведение алгоритма в терминах размера списка (n). Для типичного алгоритма хорошее поведение — это O(nlogn) и плохое поведение — это O(n²). Идеальное поведение для упорядочения — O(n).

  3. Память — ряд алгоритмов требует выделения дополнительной памяти под временное хранение данных.

  4. Устойчивость (stability) — устойчивая сортировка не меняет взаимного расположения равных элементов.

  5. Естественность поведения — эффективность метода при обработке уже упорядоченных, или частично упорядоченных данных. Алгоритм ведёт себя естественно, если учитывает эту характеристику входной последовательности и работает лучше.

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

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

  8. В современных архитектурах персональных компьютеров широко применяется подкачка и кэширование памяти. Алгоритм сортировки должен хорошо сочетаться с применяемыми алгоритмами кэширования и подкачки.

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

  10. Категория сортировок входящие в раздел “внутренние” имеют прямые методы сортировок.

  11. Сортировка вставкой (устойчивая). Вставка элемента в на нужную позицию в уже отсортированном массиве.

Сортировка выборокой (не устойчивая). 1-ый элемент меняется местами с минимальным, далее 2-ой так же..

  1. Пузырьковая сортировка. 1-ый элемент сравнивается с соседним, если >, то меняются местами, если <, то берется тот элемент с кем происходило сравнение и сравнивают его, так пока не дойдем до конца. В 1-ой итерации всегда всплывет максимальный элемент.

  2. Сортировка Шелла. Выбирается интервал d, через которые будут сравниваться элементы в первый проход, к примеру 5, после полного прохода, берется новый интервал 3 и опять проход и так далее.

  3. Турнирная сортировка.

39 Сортировка вставкой. Преимущества данного алгоритма:

  1. 1)эффективен на небольших наборах данных, на наборах данных до десятков элементов может оказаться лучшим;

  2. 2)эффективен на наборах данных, которые уже частично отсортированы;

  3. 3)это устойчивый алгоритм сортировки (не меняет порядок элементов, которые уже отсортированы);

  4. 4)может сортировать список по мере его получения;

  5. 5)использует 0(1) временной памяти, включая стек.

Минусом же является высокая сложность алгоритма: 0(n^2).

  1. На каждом шаге алгоритма мы выбираем один из элементов входных данных и вставляем его на нужную позицию в уже отсортированном списке, до тех пор, пока набор входных данных не будет исчерпан Метод выбора очередного элемента из исходного массива произволен; может использоваться практически любой алгоритм выбора. Обычно (и с целью получения устойчивого алгоритма сортировки), элементы вставляются по порядку их появления во входном массиве. Приведенный ниже алгоритм использует именно эту стратегию выбора:

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

  2. {т.е. у нас есть 2 части массива: отсортированная и не отсортированная}

  3. {массив из одного или нуля элементов отсортирован!}

  4. сложность O(n^2)

  5. Вход: массив A, состоящий из элементов A[1], A[2], ..., A[n]

  6. for i = 2, 3, ..., n:

  7. key := A[i]

  8. j := i - 1

  9. while j > 0 and A[j] > key:

  10. A[j + 1] : = A[j]

  11. j := j - 1

  12. A[j + 1] : = key

40 Сортировка выборкой. Алгоритм сортировки может быть реализован и как устойчивый и как неустойчивый. На массиве из п элементов имеет время выполнения в худшем, среднем и лучшем случае О(n^2), предполагая что сравнения делаются за постоянное время. Шаги алгоритма:

  1. 1.находим номер минимального значения в текущем списке;

  2. 2.(только 8 устойчивых реализациях) если значения элементов неравны, то;

  3. 3.производим обмен этого значения со значением первой не отсортированной позиции;

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

Пример:

  1. void selectSort(T a[], long size) {

  2. long i, j, k;

  3. T x;

  4. for( i=0; i < size; i++) { // i - номер текущего шага

  5. k=i; x=a[i];

  6. for( j=i+1; j < size; j++) // цикл выбора наименьшего элемента

  7. if ( a[j] < x ) {

  8. k=j; x=a[j]; // k - индекс наименьшего элемента

  9. }

  10. a[k] = a[i]; a[i] = x; // меняем местами наименьший с a[i]

  11. }

  12. }

  1. 42 Сортировка Шелла. Первое улучшение алгоритма заключается в запоминании, производился и на данном проходе какой-либо обмен. Если нет - алгоритм заканчивает работу.

  2. Процесс улучшения можно продолжить, если запоминать не только сам факт обмена, но и индекс последнего обмена k. Действительно: все пары соседних элементов с индексами, меньшими k, уже расположены в нужном порядке. Дальнейшие проходы можно заканчивать на индексе k, вместо того чтобы двигаться до установленной заранее верхней границы i.

  3. Качественно другое улучшение алгоритма можно получить из следующего наблюдения. Хотя легкий пузырек снизу поднимется наверх за один проход, тяжелые пузырьки опускаются со минимальной скоростью: один шаг за итерацию. Так что массив 2 3 4 5 6 1 будет отсортирован за 1 проход, а сортировка последовательности 6 1 2 3 4 5 потребует 5 проходов.

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

  5. Выигрыш Шелла в том, что на каждом шаге либо сортируется мало элементов, либо они досортировываются.

Недостатки – не устойчивость и сложны математический анализ (до сих пор не найдена универсальная последовательность шагов, дающая минимальную сложность). Сложность O (n ^ (1+б) ), где б от “0” до “1”, что хуже, чем n * lnn

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]