ТА_Методички / Lab_8
.pdf
МIНIСТЕРСТВО ОСВIТИ І НАУКИ УКРАЇНИ Національний унiверситет «Львiвська полiтехнiка»
СТВОРЕННЯ I ВЕДЕННЯ Б-ДЕРЕВ
МЕТОДИЧНІ ВКАЗІВКИ
до лабораторної роботи № 8 з курсу «Алгоритми і структури даних»
для студентiв базового напрямку 6.050101 «Комп’ютернi науки»
Затверджено на засiданнi кафедри «Системи автоматизованого проектування» Протокол N __ вiд _________ 2009р.
Львiв - 2009
Створення і ведення Б-дерев: Методичні вказівки до лабораторної роботи N8 з курсу «Алгоритми і структури даних» для студентiв базового напрямку 6.050101 «Комп’ютернi науки» / Укл.: А.Б.Керницький, П.Ю.Денисюк, М.Р.Мельник. - Львiв: НУЛП, 2009.- 22 с.
Укладачі |
Керницький А.Б., др.інж., ст. викл., |
|
Денисюк П.Ю., канд.техн.наук, ст. викл., |
|
Мельник М.Р., асист. |
Відповідальний за випуск Ткаченко С.П., канд.техн.наук, доц.
Рецензенти |
Каркульовський В.І., канд.техн.наук, доц. |
|
Яковина В.С., канд.фіз.-мат.наук, доц. |
1. МЕТА РОБОТИ
Ознайомитися iз способом подання даних в оперативнiй памятi ЕОМ у виглядi Б-дерев. Оволодiти методами роботи iз Б-деревами.
2. КОРОТКІ ТЕОРЕТИЧНI ВIДОМОСТI
Узагальненням дерева двійкового пошуку є m-арне дерево (порядок дерева дорівнює m), в якому кожен вузол має не більше за m синів. Так само,
як і для дерев двійкового пошуку, вважається, що виконується наступна умова: якщо n1 і n2 є двома синами одного вузла і n1 знаходиться зліва від n2,
тоді всі елементи, які знаходяться у піддереві n1, є меншимим за елементи,
які знаходяться у піддереві n2.
Проте у даному випадку існує проблема зберігання записів у файлах,
коли файли зберігаються у вигляді блоків зовнішньої пам’яті. Правильним застосуванням ідеї розгалуженого дерева є уявлення про вузли як про фізичні блоки. Внутрішній вузол містить вказівники на своїх m синів, а також m-1
ключів, які розділяють нащадків цих синів. Листки так само є блоками; ці блоки містять записи основного файлу.
Використання m-арного дерева пошуку значно скорочує кількість звернень до блоків і час пошуку запису у порівнянні з деревом двійкового пошуку, що складається з n вузлів.
Проте не можна зробити m скільки завгодно великим, оскільки, чим більше m, тим більшим повинен бути розмір блоку. Зчитування і обробка більшого блоку займає більше часу, тому існує оптимальне значення m, яке дозволяє мінімізувати час, потрібний для переглядання зовнішнього m-
арного дерева пошуку. На практиці значення, близьке до такого мінімуму,
виходить для досить широкого діапазону величин m.
2.1. Особливості роботи з інформацією, розміщеною на диску
Зовнішня пам’ять - це сукупність запам’ятовуючих пристроїв і носіїв інформації, яка використовується для довготермінового зберігання даних і має наступні властивості:
довготермінового зберігання інформації на носієві при відключеному живленні комп’ютера.
зберігання великих об’ємів даних.
перед використанням інформації, яка зберігається у зовнішній
пам’яті, її завантажують в оперативну пам’ять комп’ютера.
Інформація зберігається на фізичному носієві довготермінової пам’яті у формі, зумовленій конкретним апаратним пристроєм. Для операційної системи (ОС) при цьому не важливо, у якій саме фізичній формі зберігаються дані на носієві. Незалежно від цієї форми ОС використовує стандартний набір команд для керування апаратним пристроєм. На фізичному рівні робота з нагромаджувачами відбувається у всіх файлових системах однаково на рівні команд:
1) підвести зчитуючий/записуючий елемент до вказаного місця
(сектора);
2)прочитати дані з вказаного місця (сектора);
3)записати дані у вказане місце (сектор).
Найрозповсюдженішими видами зовнішньої пам’яті є дискові магнітні й оптичні нагромаджувачі. Поверхня диску розглядається як тривимірна матриця, вимірами якої є номери поверхні, циліндра та сектору (рис.2).
Сектор — найменша фізична одиниця збереження даних, розмір сектора дорівнює 512 байт. Кожний сектор має власну адресу і номер. Нумерація проводиться послідовно (рис.2).
Доріжка — сектори, що належать одній поверхні і знаходяться на однаковій відстані від осі обертання.
Циліндр — сукупність усіх доріжок, що належать різним поверхням, і
знаходяться на однаковій відстані від осі обертання.
Алгоритми, які працюють з Б-деревами, зберігають в оперативній пам’яті лише невелику кількість всієї інформації (фіксовану кількість секторів).
Диск розглядається як велика ділянка пам’яті, робота з якою відбувається наступним чином: перед тим як працювати з об’єктом
,
виконується спеціальна операція 
- 








(читання з диску). Після внесення змін в об’єкт
виконується операція 
- 






(запис на диск).
Фізичне зберігання і доступ до даних на зовнішньому носієві забезпечується:
1)спеціальним електронним обладнанням, контролером дискових нагромаджувачів із стандартним інтерфейсом обміну даними.
2)частиною ОС для логічної організації забезпечення керування
даними.
Рис. 1. (a) Типовий твердий диск. Складається із декількох пластин, які обертаються
навколо осі. (b) Циліндр містить множину ковертикальних доріжок.
Б-дерева - це узагальнення бінарних збалансованих дерев пошуку, але на відміну від самозбалансованих дерев пошуку, Б-дерева оптимізовані для систем, що забезпечують ефективне зберігання інформації на магнітних дисках та інших пристроях з прямим доступом – бази даних та файлові системи. Використання Б-дерев вперше було запропоновано Р. Беєром (R. Bayer) і І. МакКрейтом (E. McCreight) у 1970.
Б-дерева дуже подібні на червоно-чорні дерева. Різниця полягає у тому,
що в Б-дереві вузол може мати багато нащадків. Завдяки цьому константа в оцінці 








для висоти дерева істотно менша, ніж для червоно-чорних
дерев. Як і червоно-чорні дерева, Б-дерева дозволяють реалізувати багато операцій з множинами розміру n за час 





.
Вузол x, що зберігає 




ключів, має 




дітей. Ключі, які зберігаються в x служать границями, що розділяють всіх його нащадків на групи; за кожну групу відповідає один з нащадків x. При пошуку у Б-дереві ми порівнюємо шуканий ключ з 


ключами, що зберігаються в x, і за наслідками порівняння вибираємо одного з 




нащадків.
Рис. 2. Б-дерево висоти 2 містить більше мільйона ключів. Кожний внутрішній вузол і листок містить 1000 ключів. На висоті 1 є 1001 вузол і більше одного мільйона
листків на 2-му рівні.
Час роботи програми в основному визначається кількістю операцій читання і запису, так що має сенс читати/записувати якомога більше інформації за один раз і зробити так, щоб вузол Б-дерева заповнював повністю один сектор диска. Таким чином, ступінь галуження (кількість дітей вузла) визначається розміром сектора.
Кількість ключів, які містяться на сторінці Б-дерева, не може бути довільною; вона визначається степенню (порядком) Б-дерева. Кожна сторінка Б-дерева порядку k повинна містити від k до 2k ключів, крім кореневої сторінки, яка може містити від 1 до 2k ключів.
Рис.3. Б-дерево порядку 2 (за Баєром) або порядку 5 (за Кнутом).
Типовий порядок галуження Б-дерев знаходиться між 50 і 2000 залежно від розміру елемента. Збільшення порядку галуження різко скорочує висоту дерева, і тим самим кількість звернень до диску, при пошуку. Наприклад, Б-
дерево порядку 1001 і висоти 2 може зберігати більше мільярда ключів.
Враховуючи, що корінь можна постійно зберігати в оперативній пам’яті,
достатньо два звернення до диску при пошуку потрібного ключа.
Вважатимемо, що прикладна інформація, пов’язана з ключем,
зберігається у тому ж вузлі дерева. На практиці це не завжди зручно, і в реальному алгоритмі вузол може містити лише посилання на сектор, де вона зберігається.
2.2 Визначення Б-дерева
Б-деревом називають кореневе дерево, влаштоване наступним чином:
кожен вузол x містить наступні поля:
n[x]- кількість ключів, що зберігаються у вузлі x;
key1[x], key2[x].,…, keyn[x][x]- самі ключі в незменшувальному порядку;
leaf[1]- булеве значення, істинне, коли вузол x є листом.
Якщо x - внутрішній вузол, то він містить вказівники c1[x], c2[x].,
cn[x]+1[x] на його дітей у кількості n[x]+1.
У листків немає нащадків, і ці поля для них невизначені.
Всі листки знаходяться на одній і тій самій глибині, яка дорівнює висоті дерева.
Можлива кількість ключів, які зберігаються в одному вузлі,
визначається параметром t≥2, яке називається мінімальною степенню Б-дерева.
Для кожного некореневого вузла x виконується нерівність (t- 1)≤n[x] ≤(2t-1). Таким чином, кількість нащадків у будь-якого внутрішнього вузла (крім кореня) знаходиться у межах від t до 2t.
Якщо дерево не порожнє, то в корені повинен зберігатися хоча б один ключ. Вузол, який зберігає рівно 2t-1 ключів, буде називатися повним.
Ключі keyi[x] служать границями, які розділяють значення ключів у піддеревах. Точніше,
ci[x] посилається на піддерево, ключі в якому є меншими, ніж key1[x];
ci[x] при i=2,3,…,n посилається на піддерево, ключі в якому знаходяться в межах від keyi[x] до keyi+1[x];
cn[x]+1[x] посилається на піддерево, ключі в якому є більшими, ніж keyn[x][x].
Увипадку, коли t=2 в кожного внутрішнього вузла 2, 3 або 4 нащадка,
отримуємо так зване 2-3-4-дерево. Для ефективної роботи з диском на практиці t вибирають достатньо великим. Кількість звертань до диску для більшості операцій пропорційна висоті Б-дерева.
2.3. Основні операції з Б-деревами.
Корінь Б-дерева розміщують в оперативній пам’яті, при цьому читання з диску для кореня ніколи не вимагається; проте кожного разу, коли змінюється корінь, його зберігають на диску. Всі вузли, які передаються як параметри, вже є зчитаними з диску. Всі процедури обробляють дерево за
один прохід від кореня до листків.
Пошук в Б-дереві подібний на пошук у двійковому дереві. Різниця у тому, що в кожному вузлі x вибирається один варіант з (n[x]+1), а не з двох.
При пошуку переглядаються вузли дерева від кореня до лиска. Тому
кількість |
звертань до диску є |
, де |
— висота дерева, а — |
кількість |
ключів. Оскільки n[x]≤2t, |
то час |
обчислень дорівнює |


















.
Створення порожнього Б-дерева здійснюється за допомогою процедури, яка знаходить місце на диску для нового вузла і розміщує його.
Це можна реалізувати за час О(1) і не використовувати операцію читання з диску.
Додавання елемента в Б-дерево здійснюється за допомогою процедури розбиття повного (з 2t-1 ключами) вузла y на два вузла, які мають по t-1
елементів у кожному. При цьому ключ-медіана 






відправляється до батька x вузла y і стає розділювачем двох отриманих вузлів. Це можливо,
якщо вузол x є неповним. Якщо y — корінь, процедура працює аналогічно. У
цьому випадку висота дерева збільшується на одиницю.
Процедура вставляння нового елементу відбувається один раз від кореня до листа. На це потрібний час 
















і 




звертань до диску,
де h - висота дерева. У процесі проходження розділяються повні вузли, що зустрічаються на шляху. Зауважимо, що якщо повний вузол має неповного батька, то його можна розділити, оскільки в батька є місце для додаткового ключа, тому, піднімаючись вгору, доходимо до неповного листа, куди і додаємо новий елемент.
Особливості структури Б-дерева витікають з особливостей обробки інформації у зовнішній пам’яті. Звичайно ця інформація (множина) має дуже великий об’єм і налічує мільйони і мільярди елементів. Зберігати такий об’єм ОП неможливо. При обробці в ОП зберігається тільки частина елементів, що обробляються в даний момент.
Загальна схема обробки окремих елементів виглядає наступним чином:
1. ...
2.x <- вказівник на будь-який об’єкт
3.Disk_Read(x)
4.обробка і зміна елемента х
5.Disk_Wirte(x)
6.операції, які тільки використовують елемент х, але не змінюють його
7. ...
Особливості операцій зчитування і запису на диск є наступними:
1)час доступу до області на диску, що містить елемент х, значно більший, ніж до ОП (до 20 мілісекунд);
2)одне читання/запис зчитує або записує сектор доріжки магнітного диску розміром у декілька кілобайт.
Тобто разом з елементом х зчитуються/записуються і суміжні елементи.
Тому вузли Б-дерева містять не один елемент, а групу елементів розміром в 1
сектор. Щоб зменшити кількість операцій читання/запису на диск при пошуку елементу в Б-дереві, потрібно максимально зменшити його висоту.
Для цього степінь Б-дерева робиться максимальною. Він залежить від співвідношення розміру сектора і розміру окремого елементу. Наприклад, Б-
дерево степеня 1000 і висоти 2 може зберігати більше мільярда ключів.
Рис.4. Вузол-корінь дерева звичайно завжди зберігається в ОП, для доступу до
решти ключів необхідно всього 2 операції читання з диску.
Як і в інших деревах, додаткова інформація і ключі зберігаються у вузлах дерева. Звичайно додаткова інформація представлена у вигляді посилання на сектор диска, де вона зберігається. Разом з ключем при його переміщенні додаткова інформація переміщається разом з ним.
На відміну від 2-3 дерев ключі і прикладна інформація розміщується не тільки в листі, але і у внутрішніх вузлах дерева. Хоча можлива організація Б-
дерев, в яких прикладна інформація зберігається тільки в листі, а у внутрішніх вузлах − ключі і вказівники на синів. Це економить пам’ять у внутрішніх вузлах і дозволяє збільшити їх порядок при тому ж розмірі сектора.
