Изменения

Перейти к: навигация, поиск

Упорядоченное множество

1282 байта убрано, 21:14, 30 июня 2015
Наивная реализация на массиве
Упорядоченное множество <tex>set</tex>, содержащее <tex>n</tex> элементов, можно реализовать с помощью массива <tex>elements[0..n-1]</tex>.
Рассмотрим реализацию на примере отсортированного по неубыванию возрастанию целочисленного массива.
<code>
<code>
'''func''' insert(Set<T> s, T elem):
s.n = s.n + 1 <font color=green>// Увеличиваем количество элементов множества на единицу,</font color=green> Array.Resize(s.elements, s.n) <font color=green>// увеличиваем размер массива с элементами множества на единицу.</font color=green> '''ifint''' elem % 2 =i = 0 <font color=green>// Если элемент elem четный, то,</font color=green> '''intwhile''' i = 0 <font color=green>// ставим счетчик элементов массива на первый элемент,</font color=green> s.n '''while&&''' elem > s.elements[i] < elem <font color=green>// увеличиваем счетчик до тех порИщем индекс первого элемента, пока не найдем первый элемент, больший большего elem,.</font color=green> i = i + 1+ '''for''' j s.n = s.n - 1 '''downto''' i+1 <font color=green>// сдвигаем все элементы, большие elem, Увеличиваем количество элементов множества на единицу вправо,</font color=green> s Array.elements[j] = Resize(s.elements[j - 1] s.elements[i] = elem <font color=green>// вставляем элемент elem в ту ячейку массива, на которую указывает счетчик,</font color=green> s.even = s.even + 1 n) <font color=green>// увеличиваем количество четных элементов размер массива с элементами множества на единицу.</font color=green> '''else''' <font color=green>// Если элемент elem нечетный, то,</font color=green> '''intif''' i != s.even n - 1 <font color=green>// устанавливаем счетчик на первый нечетный элементЕсли elem не максимальный,</font color=green> '''whileint''' elem < s.elements[i] <font color=green>// увеличиваем счетчик до тех пор, пока не найдем первый элемент, меньший elem,</font color=green> i = i + 1j '''for''' j = s.n - 1 2 '''downto''' i+1 <font color=green>// то сдвигаем все элементымассива, большие elem, на единицу вправо,</font color=green> s.elements[j+ 1] = s.elements[j - 1] s.elements[i] = elem <font color=green>// вставляем элемент elem в ту ячейку массива, на которую указывает счетчик,одну позицию вправо.</font color=green> s.odd elements[i] = s.odd + 1 elem <font color=green>// увеличиваем количество нечетных элементов на единицуВставляем elem в нужное место.</font color=green>
</code>
Время выполнения {{---}} <tex>O(n)</tex>.
'''func''' delete(Set<T> s, T elem):
'''int''' i = 0 <font color=green>// Устанавливаем счетчик на первый элемент.</font color=green>
'''while''' elem != i < s.n '''&&''' s.elements[i] && i < s.n != elem <font color=green>// Ищем элемент индекс элемента elem.</font color=green> i = i + 1+
'''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> '''if''' elem % 2 == 0 <font color=green>// Если удаленный элемент был четным, то</font color=green> s.even = s.even - 1 <font color=green>// уменьшаем количество четных элементов на единицу,</font color=green> '''else''' <font color=green>// в противном случае</font color=green> s.odd = s.odd - 1 <font color=green>// уменьшаем количество нечетных элементов.</font color=green> s.n = s.n - 1 <font color=green>// Уменьшаем общее число элементов массива на единицу.</font color=green>
Array.Resize(s.elements, s.n) <font color=green>// Удаляем дубликат последнего элемента.</font color=green>
</code>
=== '''search''' ===
Для нахождения результата используем бинарный поиск.
 
<code>
'''T''' search(Set<T> s, T elem):
int i '''forif''' i s.elements[0] <= 0 elem '''to&&''' s.elements[s.n - 1] >= elem <font color=green>// Если элемент elem существует, то</font color=green> '''ifint''' i = binSearch(s.elements[i] == , elem ) <font color=green>// Если элемент ищем индекс элемента elem существует,</font color=green> '''return''' s.elements[i] <font color=green>// то и выводим его,значение.</font color=green> '''else''' <font color=green>// В противном случае</font color=green> '''return''' ''null'' <font color=green>// в противном случае возвращаем ''null''.</font color=green>
</code>
Время выполнения {{---}} <tex>O(log n)</tex>.
<code>
'''T''' predecessor(Set<T> s, T elem):
'''intif''' i s.elements[0] < elem '''for''' i = 1 '''to&&''' s.elements[s.n - 1] >= elem <font color=green>// Если элемент elem существует и не равен минимальному,</font color=green> '''ifint''' elem =i = binSearch(s.elements[i] , elem) <font color=green>// Если в массиве находим елемент то ищем индекс элемента elem,</font color=green> '''return''' s.elements[i - 1] <font color=green>// то и выводим предшествующий ему элемент.</font color=green> '''else''' <font color=green>// В противном случае</font color=green> '''return''' ''null'' <font color=green>// Иначе выводим возвращаем ''null''.</font color=green>
</code>
Время выполнения {{---}} <tex>O(log n)</tex>.
<code>
'''T''' successor(Set<T> s, T elem):
'''intif''' i '''for''' i s.elements[0] <= 1 elem '''to&&''' s.elements[s.n - 1] > elem <font color=green>// Если элемент elem существует и не равен максимальному,</font color=green> '''ifint''' elem =i = binSearch(s.elements[i] , elem) <font color=green>// Если в массиве находим елемент то ищем индекс элемента elem,</font color=green> '''return''' s.elements[i + 1] <font color=green>// то и выводим следующий за ним элемент.</font color=green> '''else''' <font color=green>// В противном случае</font color=green> '''return''' ''null'' <font color=green>// Иначе выводим возвращаем ''null''.</font color=green>
</code>
Время выполнения {{---}} <tex>O(n)</tex>.
Анонимный участник

Навигация