Программная реализация B+-дерева

Министерство  образования и науки РФ

Государственное образовательное  учреждение высшего профессионального  образования

«Юго-западный государственный  университет»

 

Кафедра ПО ВТ

 

 

 

КУРСОВАЯ  РАБОТА

 

по дисциплине «Структуры и алгоритмы обработки данных»

 

на тему «Программная реализация B+-дерева»

 

Специальность (направление  подготовки)  ПО ВТ                                   

_______________________________________________________________________

Автор работы (проекта)                     Клыков А.В.   ___________________

 

Группа  ПО-92

Руководитель работы (проекта)                Белова Т.М.    __________________

 

Работа (проект) защищена     ____________________

 

Оценка  ____________________

 

 

Председатель  комиссии      ____________________        ___________________

 

Члены комиссии:                 ____________________        ___________________

 

     ____________________         ___________________

 

 

 

 

 

 

 

 

 

 

 

Курск, 2011 г.

 

 

Министерство  образования и науки РФ

Государственное образовательное учреждение высшего профессионального образования

«Юго-западный государственный университет»

 

Кафедра ПО ВТ

 

 

 

ЗАДАНИЕ НА КУРСОВУЮ РАБОТУ

 

Студент     Клыков А.В.     шифр 349014 группа    ПО-92

 

1.Тема Программная реализация B+-дерева

 

2. Срок предоставления  работы (проекта) к защите  «    »               2011 г.

 

3. Исходные данные (для  проектирования, для научного исследования):

Данные, введенные пользователем; файл данных.

 

4. Содержание пояснительной  записки курсовой работы (проекта):

4.1. Содержание

4.3. Техническое задание

4.4. Технический проект

4.5. Рабочий проект

4.6. Список использованных источников

4.7. Приложение

 

5. Перечень графического  материала: 

_____________________________________________________________

_____________________________________________________________

 

Руководитель  работы (проекта)                                                 Белова Т.М.  

 

Задание принял к исполнению                                                                 Клыков А.В.  

 

Содержание

  1. ТЕХНИЧЕСКОЕ ЗАДАНИЕ
    1. Введение

Программное обеспечение – это один из самых важных компонентов успешного функционирования всей компьютерной деятельности. В настоящее время существует огромное число прикладных программ, написанных на самых разных языках программирования, как на  низкоуровневых, так и на современных, более удобных  – высокоуровневых.

Для программного продукта данной курсовой работы операционной средой является система Microsoft Windows XP. Для создания использовалась среда программирования Microsoft Visual Studio 9 и язык программирования C++.

Язык  C++ является одним из наиболее мощных современных языков программирования. Он поддерживает большинство перспективных технологий разработки программ, включая структурное программирование, модульное построение программ, объектную декомпозицию. С его использованием разработаны такие программные комплексы, как, например, операционные системы семейства Windows.

Целью создания программного продукта данной курсовой работы является изучение структуры данных B+ - дерево.

В данной курсовой работе реализуется  программный комплекс "Информационно-поисковая система банка на основе B+-дерева".

    1. Основания для разработки

Данный программный продукт  разрабатывается как задание  на курсовую работу по дисциплине "Структуры и алгоритмы обработки данных".

    1. Назначение разработки
      1. Функциональное и эксплуатационное назначение изделия

В соответствии с заданием данное программное изделие должно представлять собой приложение, позволяющее просматривать, искать, удалять и добавлять информацию о банковских клиентах и их вкладах, использующее структуру данных «B+ - дерево».

      1. Перечень требований пользователя к программному продукту

Данный программный продукт  должен представлять собой простой  графический интерфейс, состоящий  из одного окна, на котором располагаются  поля ввода данных, функциональные кнопки («добавить», «найти», «удалить») и компонент, внутри которого отображается структура дерева.

      1. Рассмотренные альтернативы

При постановке задачи на разработку данного программного изделия в  качестве альтернативы рассматривались структуры данных «B – дерево» и «B* - дерево». Была выбрана структура «B+ - дерево» как наиболее экономичная по времени исполнения.

    1. Требования к программе или программному изделию
      1. Стандарты

Разработка программной документации и программного изделия должна производиться  согласно ГОСТ 19.701-90, ГОСТ 2.304-88. Единая система программной документации.

      1. Требования к составу и параметрам технических средств

Программное изделие должно работать на компьютере под управлением операционной системы Windows XP с частотой процессора не ниже 2 ГГц, ОЗУ не менее 1024Мбайт. Для переноса программы не должны требоваться специальные программные и аппаратные средства.

      1. Требования к информационной и программной совместимости

Программное изделие должно быть написано на языке C++ и работать под управлением операционной системы Windows XP.

      1. Требования к функциональным характеристикам

Программное изделие должно выдавать корректную информацию на запросы пользователя, в том числе в случае ввода  пользователем неподходящих данных выводить сообщение об ошибке.

      1. Результирующие компоненты изделия

В комплект поставки программного изделия  входит исполняемый файл «B+ Tree.exe», а также файл данных «schedule.txt», содержащий информацию о клиентах банка.

      1. Носители информации

Программное изделие будет размещено в виде файлов на компакт-диске.

      1. Безопасность и секретность

Информация, содержащаяся в программном  изделии, не является секретной. Программный  продукт может свободно копироваться и распространяться и не требует  специальных средств защиты от копирования  или хранения информации.

      1. Удобства эксплуатации

Графический интерфейс программы  должен быть выполнен таким образом, чтобы обеспечивать простоту и удобство эксплуатации программы.

      1. Мобильность

Программный продукт не требует наличия дополнительных средств для переноса. Процесс переноса состоит в копировании исполняемых файлов на электронный носитель информации, переносе их на другой компьютер и копирования с носителя в отдельную папку на постоянном внешнем запоминающем устройстве ЭВМ.

    1. Требования к программной документации

Программная документация должна включать следующие документы:

    1. техническое задание;
    2. технический проект;
    3. рабочий проект,
    4. тесты.

В приложении к документу "Рабочий  проект" должен быть приведен листинг  исходных текстов программного изделия.

    1. Стадии и этапы разработки

Выполнение разработки должно включать три стадии:

  1. техническое задание;
  2. технический проект;
  3. рабочий проект.

На стадии "Техническое задание" проводится постановка задачи, разработка требований к программному изделию, изучение литературы по задаче и оформление документа "Техническое задание".

На стадии "Технический проект" проводится анализ данной предметной области, выделение основных взаимодействий между пользователем, выяснение  структуры программного комплекса. В заключение данного этапа оформляется  документ "Технический проект".

На стадии "Рабочий проект" проводится разработка схем алгоритмов для каждого из функциональных модулей, физическое проектирование программного изделия, разработка тестов, тестирование и отладка программных модулей. В заключение данного этапа оформляется документ "Рабочий проект".

    1. Порядок контроля и приемки

Приемка программного изделия осуществляется при сдаче документально оформленных  этапов разработки и проведении испытаний  на основе установленных тестов. Тесты  должны быть разработаны на этапе рабочего проектирования программного изделия.

 

  1. ТЕХНИЧЕСКИЙ ПРОЕКТ
    1. Анализ области

Стандартное использование программного продукта состоит в следующей  последовательности действий пользователя:

    1. запуск файла «B+ Tree.exe»
    2. добавление данных к существующему дереву, удаление и поиск посредством использования соответствующих компонент в окне;
    3. закрытие окна программы;
    1. Структура программы

Программа состоит из двух модулей: файлы Form.cpp + Form.h, в которых описан класс TFormMain и BTree.h, где содержатся методы, описывающие алгоритмы работы с B+-деревом, а также методы для внешнего взаимодействия с этой структурой данных.

      1. Класс TFormMain

В этом классе описаны следующие  функции:

  1. Отрисовка дерева;
  2. Чтение данных из файла;
  3. Поиск узла дерева, на который нажал пользователь;
  4. Обработка вводимых пользователем данных для поиска/удаления/добавления записи в дерево.
        1. Входные данные

При нажатии одной из трех кнопок («добавить», «удалить» или «найти») входными данными являются значения четырех полей: «Номер счета», «ФИО», «Сумма вклада», «Длительность (мес - %) ». При нажатии левой кнопки мыши на области вывода дерева в графическом представлении входными данными являются координаты курсора мыши.

        1. Выходные данные

