Упорядоченное множество — различия между версиями
(→search) |
(→predecessor) |
||
Строка 87: | Строка 87: | ||
<code> | <code> | ||
'''T''' predecessor(Set<T> s, T elem): | '''T''' predecessor(Set<T> s, T elem): | ||
− | ''' | + | '''int''' i = binSearch(s.elements, elem) |
− | + | '''if''' s.elements[i] == elem '''and''' i != 0 <font color=green>// Элемент, предшествующий первому, не существует.</font color=green> | |
− | '''return''' s.elements[i - 1] | + | '''return''' s.elements[i - 1] |
− | '''else''' | + | '''else''' |
− | '''return''' ''null'' | + | '''return''' ''null'' |
</code> | </code> | ||
Время выполнения {{---}} <tex>O(\log n)</tex>. | Время выполнения {{---}} <tex>O(\log n)</tex>. |
Версия 23:40, 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):
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 с.
- Википедия — Упорядоченное множество