Упорядоченное множество — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Наивная реализация на массиве)
Строка 1: Строка 1:
{{Определение
+
'''Упорядоченное множество''' (англ. ''ordered set'') представляет собой коллекцию элементов, каждому из которых присваивается определенный ключ, отвечающий за порядок этого элемента в множестве. Бинарное отношение на упорядоченном множестве является [[отношение порядка|отношением порядка]].
|definition =
 
'''Упорядоченное множество''' <tex>Set</tex> представляет собой коллекцию элементов <tex>elem</tex>, каждому из которых присваивается определенный ключ <tex>key</tex>, отвечающий за порядок этого элемента в множестве. Бинарное отношение <tex>R</tex> на упорядоченном множестве <tex>Set</tex> является [[отношение порядка|отношением порядка]].
 
}}
 
''Вполне упорядоченным множеством'', которое явяется важнейшим частным случаем, называется упорядоченное множество, каждое непустое подмножество которого содержит минимальный элемент.
 
  
==Операции над упорядоченным множеством==
+
'''Вполне упорядоченным множеством''', которое явяется важнейшим частным случаем, называется упорядоченное множество, каждое непустое подмножество которого содержит минимальный элемент.
 +
 
 +
== Операции над упорядоченным множеством ==
 
Над упорядоченным множеством <tex>Set</tex> заданы следующие операции:
 
Над упорядоченным множеством <tex>Set</tex> заданы следующие операции:
=== Insert ===
+
* <tex>\mathrm {insert(Set, elem, elemKey)}</tex> {{---}} добавляет заданный элемент <tex>elem</tex>, имеющий ключ <tex>elemKey</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>.
  
=== Delete ===
+
== Наивная реализация на массиве ==
Функция <tex>\mathrm {delete(Set, key)}</tex> удаляет элемент, имеющий ключ <tex>key</tex> (сохраняя свойство упорядоченности).
+
Упорядоченное множество, содержащее <tex>n</tex> элементов, можно реализовать с помощью массива <tex>elements[0..n-1]</tex>. Оно будет обладать следующими полями:
 +
* <tex>elem</tex> {{---}} элемент множества,
 +
* <tex>key</tex> {{---}} ключ элемента.
  
=== Search ===
+
<code>
Функция <tex>\mathrm {search(Set, key)}</tex>, которая получает на вход искомый ключ <tex>key</tex>, и возвращает указатель на элемент множества <tex>Set</tex> или специальное значение <tex>null</tex>, если такого элемента нет.
+
'''struct''' Set<T>:
 
+
'''int''' n                            <font color=green>//количество элементов множества</font color=green>
=== Minimum ===
+
'''T'''[] elements                    <font color=green>//массив элементов множества типа T</font color=green>
Функция <tex>\mathrm {minimum(Set)}</tex> возвращает указатель на минимальный элемент множества <tex>Set</tex>.
+
</code>
 
 
=== Maximum ===
 
Функция <tex>\mathrm {maximum(Set)}</tex> возвращает указатель на максимальный элемент множества <tex>Set</tex>.
 
 
 
=== Predecessor ===
 
Функция <tex>\mathrm {predecessor(Set, elem)}</tex> возвращает указатель на элемент, стоящий перед элементом <tex>elem</tex> множества <tex>Set</tex>.
 
 
 
=== Successor ===
 
Функция <tex>\mathrm {successor(Set, elem)}</tex> возвращает указатель на элемент, стоящий после элемента <tex>elem</tex> множества <tex>Set</tex>.
 
 
 
==Наивная реализация на массиве==
 
Пусть <tex>Set</tex> — упорядоченное множество (массив), состоящее из <tex>n</tex> элементов. В
 
<tex>Set[1, i]</tex> хранятся элементы множества, в <tex>Set[2, i]</tex> — их ключи.
 
  
Функция <tex>\mathrm {insert(Set, elem, elemKey)}</tex>:
+
=== '''insert''' ===
 
<code>
 
<code>
  '''func''' insert(Set, elem, elemKey):
+
  '''func''' insert(Set, elem, key):
     n = n + 1
+
     Set.n = Set.n + 1                     <font color=green>//Увеличиваем размер массива на единицу</font color=green>
    Array.Resize(Set[2], n)
+
     Set.elements[key] = elem              <font color=green>//и добавляем элемент с ключом key.</font color=green>
    i = n - 1
 
    Set[1, i] = Set[1, i - 1]
 
     Set[2, i] = Set[2, i - 1]
 
    '''while''' elemKey < Set[2, i - 1]
 
        Set[1, i - 1] = Set[1, i - 2]
 
        Set[2, i - 1] = Set[2, i - 2]
 
        i = i - 1
 
    Set[1, i] = elem
 
    Set[2, i] = elemKey
 
 
</code>
 
</code>
 +
Время выполнения {{---}} <tex>O(1)</tex>.
  
