Программирование >>  Операторы преобразования типа 

1 ... 100 101 102 [ 103 ] 104 105 106 ... 239


его правильнее было бы включить в список алгоритмов упорядоченных интервалов (см. с. 330). Но на практике алгоритм merge() также успешно справляется со слиянием неупорядоченных интервалов. Конечно, результат тоже оказывается неупорядоченным. И все же для надежности стоит вызывать merge() только для упорядоченных интервалов.

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

Кроме модифицирующих алгоритмов в стандартной библиотеке C+-i- выделена отдельная группа модифицирующих алгоритмов для упорядоченных интервалов. Подробности приведены иа с. 330.

Алгоритмы удаления

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

Таблица 9.4. Алгоритмы удаления

Название

Описание

Страница

removeO

Удаляет элементы с заданным значением

removeJfO

Удаляет элементы по заданному критерию

remove copyO

Копирует элементы, значение которых отлично от заданного

remove copy ifO

Копирует элементы, не соответствующие заданному критерию

uniqueO

Удаляет смежные дубликаты (элементы, равные своему предшественнику)

unique copy()

Копирует элементы с удалением смежных дубликатов

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

Перестановочные алгоритмы

Перестановочными алгоритмами называются алгоритмы, изменяющие порядок следования элементов (но не их значения) посредством присваивания и пере-



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

Таблица 9.5. Перестановочные алгоритмы

Название

Описание

Страница

reverseO

Переставляет элементы в обратном порядке

reverse copy()

Копирует элементы, переставленные в обратном порядке

rotateO

Производит циклический сдвиг элементов

rotate copv()

Копирует элементы с циклическим сдвигом

nextj)ermutation()

Переставляет элементы

prev permutation()

Переставляет элементы

random shuffle()

Переставляет элементы в случайном порядке

partitionO

Изменяет порядок следования элементов так, что элементы, соответствующие критерию, оказываются спереди

stable partition()

То же, что и partitionO, но с сохранением относительного расположения элементов, соответствующих и не соответствующих критерию

Алгоритмы сортировки

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

Таблица 9.6. Алгоритмы сортировки

Название

Описание

Страница

sortO

Сортирует все элементы

stable sort()

Сортирует с сохранением порядка следования равных элементов

partial sort()

Сортирует до тех пор, пока первые п элементов не будут упорядочены правильно

nth element()

Сортирует элементы слева и справа от элемента в позиции п

partitionO

Изменяет порядок следования элементов так, что элементы, соответствующие критерию, окаэывакэтся спереди

Сложность операций рассматривается на с, 37.



Глава 9.

Алгоритмы STL

Таблица 9.6 (продолжение)

Название

Описанив

Страница

stable partition()

To же, что и partitionO, но с сохранением относительного расположения элементов, соответствующих и не соответствующих критерию

make heap()

Преобразует интервал в кучу

push heap()

Добавляет элемент в кучу

pop heap()

Удаляет элемент из кучи

sort heap()

Сортирует кучу (которая после вызова перестает бьп-ь кучей)

Алгоритмы сортировки часто критичны по времени, поэтому стандартная библиотека С++ содержит несколько алгоритмов, различающихся по способу сортировки или составу сортируемых элементов (полная/частичная сортировка). Например, алгоритм nth element() прекращает работу, когда п-й элемент после-довательности занимает правильное место в соответствии с критерием сортировки. Для остальных элементов он гарантирует только то, что предшествующие элементы имеют меньшее либо равное, а последующие элементы - большее либо равное значение. Сортировка всех элементов осуществляется перечислеи-пыми ниже алгоритмами.

О sort(). Исторически этот алгоритм основан иа механизме быстрой сортировки, гараитируюгдем хорошую среднестатистическую сложность (nxlog(n)), но очень плохую (квадратичную) сложность в худшем случае:

/* Сортировка всех элементов

* - средняя сложность n*log(n)

* - квадратичная сложность п*л в худшем случае */

sort (coll .beginO. coll.endO):

Если в вашей ситуации очень важно избежать худших случаев, воспользуйтесь другим алгоритмом, например partial sort() или stable sort().

О partiaLsort(). Исторически этот алгоритм основан на механизме сортировки в куче (heapsort), гарантирующем сложность nxlog(n) в .любом случае. Тем не менее обычно сортировка в куче выполняется в 2-5 раз медленнее быстрой сортировки. Итак, с учетом реализаций sort() и partial SGrt(), алгоритм partiaLsort() лучше по сложности, по по скорости работы sort() обычно превосходит его. Преимущество алгоритма partiaLsort() заключается в том, что сложность nxlog(n) гарантирована и никогда не ухудшается до квадратичной сложности.

Алгоритм partial sort() также обладает особым свойством: он прекращает сортировку, когда требуется отсортировать только п первых элементов. Чтобы отсортировать все элементы, передайте конец последовательности во втором и в последнем аргументах:

/* Сортировка всех элементов

* - всегда сложность n*log(n)



1 ... 100 101 102 [ 103 ] 104 105 106 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика