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