
Міністерство освіти і науки, молоді та спорту України
Дніпропетровський національний університет ім. Олеся Гончара
Факультет прикладної математики
Кафедра комп’ютерних технологій
Алгоритми та структури даних Лабораторна робота №3
Виконав:
студент ПК-12-1
Високопоясний Ігор
Перевірив:
Бердник М. Г.
м. Дніпропетровськ
2013 р.
Зміст
Постановка задачі
Два стека на базі одного масиву
Процедури Enquene та Dequene
Дек
Черга на базі двох стеків
Операції Insert, Delete і Search для списку
Операція Union (для двох списків)
XOR-зв’язаний список
Використання хеш-функції
Підрахунок значення хеш-функції
Постановка задачі
Пояснити, як на базі одного масиву організувати два стеки сумарною довжиною не більше розміру масиву.
Записати процедури Enquene та Dequene з врахуванням помилок Overflow та Underflow.
Реалізувати дек – структуру даних, яка дозволяє додавати та видаляти елементи з обох своїх країв.
Пояснити, як можна організувати чергу на базі двох стеків.
Записати словами операції Insert, Delete і Search для згорнутого в кільце однобічно зв’язаного списку.
Організувати операцію Union, що об’єднує дві множини, представлені списками, в одну ( за час O(1) ).
Поясніть, як організувати двозв’язний список, згорнувши поля next[x] I prev[x] в одне поле np[x] = prev[x] XOR next[x]. Поясніть, як можна розвернути такий список задом наперед за час O(1).
Як можна спростити пошук за у списку, що має поля для свого ключа і для його хеш-значення. Ключ є довгою послідовністю символів.
Нехай розмір хеш-таблиці m = 1000, а хеш-функція має вид
h(k) = [m(kA mod 1)] , де A = (sqrt(5) – 1) / 2.
На які позиції потраплять ключі 61, 62, 63, 64, 65 ?
Два стека на базі одного масиву
Організуємо два стека на базі одного масиву розміром N.
Дном першого стека буде початок масиву, а іншого – кінець масиву. Вершини стеків, при додаванні елементів, будуть йти на зустріч одна одній. Таким чином, вся конструкція буде заповненою тоді, коли вершини першого та другого стеків стануть сусідніми елементами масиву.
Запишемо на псевдокоді основні процедури нашої структури:
{ S – структура даних, що представляє собою два стеки;
topf[S] – вершина першого стеку;
tops[S] – вершина другого стеку;
N – розмір базового масиву }
{перевірка всієї структури на переповнення}
Stack Is Full(S)
If topf[S] = tops[S] – 1
Then return True
Else return False
{перевірка, чи порожній перший/другий стек}
First Stack Is Empty(S)
If topf[S] = 0
Then return True
Else return False
Second Stack Is Empty(S)
If tops[S] = N + 1
Then return True
Else return False
{процедура Push для першого та другого стеку}
Pushf(S, x)
If Stack Is Full(S)
Then return error ‘overflow’
Else topf[S] ← topf[S] + 1
S[topf[S] ] ← x
Pushs(S, x)
If Stack Is Full(S)
Then return error ‘overflow’
Else tops[S] ← tops[S] – 1
S[topf[S] ] ← x
{процедура Pop для першого та другого стеку}
Popf(S)
If First Stack Is Empty(S)
Then return error ‘underflow’
Else topf[S] ← topf[S] – 1
return S[topf[S] + 1]
Pops(S)
If First Stack Is Empty(S)
Then return error ‘underflow’
Else tops[S] ← tops[S] + 1
return S[tops[S] – 1]