Algorithmy_i_struktury_dannykh - Страница 6
02: контейнер: binarySearchTree
05: Вмъкване на Impl (D, ключ, стойност)
07: Вмъкване (контейнер, ключ, стойност) 08:
09: Изтриване на Impl (D, клавиш)
11: Изтриване (контейнер, ключ) 12:
13: Look Up Impl (D, ключ)
15: връщане Търсене (контейнер, ключ)
По този начин сложността на операциите за вмъкване, изтриване и търсене директно зависи от сложността на извършване на съответните операции върху структурата от данни, която е в основата на речника. Имайте предвид, че когато използвате хеш-таблици, наборът от ключове не е непременно линейно подреден набор (т.е. такъв, че елементите да могат да се сравняват един с друг), докато за повечето дървовидни структури от данни това условие е необходимо.
Речниковите структури от данни се използват широко в практиката. Пример е прилагането на речникови структури от данни към така наречената техника за запаметяване * в контекста на проблеми, решени с помощта на метода на динамично програмиране.
Помислете за някакъв абстрактен изчислителен проблем, който може да бъде решен чрез динамично програмиране, чрез разделяне
разделяне на първоначалния проблем на по-малки подзадачи
такива подзадачи. Да приемем, че всяка задача
състояние, което описва задачата. Отделяме и редица елементарни проблеми, чието решение е известно. Състоянията, съответстващи на елементарни задачи, ще се наричат начални. Свързвайки всички състояния в някаква ациклична графика, можем да предложим следния метод за намиране на решение на проблема, на който съответства състоянието (процедура 2.3.11):
* Терминът мемоизация идва от английски memoization.
Процедура 2.3.11: Техника за запаметяване
01: Изчислете Impl (S)
02: акотогава не съдържа (кеш, S).
foreach S i в списъка за съседство (G, S) do
натрупване (резултат, изчисляване (S i ))
07: кеш за връщане[S]
Сложността на този алгоритъм е , където е броят на състоянията, а е броят на преходите в графиката, при условие че функцията за натрупване на резултат работи в постоянно време.
Както може да се види от горния алгоритъм, такава речникова структура от данни трябва да се използва като кеш, което ще позволи ефективно вмъкване и търсене на елемент. Ако състоянията могат да бъдат изброени с естествени числа, тогава масивът може да се използва като кеш. Преди директно извикване на процедурата за изчисление, елементарните състояния трябва да бъдат поставени в речника заедно със стойностите, изчислени за тях. За да отговорите на въпроса защо тази техника дава осезаема печалба, разгледайте проблема за определяне на броя на пътищата, водещи от връх до връх в следната графика (фиг. 2.5):
Ако пътеките се изчисляват директно, тогава броят на стъпките ще бъде сравним с ). Използвайки техниката на мемоизация, сложността на алгоритъма може да бъде значително намалена. В този случай е достатъчно да запомните броя на пътищата за всеки от върховете по пътя от до . Тъй като изчисленията за всеки от върховете ще се извършват точно веднъж, сложността на алгоритъма ще бъде .
2.4. приоритетна опашка
Разгледайте наборите от обекти и . Ще приемем, че върху множеството от обекти е зададено отношението на частичен ред „по-малко или равно на“ и елементът
елементите на комплекта са номерирани от 1 до
. приоритетна опашка
за набор от елементи от и дадена функция
борба с ATD със следните операции:
премахване на елемента с минималния ключ.
Елементите на множеството ще бъдат извиканиприоритети. Съответно операцията по премахване на елемент с минимален ключ е търсене и премахване
елементът, чийто приоритет е най-нисък сред всички елементи в момента в опашката.
Името "Приоритетна опашка" произлиза от вида подреждане, на което се подлагат данните, съхранявани от ADT. Терминът "опашка" предполага, че елементите чакат някаква услуга, а терминът "приоритет" определя последователността, в която се обработват елементите. Трябва да се отбележи, че за разлика от конвенционалните опашки, обсъдени в разд. 2.2, приоритетната опашка ADT не следва принципа FIFO.
Реализирането на приоритетната опашка ADT може да се основава на масиви или списъчни структури. Сред последните се избират както свързани списъци, така и линейни ATD. Независимо от вида на използваната линейна структура от данни, всички реализации на приоритетна опашка могат грубо да бъдат разделени на два типа по отношение на това дали елементите на опашката се съхраняват в подредена форма или не. В случай на подредени последователности може да се извърши операцията за намиране и изтриване на елемент с минимален приоритет