Упорядоченное множество — различия между версиями
(→Наивная реализация на массиве) |
м (rollbackEdits.php mass rollback) |
||
(не показаны 32 промежуточные версии 3 участников) | |||
Строка 7: | Строка 7: | ||
* <tex>\mathrm {insert(set, elem)}</tex> {{---}} добавляет заданный элемент <tex>elem</tex> в подходящее место множества <tex>set</tex> (сохраняя свойство упорядоченности), | * <tex>\mathrm {insert(set, elem)}</tex> {{---}} добавляет заданный элемент <tex>elem</tex> в подходящее место множества <tex>set</tex> (сохраняя свойство упорядоченности), | ||
* <tex>\mathrm {delete(set, elem)}</tex> {{---}} удаляет элемент <tex>elem</tex> (сохраняя свойство упорядоченности), | * <tex>\mathrm {delete(set, elem)}</tex> {{---}} удаляет элемент <tex>elem</tex> (сохраняя свойство упорядоченности), | ||
− | * <tex>\mathrm {search(set, elem)}</tex> {{---}} получает на вход искомое значение элемента <tex>elem</tex> и возвращает | + | * <tex>\mathrm {search(set, elem)}</tex> {{---}} получает на вход искомое значение элемента <tex>elem</tex> и возвращает <tex>true</tex> при наличии элемента в множестве или <tex>false</tex> в противном случае, |
* <tex>\mathrm {minimum(set)}</tex> {{---}} возвращает минимальный элемент множества <tex>set</tex>, | * <tex>\mathrm {minimum(set)}</tex> {{---}} возвращает минимальный элемент множества <tex>set</tex>, | ||
* <tex>\mathrm {maximum(set)}</tex> {{---}} возвращает максимальный элемент множества <tex>set</tex>, | * <tex>\mathrm {maximum(set)}</tex> {{---}} возвращает максимальный элемент множества <tex>set</tex>, | ||
Строка 14: | Строка 14: | ||
== Наивная реализация на массиве == | == Наивная реализация на массиве == | ||
− | Упорядоченное множество <tex> | + | Упорядоченное множество <tex>s</tex>, содержащее <tex>n</tex> элементов, можно реализовать с помощью [[Сортировки | отсортированного]] массива <tex>elements[0..n-1]</tex>. |
− | Рассмотрим реализацию на примере отсортированного по | + | Рассмотрим реализацию на примере отсортированного по возрастанию целочисленного массива. |
<code> | <code> | ||
'''struct''' Set<T>: | '''struct''' Set<T>: | ||
'''int''' n <font color=green>// количество элементов множества</font color=green> | '''int''' n <font color=green>// количество элементов множества</font color=green> | ||
− | '''T'''[n] elements <font color=green>// массив элементов множества типа T</font color=green> | + | '''T'''[n] elements <font color=green>// массив элементов множества типа ''T''</font color=green> |
</code> | </code> | ||
Строка 27: | Строка 27: | ||
<code> | <code> | ||
'''func''' insert(Set<T> s, T elem): | '''func''' insert(Set<T> s, T elem): | ||
− | s.n = s.n + 1 | + | s.n = s.n + 1 <font color=green>// Увеличиваем количество элементов множества на единицу,</font color=green> |
− | + | <font color=green>// увеличиваем размер массива с элементами множества на единицу.</font color=green> | |
− | + | s.elements[s.n - 1] = elem <font color=green>// Вставляем ''elem'' в конец массива</font color=green> | |
− | + | '''int''' i = s.n - 1 | |
− | + | '''while''' s.elements[i] < s.elements[i - 1] <font color=green>// Сортируем массив,</font color=green> | |
− | + | swap(s.elements[i], s.elements[i - 1]) <font color=green>// пока ''elem'' не окажется в нужном месте.</font color=green> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</code> | </code> | ||
Время выполнения {{---}} <tex>O(n)</tex>. | Время выполнения {{---}} <tex>O(n)</tex>. | ||
Строка 52: | Строка 40: | ||
'''func''' delete(Set<T> s, T elem): | '''func''' delete(Set<T> s, T elem): | ||
'''int''' i = 0 <font color=green>// Устанавливаем счетчик на первый элемент.</font color=green> | '''int''' i = 0 <font color=green>// Устанавливаем счетчик на первый элемент.</font color=green> | ||
− | '''while''' | + | '''while''' i < s.n '''and''' s.elements[i] != elem <font color=green>// Ищем индекс элемента ''elem''.</font color=green> |
− | i | + | i++ |
'''if''' i != s.n <font color=green>// Если элемент найден, то</font color=green> | '''if''' i != s.n <font color=green>// Если элемент найден, то</font color=green> | ||
− | '''for''' j = i '''to''' s.n - 2 <font color=green>// сдвигаем все элементы массива, | + | '''for''' j = i '''to''' s.n - 2 <font color=green>// сдвигаем все элементы массива, большие ''elem'',</font color=green> |
− | s.elements[j] = s.elements[j + 1] <font color=green>// ( | + | s.elements[j] = s.elements[j + 1] <font color=green>// на одну позицию влево (elem удаляется).</font color=green> |
− | + | s.n = s.n - 1 <font color=green>// Уменьшаем число элементов массива на единицу.</font color=green> | |
− | |||
− | |||
− | |||
− | s.n = s.n - 1 <font color=green>// Уменьшаем | ||
− | |||
</code> | </code> | ||
Время выполнения {{---}} <tex>O(n)</tex>. | Время выполнения {{---}} <tex>O(n)</tex>. | ||
=== '''search''' === | === '''search''' === | ||
+ | Для нахождения результата используем [[Целочисленный двоичный поиск|бинарный поиск]]. | ||
+ | |||
<code> | <code> | ||
− | ''' | + | '''bool''' search(Set<T> s, T elem): |
− | + | '''int''' i = binSearch(s.elements, elem) | |
− | ''' | + | '''return''' s.elements[i] == elem <font color=green>// Сравниваем найденное значение с искомым...</font color=green> |
− | |||
− | |||
− | |||
</code> | </code> | ||
− | Время выполнения {{---}} <tex>O(n)</tex>. | + | Время выполнения {{---}} <tex>O(\log n)</tex>. |
+ | === '''minimum''' === | ||
+ | Первый элемент множества минимальный, так как массив отсортирован по возрастанию. | ||
− | |||
<code> | <code> | ||
'''T''' minimum(Set<T> s): | '''T''' minimum(Set<T> s): | ||
− | '''T''' min = s.elements[0 | + | '''T''' min = s.elements[0] |
− | + | '''return''' min | |
− | |||
− | |||
− | |||
− | '''return''' min | ||
</code> | </code> | ||
− | Время выполнения {{---}} <tex>O( | + | Время выполнения {{---}} <tex>O(1)</tex>. |
+ | === '''maximum''' === | ||
+ | Выполняется аналогично операции <tex>\mathrm {minimum(set)}</tex>. | ||
− | |||
<code> | <code> | ||
'''T''' maximum(Set<T> s): | '''T''' maximum(Set<T> s): | ||
− | '''T''' max = s.elements[ | + | '''T''' max = s.elements[s.n - 1] |
− | + | '''return''' max | |
− | |||
− | |||
− | |||
− | '''return''' max | ||
</code> | </code> | ||
− | Время выполнения {{---}} <tex>O( | + | Время выполнения {{---}} <tex>O(1)</tex>. |
+ | === '''successor''' === | ||
+ | В операции используется [[Целочисленный двоичный поиск|правосторонний бинарный поиск]], который вернет такое <tex>i</tex>, что <tex> s.elements[i - 1]\leqslant elem < s.elements[i] </tex>. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<code> | <code> | ||
'''T''' successor(Set<T> s, T elem): | '''T''' successor(Set<T> s, T elem): | ||
− | ''' | + | '''if''' elem > s.elements[s.n - 1] <font color=green>// Если элемент больше максимального,</font color=green> |
− | + | '''return''' ''null'' <font color=green>// возвращаем ''null''.</font color=green> | |
− | ''' | + | '''else if''' elem < s.elements[0] |
− | + | '''return''' min(s) <font color=green>// Если элемент меньше минимального, возвращаем минимальный элемент.</font color=green> | |
− | ''' | + | '''int''' i = binSearch(s.elements, elem) <font color=green>// Иначе ищем элемент, больший ''elem''.</font color=green> |
+ | '''return''' s.elements[i] | ||
</code> | </code> | ||
− | Время выполнения {{---}} <tex>O(n)</tex>. | + | Время выполнения {{---}} <tex>O(\log n)</tex>. Операция <tex>\mathrm{predecessor}</tex> выполняется аналогичным образом. |
− | |||
− | В случае, когда упорядоченность элементов коллекции не важна, возможно использование [[Хеш-таблица|''хешей'']]. | + | == Замечания == |
+ | * В случае, когда упорядоченность элементов коллекции не важна, возможно использование [[Хеш-таблица|''хешей'']]. | ||
== Примеры == | == Примеры == | ||
Строка 134: | Строка 100: | ||
* множество натуральных чисел <tex> \mathbb N </tex>, | * множество натуральных чисел <tex> \mathbb N </tex>, | ||
* множество целых чисел <tex> \mathbb Z </tex>, | * множество целых чисел <tex> \mathbb Z </tex>, | ||
− | * строки, отсортированные в лексикографическом порядке. | + | * строки, отсортированные в [[лексикографический порядок|лексикографическом порядке]]. |
== Источники информации == | == Источники информации == |
Текущая версия на 19:25, 4 сентября 2022
Упорядоченное множество (англ. 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
Для нахождения результата используем бинарный поиск.
bool search(Set<T> s, T elem):
int i = binSearch(s.elements, elem)
return s.elements[i] == elem // Сравниваем найденное значение с искомым...
Время выполнения — .
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
Время выполнения — .
successor
В операции используется правосторонний бинарный поиск, который вернет такое , что .
T successor(Set<T> s, T elem):
if elem > s.elements[s.n - 1] // Если элемент больше максимального,
return null // возвращаем null.
else if elem < s.elements[0]
return min(s) // Если элемент меньше минимального, возвращаем минимальный элемент.
int i = binSearch(s.elements, elem) // Иначе ищем элемент, больший elem.
return s.elements[i]
Время выполнения — . Операция выполняется аналогичным образом.
Замечания
- В случае, когда упорядоченность элементов коллекции не важна, возможно использование хешей.
Примеры
- Пустое множество ,
- множество натуральных чисел ,
- множество целых чисел ,
- строки, отсортированные в лексикографическом порядке.
Источники информации
- Кормен, Т., Лейзерсон, Ч., Ривест, Р., Алгоритмы: построение и анализ = Introduction to Algorithms / — 1-е изд. — Пер. с англ под ред. А. Шеня. — М.: МЦНМО, 2002.—960 с. — ISBN 5-900916-37-5
- Александров П. С. Введение в теорию множеств и общую топологию. — М.: Наука, 1977. — 368 с.
- Н. К. Верещагин, А. Шень. Часть 1. Начала теории множеств // Лекции по математической логике и теории алгоритмов. — 2-е изд., испр. — М.: МЦНМО, 2002. — 128 с.
- Википедия — Упорядоченное множество