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