11. Речници - първа част

Речник АТД
Log файлове
Нареден речник АТД
Lookup таблици
Двоично търсене
Сравнение на прости реализации на нареден речник АТД


Речници (Dictionaries)

Речник АТД

Function
Input
Output
Description
size()
-
Integer
Връща броя на елементите на D.
isEmpty()
-
Boolean
Проверява дали D е празен.
elements()
-
Iterator of objects (elements)
Връща елементите, записани в D.
keys()
-
Iterator of objects (keys) Връща ключовете, записани в D.
find(k)
Object k (key) Position
Ако D съдържа член с ключ, равен на k, връща позицията на този член. Ако не, връща nullposition.
findAll(k)
Object k (key) Iterator of Positions Връща итератор от позициите на всички членове, чийто ключове са равни на k.
insertItem(k,e)
Objects: k (key) and e (element) -
Вмъква двойка с ключ k и елемент e в D.
removeElement(k)
Object k (key)
-
Премахва член с ключ равен на k от D. Ако в D няма такъв член се генерира грешка (error condition).
removeAllElements(k)
Object k (key) -
Премахва всички двойки с ключове равни на k от D.
Operation
Output
Dictionary
insertItem(5,A)
insertItem(7,B)
insertItem(2,C)
insertItem(8,D)
insertItem(2,E)
find(7)
find(4)
find(2)
findAll(2)
size()
removeElement(5)
removeElement(5)
removeAllElements(2)
find(2)
findAll(2)

-
-
-
-
-
p(B)
"nullposition"
p(C) or p(E)
p(C),p(E)
5
-
"error"
-
"nullposition"
"empty iterator"
{(5,A)}
{(5,A),(7,B)}
{(5,A),(7,B),(2,C)}
{(5,A),(7,B),(2,C),(8,D)}
{(5,A),(7,B),(2,C),(8,D),(2,E)}
{(5,A),(7,B),(2,C),(8,D),(2,E)}
{(5,A),(7,B),(2,C),(8,D),(2,E)}
{(5,A),(7,B),(2,C),(8,D),(2,E)}
{(5,A),(7,B),(2,C),(8,D),(2,E)}
{(5,A),(7,B),(2,C),(8,D),(2,E)}
{(7,B),(2,C),(8,D),(2,E)}
{(7,B),(2,C),(8,D),(2,E)}
{(7,B),(8,D)}
{(7,B),(8,D)}
{(7,B),(8,D)}
Operation
Input
Output
Description
element() -
Object (element) Връща псевдоним на елемента от двойката на тази позиция.
key() -
Object (key) Връща константен псевдоним на ключа от двойката на тази позиция.
isNull() -
Boolean
Връща true, ако това е nullposition.

Log файлове

LINEAR search with FLAMENCO dance

#ifndef DICTIONARY_H_INCLUDED
#define DICTIONARY_H_INCLUDED

#include <initializer_list>
#include <algorithm>
#include <vector>

template <typename T, typename U>
class Dictionary{
    private:
        std::vector<T> keys;
        std::vector<U> values;
    public:
        Dictionary();
        Dictionary(std::initializer_list<std::pair<T,U>>);
        bool has(T) const;
        void add(T,U);
        T* begin();
        T* end();
        U operator[](T);
};

template <typename T, typename U>
T* Dictionary<T,U>::begin(){
    return &(keys[0]);
}

template <typename T, typename U>
T* Dictionary<T,U>::end(){
    return &(keys[keys.size()-1])+1;
}

template <typename T, typename U>
Dictionary<T,U>::Dictionary (std::initializer_list<std::pair<T,U>> store){
    for (std::pair<T,U> object : store){
        keys.push_back(object.first);
        values.push_back(object.second);
    }
}

template <typename T, typename U>
bool Dictionary<T,U>::has(T targetKey) const{
    for (T currentKey : keys){
        if (currentKey == targetKey){
            return true;
        }
    }
    return false;
}

template <typename T, typename U>
void Dictionary<T,U>::add (T key, U value){
    keys.push_back(key);
    values.push_back(value);
}

template <typename T, typename U>
U Dictionary<T,U>::operator[] (T key){
    unsigned int pos = std::find(keys.begin(), keys.end(), key) - keys.begin();
    return values[pos];
}

#endif // DICTIONARY_H_INCLUDED


Наредени речници

В нареден речник се иска, освен обичайните операции за речник, да поддържа и такива, свързани с наредбата на ключовете.

Нареден речник АТД


Нареденият речник поддържа следните функции освен тези, включени в общия речник АТД:

Пример:
позиции: 0 1 2 3 4 5 6 7 8 9
ключове: 2 3 3 4 4 4 5 7 9 9

closestBefore(5) -> позиция 6, ключ 5
closestBefore(4) -> позиции 3, 4 или 5, ключ 4
closestBefore(6) -> позиция 6, ключ 5

closestAfter(5) -> позиция 6, ключ 5
closestAfter(4) -> позиции 3, 4 или 5, ключ 4
closestAfter(6) -> позиция 7, ключ 7

Lookup таблици
Двоично търсене [ООП]


От курса по ООП: bsearch.cpp

Двоично търсене:  алгоритъм и писане на програма на С++ (на английски).

BINARY search with FLAMENCO dance

Анализ на двоично търсене

Сравнение на прости реализации на нареден речник АТД

Function
Log File
Lookup Table
size(), isEmpty()
O(1)
O(1)
keys(), elements()
O(n)
O(n)
find(key)
O(n)
O(log n)
findAll(key)
O(n)
O(log n + s)
insertItem(key, element)
O(1)
O(n)
removeElement(key)
O(n)
O(n)
removeAllElements(key)
O(n) O(n)