Функция <tex>\mathrm {delete(Set, key)}</tex>:
+
=== '''delete''' ===
 
<code>
 
<code>
 
  '''func''' delete(Set, key):
 
  '''func''' delete(Set, key):
    i = 0
+
     '''if''' key < Set.n - 1                                <font color=green>//Если key {{---}} не последний элемент,</font color=green>
     '''while''' Set[2,i] < key && i < n
+
         '''for''' i = key '''to''' Set.n - 2                      <font color=green>//то сдвигаем все элементы множества, начиная с key, влево.</font color=green>
         i = i + 1
+
             Set.elements[i] = Set.elements[i + 1]
    '''if''' i < n
+
        Set.n = Set.n - 1                             <font color=green>//Затем удаляем последний элемент (уменьшаем количество элементов множества на единицу).</font color=green>
        '''if''' i < n - 1
 
            Set[1, j] = Set[1, j + 1]
 
             Set[2, j] = Set[2, j + 1]
 
    n = n - 1
 
    Array.Resize(Set[2], n)
 
 
</code>
 
</code>
 +
Время выполнения {{---}} <tex>O(n)</tex>.
 +
  
Функция <tex>\mathrm {search(Set, key)}</tex>:
+
=== '''search''' ===
 
<code>
 
<code>
  '''int''' search(Set, key):
+
  '''T''' search(Set, key):
     '''for''' i = 0 '''to''' n - 1
+
     '''for''' i = 0 '''to''' Set.n - 1
         '''if''' Set[2, i] == key
+
         '''if''' i == key                               <font color=green>//Если элемент с ключом key существует, возвращаем указатель на него,</font color=green>
             '''return''' Set[1, i]
+
             '''return''' *(Set.elements + key)
     '''return''' null
+
     '''return''' ''null''                                    <font color=green>//в противном случае возвращаем ''null''.</font color=green>
 
</code>
 
</code>
 +
Время выполнения {{---}} <tex>O(n)</tex>.
 +
  
Функция <tex>\mathrm {minimum(Set)}</tex>:
+
=== '''minimum''' ===
 
<code>
 
<code>
  '''int''' minimum(Set):
+
  '''T''' minimum(Set):
     '''return''' Set[1, 0]
+
     '''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>.
 +
  
Функция <tex>\mathrm {maximum(Set)}</tex>:
+
=== '''maximum''' ===
 
<code>
 
<code>
  '''int''' maximum(Set):
+
  '''T''' maximum(Set):
     '''return''' Set[1, n - 1]
+
     '''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>.
 +
  
Функция <tex>\mathrm {predecessor(Set, elem)}</tex>:
+
=== '''predecessor''' ===
 
<code>
 
<code>
  '''int''' predecessor(Set, elem):
+
  '''T''' predecessor(Set, elem):
     '''for''' i = 1 '''to''' n - 1
+
     '''for''' i = 1 '''to''' Set.n - 1
         '''if''' elem == Set[1, i]
+
         '''if''' elem == Set.elements[i]
             '''return''' Set[1, i - 1]
+
             '''return''' *(Set.elements + i - 1)
     '''return''' null
+
     '''return''' ''null''
 
</code>
 
</code>
 +
Время выполнения {{---}} <tex>O(n)</tex>.
 +
  
Функция <tex>\mathrm {successor(Set, elem)}</tex>:
+
=== '''successor''' ===
 
<code>
 
<code>
  '''int''' successor(Set, elem):
+
  '''T''' successor(Set, elem):
     '''for''' i = 0 '''to''' n - 2
+
     '''for''' i = 0 '''to''' Set.n - 2
         '''if''' elem == Set[1, i]
+
         '''if''' elem == Set.elements[i]
             '''return''' Set[1, i + 1]
+
             '''return''' *(Set.elements + i + 1)
     '''return''' null
+
     '''return''' ''null''
 
</code>
 
</code>
 +
Время выполнения {{---}} <tex>O(n)</tex>.
 +
  
 
В случае, когда упорядоченность элементов коллекции не важна, возможно использование [[Хеш-таблица|''хешей'']].
 
В случае, когда упорядоченность элементов коллекции не важна, возможно использование [[Хеш-таблица|''хешей'']].
  
==Примеры==  
+
== Примеры ==  
* Графы;
+
* Простые приверы множеств:
* Пустое множество <tex>  \varnothing </tex>;
+
** {1, 2, 3, ...},
* Множество натуральных чисел <tex>  \mathbb N </tex>.
+
** {..., 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/Упорядоченное_множество Упорядоченное множество — Википедия]
  