При нажатии кнопки «найти» или  щелчке мыши на области вывода дерева выходными данными могут являться строки «Номер счета», «ФИО», «Сумма вклада», «Длительность (мес - %) », а также сообщение об ошибке ввода или поиска. При нажатии на другие кнопки происходит перерисовка дерева или вывод сообщения об ошибке в случае неудачи при выполнении операции.

        1. Процессы обработки модуля
  1. создание графического интерфейса, запуск приложения;
  2. отрисовка окна приложения;
  3. обработка действий пользователя.
      1. Класс CB_PLUS_Tree

В этом классе описаны следующие  функции:

    1. добавление записи в дерево;
    2. поиск записи в дереве по первичному ключу;
    3. удаление записи по первичному ключу.
        1. Входные данные

Запись, включающая в себя номер  счета (первичный ключ), ФИО, сумма вклада и длительность (мес - %).

        1. Выходные данные

Результат совершения операции. В  случае выполнения поиска выходными данными являются переменные, определяющие местоположение записи в дереве.

      1. Методические ограничения

В модулях не используется методологически  сложных операций

      1. Аппаратные ограничения

Для корректной работы программ необходимо дисковое пространство в размере не менее 1 КБ, свободная оперативная память в размере не менее 15МБ.

 

  1. РАБОЧИЙ ПРОЕКТ
    1. Введение

В данном программном изделии используются алгоритмы обработки структуры данных «B+-дерево».

    1. Назначение разработки

Данный программный продукт наглядно демонстрирует структуру B+ - дерева.

    1. Требования к программе или программному изделию
      1. Стандарты

Программное изделие выполнено  согласно стандартам, указанным в  техническом задании в пункте 1.4.1.

      1. Требования к составу и параметрам технических средств

Программное изделие работает на компьютере под управлением операционной системы  Windows XP. Рекомендуемый объем оперативной памяти – 1024 Мбайт или более.

      1. Требования к информационной и программной совместимости

Программное изделие написано на языке  C++ в среде разработки C++ Builder 6  и работает под управлением операционной системы Windows XP.

      1. Результирующие компоненты изделия

Согласно пункту 1.4.6. технического задания все файлы программы  предоставляются на компакт-диске.

      1. Безопасность и секретность

Данный программный продукт  не является секретным и не требует  защиты, поэтому ограничения доступа к нему не предусматриваются.

      1. Рестарт

В случае, когда программа по внешним  причинам перестает отвечать на запросы  пользователя, необходимо нажать комбинацию клавиш «CTRL+ALT+DEL» и средствами операционной системы прервать программу.

    1. Описание модулей Form.h и Form.cpp
      1. Диаграммы классов

 

Рисунок 3.1

      1. Описание структуры Bank

В структуре имеется 4 поля: номер  счета, ФИО, сумма вклада, длительность (мес - %). В структуру также входят конструктор по умолчанию, конструктор копирования и конструктор с инициализирующими значениями.

      1. Описание класса TFormMain

Класс TFormMain – основа для графической части данного программного продукта. На рис. 3.1 представлены все члены класса. Переменные X0,Y0 указывают смещение левого верхнего угла компоненты PaintBox, нужны для прокрутки вверх-вниз. Переменные X_max и Y_max задают границы рабочей области. X_Selected и Y_Selected – координаты выделенного ключа. Count – количество ключей в дереве. Selected – флаг, сигнализирующий о том, что имеется выделенный ключ. Changed – флаг, определяющий необходимость перестраивания дерева.

      1. Описание констант и макроопределений

В модулях Form.h и Form.cpp описываются следующие константы:

    • #define N 3 – порядок дерева;
    • #define NODE_HEIGHT 17     - высота рисуемого узла в пикселях;
    • #define KEY_WIDTH  27 - ширина ключа;
    • #define FONT_SIZE 8 - высота шрифта;
    • #define NODE_WIDTH  KEY_WIDTH*2*N - ширина узла (2N - макс. кол-во ключей);
    • #define X_INTERVAL  KEY_WIDTH*2 - расстояние между узлами по горизонтали;
    • #define Y_INTERVAL  NODE_HEIGHT*N*2 - растояние между узлами по вертикали;
    • #define PERIOD    (NODE_WIDTH + X_INTERVAL)  - период
    • #define TEXT_X0 (x1+1) – координата X для текста в клетке ключа;
    • #define TEXT_Y0 (y1+1) - координата Y для текста в клетке ключа;
    • #define NODE_BORDER_COLOR   clBlack - цвет границ узла;
    • #define ARC_COLOR  clPurple - цвет дуги;
    • #define SELECTED_COLOR clRed - цвет выделенного ключа;
    • #define NODE_COLOR clNavy - цвет узла;
    • #define TEXT_COLOR   clLime - цвет текста.
      1. Описание подпрограмм

Подпрограмма TFormMain::TFormMain(TComponent* Owner)

Входные данные: по умолчанию.

Выходные данные: нет.

Процессы обработки: инициализация  переменных, вызов функции чтения данных из файла.

Подпрограмма void TFormMain::ReadFromFile(char* filename)

Входные данные: полный путь к файлу

Выходные данные: данные из файла.

Процессы обработки: чтение данных из файла и добавление их в дерево.

Подпрограмма void __fastcall TFormMain::BtnAddClick(TObject *Sender)

Входные данные: по умолчанию.

Выходные данные: нет.

Процессы обработки: чтение данных из компонент, расположенных  в графическом интерфейсе и добавление их в дерево.

Подпрограмма void __fastcall TFormMain::BtnDeleteClick(TObject *Sender)

Входные данные: по умолчанию.

Выходные данные: нет.

Процессы обработки: чтение значения ключа из компоненты и удаление из дерева.

Подпрограмма void __fastcall TFormMain::BtnSearchClick(TObject *Sender)

Входные данные: по умолчанию.

Выходные данные: нет.

Процессы обработки: чтение значения ключа из компоненты и поиск записи в дереве.

Подпрограмма void __fastcall TFormMain::BtnSearchClick(TObject *Sender)

Входные данные: по умолчанию.

Выходные данные: нет.

Процессы обработки: чтение значения ключа из компоненты и поиск записи в дереве.

Подпрограмма void __fastcall TFormMain::PaintBoxPaint(TObject *Sender)

Входные данные: дерево.

Выходные данные: прорисованное в компоненте дерево.

Процессы обработки: рассчитывает при необходимости параметры узлов дерева и запускает функцию рисования дерева.

Подпрограмма void TFormMain::DrawTree(CB_PLUS_Tree <Data>::Node* node)

Входные данные: указатель на текущий  узел.

Выходные данные: рисование дерева.

Процессы обработки: осуществляется рекурсивный обход дерева, в ходе которого для каждого узла запускается функция отрисовки.

Подпрограмма void TFormMain::DrawNode(CB_PLUS_Tree <Data>::Node* node)

Входные данные: указатель на текущий  узел.

Выходные данные: рисование узла.

Процессы обработки: отрисовка узла дерева с учетом флага selected.

Подпрограмма void __fastcall TFormMain::PaintBoxMouseDown(TObject *Sender,TMouseButton Button, TShiftState Shift, int X, int Y)

Входные данные: дерево.

Выходные данные: запись, хранящаяся в выделенном узле.

Процессы обработки: определение факта попадания курсора мыши внутрь какого-либо ключа, вывод сведений об этой записи в компоненты.

Подпрограмма void TFormMain::FindKey(CB_PLUS_Tree<Bank>::Node* node, int x, int y, Bank & data)

Входные данные: указатель на текущий  узел, координаты ключа.

Выходные данные: data – найденная запись.

Процессы обработки: поиск  записи по координатам ключа в ходе рекурсивного неполного обхода дерева.

Подпрограммы void __fastcall TFormMain::ScrollBarHorScroll(TObject *Sender,TScrollCode ScrollCode, int &ScrollPos) и void __fastcall TFormMain::ScrollBarVertScroll(TObject *Sender,TScrollCode ScrollCode, int &ScrollPos)

Входные данные: по умолчанию.

Выходные данные: нет.

Процессы обработки: смещение начала координат при прокрутке.

 

Текст подпрограмм

См. Приложение А.

    1. Описание модуля Bstar.h
      1. Диаграммы классов

Рисунок 3.2

      1. Описание структуры CB_PLUS_Tree <Data>::Node

Структура описана внутри класса-шаблона  CBTree, в нее входят следующие переменные:

    • Data* item - массив записей. В узле находятся сами записи, а не указатели;
    • Node** ptr -  массив указателей на другие узлы;
    • Node* parent – предшественник (родитель) узла;
    • short keys_count - количество занятых мест в узле;
    • short index - номер узла в списке детей (от 0 до 2Т-1);
    • bool leaf - является ли узел листом;
    • short level - уровень в иерархии, глубина. 0 у корня.
    • short width - ширина (количество листьев, родственных узлу). Для листьев = 1
    • short indent – отступ. Число левых листьев, не родственных узлу
    • static short T - порядок дерева

В структуре присутствует 4 различных  конструктора и деструктор.

      1. Описание класса template <class Data> class CB_PLUS_Tree

Класс CBTree является шаблонным, Data определяет данные, которые будут содержаться в записи, в классе Data обязательно наличие поля int key и конструктора копирования. В классе содержится переменная: Node* root – корень.

      1. Описание констант и макроопределений

В модуле BTree.h описывается перечисляемый тип RESULT со следующими значениями:

    • SUCCESS  -  успешное выполнение операции;
    • NOT_FOUND – элемент не найден;
    • NO_FREE_SPACE – нет свободного места в узле;
    • KEY_ALREADY_EXISTS – ключ уже содержится в дереве;
    • NOT_ENOUGH_KEYS – недостаточно ключей для перемещения.
      1. Описание подпрограмм

Подпрограмма Node::Node(Data data, Node* p, short i, bool l)

Входные данные: запись, указатель на предшествующий узел, индекс (номер узла в списке детей), признак листа.

Выходные данные: нет.

Процессы обработки: конструктор, создающий объект типа Node с единственной записью data, родителем p, индексом I и признаком листа leaf.

Подпрограмма Node:: Node(Data* data, Node** ptrs, short start, short count, Node* p, short ind, bool l)

Входные данные: массив записей, массив указателей, начальная позиция, количество записей в узле, указатель на предшествующий узел, индекс, признак листа.

Выходные данные: нет.

Процессы обработки: конструктор  создает объект типа Node с count записями  и count+1 указателями, взятыми из массивов data и ptrs. Инициализирует значения полей KeysCount, parent, index, IsLeaf.

Подпрограмма Node:: ~Node(void)

Входные данные: нет.

Выходные данные: нет.

Процессы обработки: деструктор, который  освобождает память, выделенную под  объект Node и обнуляет значения полей.

Подпрограмма CB_PLUS_Tree <Data>::CBTree(void)

Входные данные: нет.

Выходные данные: нет.

Процессы обработки: конструктор, в котором инициализируются значения полей класса.

Подпрограмма CB_PLUS_Tree <Data>::CBTree(void)

Входные данные: нет.

Выходные данные: нет.

Процессы обработки: деструктор, вызывающий функцию удаления дерева.

Подпрограмма RESULT CB_PLUS_Tree <Data>::AddKey(Data d)

Входные данные: запись с данными.

Выходные данные: SUCCESS в случае успеха, KEY_ALREADY_EXISTS – если запись с таким же ключом содержится в дереве.

Процессы обработки: происходит добавление записи d в дерево, в случае переполнения – вызов функции разбиения SplitNode.

Краткая блок-схема алгоритма приведена  на рис. 3.3.

Подпрограмма CB_PLUS_Tree<Data>::Node*CB_PLUSTree<Data>::SearchKey(const Data & d, Node* Node, short & index)

Входные данные: запись с данными, текущий узел, переменная для хранения индекса записи (номер записи в узле).

Выходные данные: функция возвращает указатель на узел, в котором завершился поиск. В случае удачного поиска значение переменной index отличается от -1.

Процессы обработки: рекурсивный поиск записи в дереве (поддереве), начинающийся в узле CurrentNode.

Подпрограмма RESULT CB_PLUS_Tree<Data>::DeleteKey(Data d)

Входные данные: запись с данными.

Выходные данные: SUCCESS в случае успеха, NOT_FOUND – если записи с ключом d.key нет в дереве.

Процессы обработки: поиск записи в узле, удаление либо замена записи d, вызов функции Balancing, которая перераспределяет ключи для сохранения структуры B+-дерева

Подпрограмма void CB_PLUS_Tree<Data>::SplitNode(Node* node)

Входные данные: узел, в котором произошло переполнение.

Выходные данные: 2 узла, созданных при разделении.

Процессы обработки: расщепление узла node на 2. Если процесс достигает корня, то он расщипляется на 2 узла и создается новый корень, тем самым высота дерева увеличивается на 1.

Подпрограмма void CBTree<Data,T>::EraseKeys(Node* node,short start, short count)

Входные данные: узел, из которого нужно  удалить count ключей с позиции start.

Выходные данные: удаленные ключи.

Процессы обработки: удаляется  count ключей с позиции start из узла node. В результате этой операции ненулевые записи в узле остаются упорядоченными, а нулевые записи остаются справа.

Подпрограмма void CB_PLUS_Tree<Data>:: ErasePointers(Node* node,short start, short count)

Входные данные: узел, из которого нужно удалить count указателей с позиции start.

Выходные данные: удаленные указатели.

Процессы обработки: удаляется  count указателей с позиции start из узла node. В результате этой операции ненулевые указатели в узле остаются упорядоченными, а нулевые остаются справа.

Подпрограммы RESULT CB_PLUS_Tree<Data>::TransferFromLeftNode(Node* dest) и RESULT CB_PLUS_Tree<Data>::TransferFromRightNode(Node* dest)

Входные данные: узел, в который  нужно переместить запись.

Выходные данные: SUCCESS – успешное перемещение, NOT_FOUND – если соседнего левого/правого узла не существует, NOT_ENOUGH_KEYS – если в соседних узлах недостаточно ключей для перемещения.

Процессы обработки: рекурсивный  проход вправо(влево) в поисках «свободного» ключа и перемещение его влево (вправо).

Подпрограмма CB_PLUS_Tree<Data>::Node*CB_PLUS_Tree<Data>::ReplaceKey(Node* node, short & index)

Входные данные: узел, из которого нужно  удалить запись. index – номер записи в листовом узле, которую нужно удалить.

Выходные данные: листовой узел, из которого произошло удаление.

Процессы обработки: если node – нелистовой узел, то в  нем нужно заменить запись с номером index на запись из потомка. Затем функция применяется рекурсивно к потомку. Если node – листовой узел, то возвращаем указатель на него, а index становится равным номеру перемещенной записи, которую теперь нужно удалить.

Подпрограмма void CB_PLUS_Tree<Data>::Balancing(Node* node)

Входные данные: узел, из которого произошло  удаление.

Выходные данные: перемещенные ключи из соседнего узла.

Процессы обработки: в случае нехватки ключей в узле node вызываются функции перемещения ключей из соседних узлов (TransferFromLeftNode и TransferFromRightNode). Если они не дают нужного результата, вызывается функция ConcatNodes, собирающая 2 в 1. Далее весь процесс повторяется для узла-родителя.

.

Подпрограмма void CB_PLUS_Tree<Data>::ConcatNodes(Node* node)

Входные данные: самый левый из узлов, которые нужно «склеить».

Выходные данные: узел, созданный при лбъединении.

Процессы обработки: в общем случае собираются массив записей из ключей склеиваемых узлов и ключей-разделителей родителя и массив указателей. Потом из этих массивов выбирается средний ключ, который перемещается в узел верхнего уровня, замещая два старых ключа-разделителя, далее создается два узла из первой и второй половин массивов записей и указателей. Если. node – прямой потомок корня, который содержит 1 ключ,  то корень удаляется и создается новый корень, включающий записи двух узлов и ключ-разделитель из удаленного корня. Таким образом высота дерева уменьшается на 1.

Подпрограмма void CB_PLUS_Tree<Data>::AssignLevels(Node* node)

Входные данные: текущий узел.

Программная реализация B+-дерева