平衡搜尋樹之B-樹
B-樹:
一種適合外查詢的平衡多叉樹(有些地方寫的是B-樹,注意不要誤讀 成"B減樹") 。
M階的B樹滿足如下性質:
1、根節點至少有兩個孩子;
2、每個非根節點有[[M/2],M]個孩子;
3、每個非根節點有[[M/2],M-1]個關鍵字,並且以升序排列;
4、key[i]和key[i+1]之間的孩子節點的值介於key[i]和key[i+1]之間;
5、所有的葉子節點都在同一層。
M階的B樹----M=3
插入:
如果插入值後,該節點的關鍵字的個數大於規定的要求,則需要調整,即分裂(新建立一個節點,把位於關鍵字序列中的中位數(不包含中位數)以後的值包括子樹都拷貝到新建的節點中,將中位數提出成樹的根節點,中位數以前的值將成為中位數的左子
樹,後半部分成為右子樹),如下圖:
應用:運用於資料庫和檔案系統。
具體實現程式碼如下:
#pragma once
//使用外查詢的平衡多叉樹
//性質:
// 1、根節點至少有兩個孩子
// 2、每個非根節點有[[M/2],M]個孩子
// 3、每個非根節點有[[M/2],M-1]個關鍵字,並且以升序排列
// 4、key[i]和key[i+1]之間的孩子節點的值介於key[i]和key[i+1]之間
// 5、所有的葉子節點都在同一層
template<class K,int M>//B數一個節點的結構
struct BTreeNode
{
K _key[M];//關鍵字的個數為M-1,多留一個位置可以更加方便的求取中位數
BTreeNode<K,M>* _subs[M+1];//方便插入時分裂,子樹的最大個數為M個,關鍵字比他少一個
BTreeNode<K,M>* _parent;//指向父親節點
size_t _size;//陣列中存放的有效關鍵字的個數
BTreeNode()
:_parent(NULL)
,_size(0)
{
for(int i = 0;i < M+1;++i)
{
_subs[i] = NULL;
}
}
};
template<class K,class V>//需要返回兩個引數,使用結構體
struct Pair
{
K _first;
V _second;
Pair(const K& key = K(),const V& value = V())//預設引數,會呼叫預設建構函式
:_first(key)
,_second(value)
{ }
};
template<class K,int M>
class BTree
{
typedef BTreeNode<K,M> Node;
public:
BTree()
:_root(NULL)
{ }
Pair<Node*,int> Find(const K& key)//查詢
{
if(_root == NULL)
return Pair<Node*,int>(NULL,-1);
Node* parent = NULL;
Node* cur = _root;
while (cur)
{
int index = 0;
while (index < cur->_size)
{
if(key == cur->_key[index])
{
return Pair<Node*,int>(cur,index);
}
else if(key < cur->_key[index])
{
break;
}
else
{
index++;
}
}
parent = cur;
cur = cur->_subs[index];
}
return Pair<Node* ,int>(parent,-1);
//找完也沒找到,為了使得該情況下方便插入節點,因此返回panrent,插入節點插入在parent上
}
bool Insert(const K& key)//插入
{
//當前無節點
if(_root == NULL)
{
_root = new Node;//開闢一個新的節點
_root->_key[0] = key;
_root->_subs[0] = NULL;
_root->_parent = NULL;
_root->_size++;
return true;
}
Pair<Node*,int> cur = Find(key);
if(cur._second != -1)//找到,則返回false,不插入重複關鍵字
{
return false;
}
//在節點cur中插入key和sub
Node* str = cur._first;
K newKey = key;
Node* sub = NULL;
while (1)
{
_InsertKey(str,newKey,sub);
if(str->_size < M)//關鍵字的數量小於M,則正確,直接返回
return true;
//插入資料後,該節點的關鍵字的個數大於規定的數量,需要調整,進行分裂
int mid = (str->_size - 1)/2;
int index = 0;
Node* temp = new Node;
//先拷貝下標為mid後的關鍵字
for(size_t i = mid + 1;i < str->_size;i++)
{
temp->_key[index++] = str->_key[i];
temp->_size++;
str->_key[i] = 0;
}
//接著拷貝下標為mid的關鍵字的sub
index = 0;
for(size_t i = mid + 1;i <= str->_size;i++)
{
temp->_subs[index++] = str->_subs[i];
if(str->_subs[i] != NULL)
str->_subs[i]->_parent = temp;
}
//更改str的大小
str->_size = (str->_size - 1)/2;
if(str->_parent == NULL)
{
_root = new Node;
_root->_key[0] = str->_key[mid];
str->_key[mid] = 0;
_root->_subs[0] = str;
_root->_subs[1] = temp;
_root->_size = 1;
str->_parent = _root;
temp->_parent = _root;
return true;
}
else
{
newKey = str->_key[mid];
str->_key[mid] = 0;
sub = temp;
str = str->_parent;
}
}
}
void InOrder()
{
_InOrder(_root);
cout<<endl;
}
protected:
void _InsertKey(Node* cur,const K& key,Node* sub)
{
int index = cur->_size - 1;
while (index >= 0 && cur->_key[index] > key)//若插入的節點比改位置的值小,則需要移位
{
cur->_key[index+1] = cur->_key[index];
cur->_subs[index+2] = cur->_subs[index+1];
--index;
}
//否則,直接插入
cur->_key[index + 1] = key;
cur->_subs[index+2] = sub;
if(sub != NULL)
sub->_parent = cur;
cur->_size++;
}
void _InOrder(Node* root)
{
if(root == NULL)
return;
for(int i = 0;i < root->_size;i++)
{
_InOrder(root->_subs[i]);
cout<<root->_key[i]<<" ";
}
_InOrder(root->_subs[root->_size]);
}
protected:
Node* _root;
};
void BTreeTest()
{
BTree<int,3> tree;
int a[] = {53,75,139,49,145,36,101};
for(int i = 0;i < sizeof(a)/sizeof(a[i]);i++)
{
tree.Insert(a[i]);
}
tree.InOrder();
}
執行結果:
相關推薦
平衡搜尋樹之B-樹
B-樹: 一種適合外查詢的平衡多叉樹(有些地方寫的是B-樹,注意不要誤讀 成"B減樹") 。 M階的B樹滿足如下性質: 1、根節點至少有兩個孩子; &nbs
【資料結構】平衡搜尋樹之---B樹的演算法實現
#include<iostream> using namespace std; #ifndef __BTREE_H__ #define __BTREE_H__ template<class K,int M=3>//設為三階B樹(每個陣列三個關鍵字
高階搜尋樹之B樹
【說明】部落格內容選自課件內容 目錄 1.B-樹的定義 B-樹是一種滿足以下特性的m叉動態搜尋樹: 1)根結點至少有兩個子樹; 2)除根結點外,所有內部結點至少有⌈m/2⌉ 個子樹,最多有 m 棵子樹; 3)所有外部結點位於同一
淺談演算法和資料結構: 十 平衡查詢樹之B樹
前面講解了平衡查詢樹中的2-3樹以及其實現紅黑樹。2-3樹種,一個節點最多有2個key,而紅黑樹則使用染色的方式來標識這兩個key。 維基百科對B樹的定義為“在電腦科學中,B樹(B-tree)是一種樹狀資料結構,它能夠儲存資料、對其進行排序並允許以O(log n)的時間複雜度執行進行查詢、順序讀取、插入和刪
【演算法和資料結構】平衡查詢樹之B樹
以B-樹的效能總是等價於二分查詢(與M值無關),也就沒有B樹平衡的問題;由於M/2的限制,在插入結點時,如果結點已滿,需要將結點分裂為兩個各佔M/2的結點;刪除結點時,需將兩個不足M/2的兄弟結點合併。 下面簡單說明分裂: 下面對B-樹進行實現 #pragma once //3階B樹 tem
二叉樹之B樹紅黑樹AVL樹堆積樹、B-樹、B+
B樹 即二叉搜尋樹: 1.所有非葉子結點至多擁有兩個子節點(Left和Right); 2.所有結點儲存一個關鍵字; 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹; 如
二叉樹之B樹紅黑樹AVL樹堆積樹、B-樹、B+總結分析
B樹 即二叉搜尋樹: 1.所有非葉子結點至多擁有兩個兒子(Left和Right); 2.所有結點儲存一個關鍵字; 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹; 如: B樹的搜尋,從根結點開
自學演算法之判斷一個二叉樹是否平衡/搜尋/完全二叉樹
話不多說,在面試中遇到過,一臉矇蔽,被虐出翔…以下所述,僅僅是手撕程式碼時候使用,若是需要線上程式設計,可以根據該思路編寫對應AC程式碼。 如何判斷一個二叉樹是否平衡?要解決這個問題,首先要知道什麼
關於樹的總結從二叉樹->二叉搜尋樹->平衡二叉樹->紅黑樹->B樹與B+樹
二叉樹的定義與性質,包括各種操作的原始碼在本部落格的的此處:二叉樹 二叉搜尋樹(Binary Search Tree)的定義性質以及原始碼實現在本部落格此處:二叉搜尋樹 平衡二叉樹(AVL樹),是一棵
資料結構中常見的樹(BST二叉搜尋樹、AVL平衡二叉樹、RBT紅黑樹、B-樹、B+樹、B*樹)
BST樹 即二叉搜尋樹: 1.所有非葉子結點至多擁有兩個兒子(Left和Right); 2.所有結點儲存一個關鍵字; 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹; 如:
樹篇2-平衡二叉查詢樹之AVL樹
一、AVL樹定義 在資料結構中,AVL樹是最先發明的自平衡二叉查詢樹。在AVL樹中任何節點的兩個子樹的高度差的絕對值不能超過一,所以它也被稱為高度平衡樹。查詢、插入和刪除在平均和最壞情況下都是O(log n)。增加和刪除可能需要通過一次
資料結構之B+樹
title: 資料結構之B+樹 date: 2018-11-04 20:39:00 tags: 資料結構與演算法之美 一、 淺談B-樹索引 1.B-樹的特性 一棵m階B-樹,或者是空樹,或者是滿足以下性質的m叉樹 根結點至少有兩個分支; 除根以外的非葉結點,每個結點包含分支數範圍[[
B-樹和B+樹的應用 資料搜尋和資料庫索引
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
演算法導論 之 B樹 B-樹 - 建立 插入 C語言
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
演算法導論 之 B樹 - 刪除 C語言
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
資料結構之B-樹
作為檔案系統索引的常用資料結構,B-樹的查詢涉及硬碟和記憶體兩個部分,硬碟的讀寫將影響查詢的速度。傳統關係型資料庫如Mysql採用B-樹作為索引,新型記憶體資料庫levledb通過改進資料組織方式通過記憶體訪問使得存取速度得到大幅提升,本文通過對B-樹樓據結構的特點及查詢演算法整理,後續將更新leveldb的
二叉樹,平衡二叉樹,紅黑樹,B-樹、B+樹、B*樹的區別
二叉查詢/搜尋/排序樹 BST (binary search/sort tree) 或者是一棵空樹; 或者是具有下列性質的二叉樹: (1)若它的左子樹不空,則左子樹上所有結點的值均小於它的根節點的值; (2)若它的右子樹上所有結點的值均大於它的根節點的值; (3)它的左、右子
資料結構之B樹、B+樹、B*樹
1、應用背景 二叉查詢樹、AVL樹、紅黑樹等都屬於二叉樹的範圍,查詢的時間複雜度是O(log 2N),與樹的深度相關,那麼降低樹的深度自然會提高查詢效率。 但是我們面對這樣一個實際問題:大規模資料儲存中,樹節點儲存的元素數量是有限的(如果元素數量非常多的話,查詢就退化成節點內部的線性
紅黑樹、自平衡二叉樹、AVL樹、B樹的比較
1. 紅黑樹和自平衡二叉(查詢)樹區別 紅黑樹放棄了追求完全平衡,追求大致平衡,在與平衡二叉樹的時間複雜度相差不大的情況下,保證每次插入最多隻需要三次旋轉就能達到平衡,實現起來也更為簡單。 平衡二叉樹追求絕對平衡,條件比較苛刻,實現起來比較麻煩,每次插入新節點之後需要旋轉的
二叉樹搜尋樹之線段樹
有志者,事竟成,破釜沉舟,百二秦關終屬楚; 苦心人,天不負,臥薪嚐膽,三千越甲可吞吳! 題目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1754 參考資料: https://www.cnblogs.com/TheRoadToTheGol