Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.71 KB | None | 0 0
  1. СРАВНЕНИЕ НА ДИНАМИЧЕН МАСИВ, ТАБЛИЦА, ДВОИЧНО НАРЕДЕНО ДЪРВО И ПИРАМИДА///
  2. 1.ДОБАВЯНЕ НА ЕЛЕМЕНТ
  3. МАСИВ-push_back()
  4. Вкарва нов елемент в края на вектора. Забележете, че ако заделената памет вече е запълнена, преди да вкараме елемента, трябва да разширим вектора.push_front()
  5. Вкарва нов елемент в началото на вектора. За целта първо го разширяваме (ако трябва), а после преместваме всичките му досегашни елементи с един надясно (за да освободим място за новия в началото), тоест тази операция е "скъпа" откъм време.
  6. ТАБЛИЦА-Добавяне на елемент
  7. Добавянето на елемент става като първо го хешираме, за да знаем на коя позиция да го сложим, след което обходим вектора в тази позиция за да проверим дали елементът случайно не е вече в хештаблицата (в който случай просто променяме стойността му). В случай, че не сме го намерили, го добавяме във вектора с обектите с тази хеш стойност.О(1)
  8. Търсене на елемент
  9. Търсенето на елемент ще правим в две части: в първата ще хешираме ключа, а във втората ще го търсим линейно във вектора, който бива сочен от този хеш.Премахване на елемент
  10. Премахването на елемент не е особено по-различно от търсенето, но накрая премахваме елемента.
  11. ХИЙП- Добавяме новия елемент като ново листо на дървото. Тъй като дървото е пълно или почти пълно двоично дърво, то това е еквивалентно да го сложим просто на позиция size в масива, където size е текущият брой елементи. Ако ползваме vector, това не е нищо повече от heap.push_back(newElement).В този момент е възможно двоичното дърво да няма желаните свойства за пирамида (например, представете си, че сме добавили елемент с много висок приоритет, който трябва да отиде на върха). За да възвърнем тези му свойства, ще бутаме елемента нагоре в дървото, докато не се случи едно от следните две:
  12. Елементът стане корен на дървото;
  13. или
  14. Текущият му баща е по-голям или равен на него.Ако в пирамидата е имало N елемента, следователно дървото ѝ има log(N) нива. Тъй като движим новия елемент единствено нагоре, то сложността на тази операция е O(logN).
  15. При приоритетната опашка обикновено единственият елемент, който бихме премахвали, е този с максимална стойност, тъй като той е единственият, за който знаем точната му наредба спрямо всички останали. Затова тук считаме, че ще премахваме само корена.
  16. ДВОИЧНО ДЪРВО- За да добавим нов елемент в дървото, първо трябва да намерим неговата позиция - към кой връх да го закачим. Сходно на търсенето, ще се спускаме надолу към дървото докато стигнем връх, в който можем да го добавим като дете (ляво, ако върхът е по-голям, и дясно в противен случай). Създаваме новия връх и го свързваме в дървото.
  17. Премахване на елемент
  18. Премахването на елемент е малко по-сложно, тъй като искаме да запазим дървото "двоично" - тоест с максимум два наследника от всеки връх. Отново пускаме търсене в дървото. Има няколко случая:
  19. 1Ако търсенето не намери връх с тази стойност, то няма какво да премахваме и приключваме (стойността, която искаме да премахнем, я няма и без друго).
  20. 2Ако търсенето намери връх с тази стойност и този връх няма деца, директно го премахваме. Отбелязваме в бащата му, че въпросният син вече не съществува.
  21. Ако търсенето намери връх с тази стойност и този връх има едно дете, то премахваме върха и закачаме детето му (съответно под-дървото с корен това дете) към бащата му вместо премахнатия връх.
  22. 3Ако търсенето намери връх с тази стойност и този връх има две деца, то трябва някак да закачим и двете деца за бащата на върха. Тъй като това е невъзможно, вместо това ще сложим друг връх от дървото на мястото на сегашния, запазвайки свойствата на дървото. Този връх трябва да е такъв, че всички върхове в под-дървото на лявото дете да са по-малки от него и всички върхове, в под-дървото на дясното дете да са по-големи или равни. Един връх, който изпълнява тези изисквания, е най-малкият в под-дървото на дясното дете.
  23. Търсене на елемент
  24. За да намерим елемент (връх от дървото), почваме от корена и се спускаме надолу по децата, докато намерим този, който ни трябва (или видим, че такъв няма). На всяка стъпка:
  25. Ако стойността на текущия връх е тази, която търсим, спираме.
  26. Ако стойността на текущия връх е по-голяма от тази, която търсим, отиваме в лявото дете. Ако такова дете няма, то значи търсеният елемент не присъства в дървото.
  27. Ако стойността на текущия връх е по-малка от тази, която търсим, отиваме в дясното дете. Ако такова дете няма, то значи търсеният елемент не присъства в дървото.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement