Упорядоченное множество — различия между версиями
(→delete) |
(→Наивная реализация на массиве) |
||
Строка 14: | Строка 14: | ||
== Наивная реализация на массиве == | == Наивная реализация на массиве == | ||
− | Упорядоченное множество <tex> | + | Упорядоченное множество <tex>s</tex>, содержащее <tex>n</tex> элементов, можно реализовать с помощью отсортированного массива <tex>elements[0..n-1]</tex>. |
Рассмотрим реализацию на примере отсортированного по возрастанию целочисленного массива. | Рассмотрим реализацию на примере отсортированного по возрастанию целочисленного массива. | ||
Строка 60: | Строка 60: | ||
'''return''' ''null'' <font color=green>// возвращаем ''null''.</font color=green> | '''return''' ''null'' <font color=green>// возвращаем ''null''.</font color=green> | ||
</code> | </code> | ||
− | Время выполнения {{---}} <tex>O(log | + | Время выполнения {{---}} <tex>O(\log n)</tex>. |
=== '''minimum''' === | === '''minimum''' === | ||
Строка 93: | Строка 93: | ||
'''return''' ''null'' <font color=green>// возвращаем ''null''.</font color=green> | '''return''' ''null'' <font color=green>// возвращаем ''null''.</font color=green> | ||
</code> | </code> | ||
− | Время выполнения {{---}} <tex>O(log | + | Время выполнения {{---}} <tex>O(\log n)</tex>. |
=== '''successor''' === | === '''successor''' === | ||
Строка 106: | Строка 106: | ||
'''return''' ''null'' <font color=green>// возвращаем ''null''.</font color=green> | '''return''' ''null'' <font color=green>// возвращаем ''null''.</font color=green> | ||
</code> | </code> | ||
− | Время выполнения {{---}} <tex>O(log | + | Время выполнения {{---}} <tex>O(\log n)</tex>. |
== Замечания == | == Замечания == |
Версия 22:42, 30 июня 2015
Упорядоченное множество (англ. ordered set) представляет собой коллекцию элементов, каждому из которых присваивается определенный ключ, отвечающий за порядок этого элемента в множестве. Бинарное отношение на упорядоченном множестве является отношением порядка.
Вполне упорядоченным множеством, которое явяется важнейшим частным случаем, называется упорядоченное множество, каждое непустое подмножество которого содержит минимальный элемент.
Содержание
Операции над упорядоченным множеством
Над упорядоченным множеством
заданы следующие операции:- — добавляет заданный элемент в подходящее место множества (сохраняя свойство упорядоченности),
- — удаляет элемент (сохраняя свойство упорядоченности),
- — получает на вход искомое значение элемента и возвращает при наличии элемента в множестве или в противном случае,
- — возвращает минимальный элемент множества ,
- — возвращает максимальный элемент множества ,
- — возвращает элемент, стоящий перед элементом множества .
- — возвращает элемент, стоящий после элемента множества .
Наивная реализация на массиве
Упорядоченное множество
, содержащее элементов, можно реализовать с помощью отсортированного массива .Рассмотрим реализацию на примере отсортированного по возрастанию целочисленного массива.
struct Set<T>: int n // количество элементов множества T[n] elements // массив элементов множества типа T
insert
func insert(Set<T> s, T elem): s.n = s.n + 1 // Увеличиваем количество элементов множества на единицу, // увеличиваем размер массива с элементами множества на единицу. s.elements[s.n - 1] = elem // Вставляем elem в конец массива int i = s.n - 1 while s.elements[i] < s.elements[i - 1] // Сортируем массив, swap(s.elements[i], s.elements[i - 1]) // пока elem не окажется в нужном месте.
Время выполнения —
.delete
func delete(Set<T> s, T elem): int i = 0 // Устанавливаем счетчик на первый элемент. while i < s.n and s.elements[i] != elem // Ищем индекс элемента elem. i++ if i != s.n // Если элемент найден, то for j = i to s.n - 2 // сдвигаем все элементы массива, большие elem, s.elements[j] = s.elements[j + 1] // на одну позицию влево (elem удаляется). s.n = s.n - 1 // Уменьшаем число элементов массива на единицу.
Время выполнения —
.search
Для нахождения результата используем бинарный поиск.
T search(Set<T> s, T elem): if s.elements[0] <= elem && s.elements[s.n] >= elem // Если элемент elem существует, то int i = binSearch(s.elements, elem) // ищем индекс элемента elem return s.elements[i] // и выводим его значение. else // В противном случае return null // возвращаем null.
Время выполнения —
.minimum
Первый элемент множества минимальный, так как массив отсортирован по возрастанию.
T minimum(Set<T> s): T min = s.elements[0] return min
Время выполнения —
.maximum
Выполняется аналогично операции
.
T maximum(Set<T> s): T max = s.elements[s.n - 1] return max
Время выполнения —
.predecessor
Выполняется аналогично операции
.
T predecessor(Set<T> s, T elem): if s.elements[0] < elem && s.elements[s.n] >= elem // Если элемент elem существует и не равен минимальному, int i = binSearch(s.elements, elem) // то ищем индекс элемента elem return s.elements[i - 1] // и выводим предшествующий ему элемент. else // В противном случае return null // возвращаем null.
Время выполнения —
.successor
Выполняется аналогично операции
.
T successor(Set<T> s, T elem): if s.elements[0] <= elem && s.elements[s.n] > elem // Если элемент elem существует и не равен максимальному, int i = binSearch(s.elements, elem) // то ищем индекс элемента elem return s.elements[i + 1] // и выводим следующий за ним элемент. else // В противном случае return null // возвращаем null.
Время выполнения —
.Замечания
- В случае, когда упорядоченность элементов коллекции не важна, возможно использование хешей.
- Если задан массив с повторяющимися элементами, то в операциях и следует использовать левосторонний и правосторонний бинарный поиск соответственно.
Примеры
- Пустое множество ,
- множество натуральных чисел ,
- множество целых чисел ,
- строки, отсортированные в лексикографическом порядке.
См. также
Источники информации
- Кормен, Т., Лейзерсон, Ч., Ривест, Р., Алгоритмы: построение и анализ = Introduction to Algorithms / — 1-е изд. — Пер. с англ под ред. А. Шеня. — М.: МЦНМО, 2002.—960 с. — ISBN 5-900916-37-5
- Александров П. С. Введение в теорию множеств и общую топологию. — М.: Наука, 1977. — 368 с.
- Н. К. Верещагин, А. Шень. Часть 1. Начала теории множеств // Лекции по математической логике и теории алгоритмов. — 2-е изд., испр. — М.: МЦНМО, 2002. — 128 с.
- Википедия — Упорядоченное множество