Упорядоченное множество — различия между версиями
(→Наивная реализация на массиве) |
|||
Строка 14: | Строка 14: | ||
== Наивная реализация на массиве == | == Наивная реализация на массиве == | ||
− | Упорядоченное множество <tex>s</tex>, содержащее <tex>n</tex> элементов, можно реализовать с помощью отсортированного массива <tex>elements[0..n-1]</tex>. | + | Упорядоченное множество <tex>s</tex>, содержащее <tex>n</tex> элементов, можно реализовать с помощью [[Сортировки | отсортированного]] массива <tex>elements[0..n-1]</tex>. |
Рассмотрим реализацию на примере отсортированного по возрастанию целочисленного массива. | Рассмотрим реализацию на примере отсортированного по возрастанию целочисленного массива. |
Версия 23:50, 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
Для нахождения результата используем бинарный поиск.
bool search(Set<T> s, T elem):
int i = binSearch(s.elements, elem)
if s.elements[i] == elem // Сравниваем найденное значение с искомым...
return true
else
return false
Время выполнения — .
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):
int i = binSearch(s.elements, elem)
if s.elements[i] == elem and i > 0 // Элемент, предшествующий первому, не существует.
return s.elements[i - 1]
else
return null
Время выполнения — .
successor
Выполняется аналогично операции
.
T successor(Set<T> s, T elem):
int i = binSearch(s.elements, elem)
if s.elements[i] == elem and i < s.n - 1 // Элемент, следующий за последним, не существует.
return s.elements[i + 1]
else
return null
Время выполнения — .
Замечания
- В случае, когда упорядоченность элементов коллекции не важна, возможно использование хешей.
- Если задан массив с повторяющимися элементами, то в операциях бинарный поиск соответственно. и следует использовать левосторонний и правосторонний
Примеры
- Пустое множество ,
- множество натуральных чисел ,
- множество целых чисел ,
- строки, отсортированные в лексикографическом порядке.
Источники информации
- Кормен, Т., Лейзерсон, Ч., Ривест, Р., Алгоритмы: построение и анализ = Introduction to Algorithms / — 1-е изд. — Пер. с англ под ред. А. Шеня. — М.: МЦНМО, 2002.—960 с. — ISBN 5-900916-37-5
- Александров П. С. Введение в теорию множеств и общую топологию. — М.: Наука, 1977. — 368 с.
- Н. К. Верещагин, А. Шень. Часть 1. Начала теории множеств // Лекции по математической логике и теории алгоритмов. — 2-е изд., испр. — М.: МЦНМО, 2002. — 128 с.
- Википедия — Упорядоченное множество