== Литература ==
+
[[Категория: Дискретная математика и алгоритмы]]
# Кормен, Т., Лейзерсон, Ч., Ривест, Р., Алгоритмы: построение и анализ = Introduction to Algorithms / — 1-е изд. — Пер. с англ под ред. А. Шеня. — М.: МЦНМО, 2002.—960 с. — ISBN 5-900916-37-5
+
[[Категория:Деревья поиска]]
# Александров П. С. Введение в теорию множеств и общую топологию. — М.: Наука, 1977. — 368 с.
+
[[Категория: Структуры данных]]
# Н. К. Верещагин, А. Шень. Часть 1. Начала теории множеств // Лекции по математической логике и теории алгоритмов. — 2-е изд., испр. — М.: МЦНМО, 2002. — 128 с.
 

Версия 19:29, 8 июня 2015

Упорядоченное множество (англ. ordered set) представляет собой коллекцию элементов, каждому из которых присваивается определенный ключ, отвечающий за порядок этого элемента в множестве. Бинарное отношение на упорядоченном множестве является отношением порядка.

Вполне упорядоченным множеством, которое явяется важнейшим частным случаем, называется упорядоченное множество, каждое непустое подмножество которого содержит минимальный элемент.

Операции над упорядоченным множеством

Над упорядоченным множеством [math]Set[/math] заданы следующие операции:

  • [math]\mathrm {insert(Set, elem, elemKey)}[/math] — добавляет заданный элемент [math]elem[/math], имеющий ключ [math]elemKey[/math], в подходящее место множества [math]Set[/math] (сохраняя свойство упорядоченности),
  • [math]\mathrm {delete(Set, key)}[/math] — удаляет элемент, имеющий ключ [math]key[/math] (сохраняя свойство упорядоченности),
  • [math]\mathrm {search(Set, key)}[/math] — получает на вход искомый ключ [math]key[/math] и возвращает указатель на элемент множества [math]Set[/math] или специальное значение [math]null[/math], если такого элемента нет,
  • [math]\mathrm {minimum(Set)}[/math] — возвращает указатель на минимальный элемент множества [math]Set[/math],
  • [math]\mathrm {maximum(Set)}[/math] — возвращает указатель на максимальный элемент множества [math]Set[/math],
  • [math]\mathrm {predecessor(Set, elem)}[/math] — возвращает указатель на элемент, стоящий перед элементом [math]elem[/math] множества [math]Set[/math].
  • [math]\mathrm {successor(Set, elem)}[/math] — возвращает указатель на элемент, стоящий после элемента [math]elem[/math] множества [math]Set[/math].

Наивная реализация на массиве

Упорядоченное множество, содержащее [math]n[/math] элементов, можно реализовать с помощью массива [math]elements[0..n-1][/math]. Оно будет обладать следующими полями:

  • [math]elem[/math] — элемент множества,
  • [math]key[/math] — ключ элемента.

struct Set<T>:
int n                            //количество элементов множества
T[] elements                     //массив элементов множества типа T

insert

func insert(Set, elem, key):
    Set.n = Set.n + 1                     //Увеличиваем размер массива на единицу
    Set.elements[key] = elem              //и добавляем элемент с ключом key.

Время выполнения — [math]O(1)[/math].

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                             //Затем удаляем последний элемент (уменьшаем количество элементов множества на единицу).

Время выполнения — [math]O(n)[/math].


search

T search(Set, key):
    for i = 0 to Set.n - 1
        if i == key                                //Если элемент с ключом key существует, возвращаем указатель на него,
            return *(Set.elements + key)
    return null                                    //в противном случае возвращаем null.

Время выполнения — [math]O(n)[/math].


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)

Время выполнения — [math]O(n)[/math].


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)

Время выполнения — [math]O(n)[/math].


predecessor

T predecessor(Set, elem):
    for i = 1 to Set.n - 1
        if elem == Set.elements[i]
            return *(Set.elements + i - 1)
    return null

Время выполнения — [math]O(n)[/math].


successor

T successor(Set, elem):
    for i = 0 to Set.n - 2
        if elem == Set.elements[i]
            return *(Set.elements + i + 1)
    return null

Время выполнения — [math]O(n)[/math].


В случае, когда упорядоченность элементов коллекции не важна, возможно использование хешей.

Примеры

  • Простые приверы множеств:
    • {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},
  • пустое множество [math] \varnothing [/math],
  • множество натуральных чисел [math] \mathbb N [/math],
  • файлы в директории, отсортированные в алфавитном порядке.

Источники информации

  • Кормен, Т., Лейзерсон, Ч., Ривест, Р., Алгоритмы: построение и анализ = Introduction to Algorithms / — 1-е изд. — Пер. с англ под ред. А. Шеня. — М.: МЦНМО, 2002.—960 с. — ISBN 5-900916-37-5
  • Александров П. С. Введение в теорию множеств и общую топологию. — М.: Наука, 1977. — 368 с.
  • Н. К. Верещагин, А. Шень. Часть 1. Начала теории множеств // Лекции по математической логике и теории алгоритмов. — 2-е изд., испр. — М.: МЦНМО, 2002. — 128 с.

Ссылки