亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c語言B樹深入理解

 更新時間:2012年11月26日 11:02:43   投稿:whsnow  
B樹是為磁盤或其他直接存儲設(shè)備設(shè)計的一種平衡查找樹,本文將詳細介紹c語言B樹,需要的朋友可以參考下

B樹是為磁盤或其他直接存儲設(shè)備設(shè)計的一種平衡查找樹。如下圖所示。每一個結(jié)點箭頭指向的我們稱為入度,指出去的稱為出度。樹結(jié)構(gòu)的結(jié)點入度都是1,不然就變成圖了,所以我們一般說樹的度就是指樹結(jié)點的出度,也就是一個結(jié)點的子結(jié)點個數(shù)。有了度的概念我們就簡單定義一下B樹(假設(shè)一棵樹的最小度數(shù)為M):
1.每個結(jié)點至少有M-1個關(guān)鍵碼,至多有2M-1個關(guān)鍵碼;
2.除根結(jié)點和葉子結(jié)點外,每個結(jié)點至少有M個子結(jié)點,至多有2M個子結(jié)點;
3.根結(jié)點至少有2個子結(jié)點,唯一例外是只有根結(jié)點的情況,此時沒有子結(jié)點;
4.所有葉子結(jié)點在同一層。

我們看看它的結(jié)點的結(jié)構(gòu),如下圖所示:


每個結(jié)點存放著關(guān)鍵字和指向子結(jié)點的指針,很容易看出指針比關(guān)鍵碼多一個。

由B樹的定義我們可以看出它的一些特點:
1.樹高平衡,所有葉結(jié)點在同一層;
2.關(guān)鍵字沒有重復,按升序排序,父結(jié)點的關(guān)鍵碼是子結(jié)點的分界;
3.B樹把值接近的相關(guān)記錄放在同一磁盤頁中,從而利用了訪問局部性原理;
4.B樹保證一定比例的結(jié)點是滿的,能改進空間利用率。

B樹結(jié)點的大小怎么確定呢?為了最小化磁盤操作,通常把結(jié)點大小設(shè)為一個磁盤頁的大小。一般樹的高度不會超過3層,也就是說,查找一個關(guān)鍵碼只需要3次磁盤操作就可以了。
在實現(xiàn)的時候,我是參照了《算法導論》的內(nèi)容,先假定:
1.B樹的根結(jié)點始終在主存中,不需要讀磁盤操作;但是,根結(jié)點改變后要進行一次寫磁盤操作;
2.任何結(jié)點被當做參數(shù)傳遞的時候,要讀磁盤。

在實現(xiàn)的時候其實還做了簡化,每個結(jié)點除了包含關(guān)鍵碼和指針外,還應該有該關(guān)鍵碼所對應記錄所在文件的信息的,比如文件偏移量,要不然怎么找到這條記錄呢。在實現(xiàn)的時候這個附加數(shù)據(jù)就沒有放在結(jié)點里面了,下面是定義樹的結(jié)構(gòu),文件名為btrees.h,內(nèi)容如下:

復制代碼 代碼如下:

/* btrees.h */
# define M 2
/* B樹的最小度數(shù)M>=2
* 每個非根結(jié)點必須至少有M-1個關(guān)鍵字。每個非根結(jié)點至少有M個子女
* 每個結(jié)點可包含至多2M-1個關(guān)鍵字。所以一個內(nèi)結(jié)點至多可以有2M個子女
*/
typedef int bool ;
struct btnode{ /* B樹結(jié)點 */
int keyNum; /* 節(jié)點中鍵的數(shù)目 */
int k[2*M-1]; /* 鍵 */
struct btnode * p[2*M]; /* 指向子樹的指針 */
bool isleaf;
};
struct searchResult{
struct btnode *ptr; /* 數(shù)據(jù)所在節(jié)點指針 */
int pos; /* 數(shù)據(jù)在節(jié)點中位置 */
};

下面是創(chuàng)建一顆空樹的代碼,文件名為btree.c:
復制代碼 代碼如下:

# include <stdio.h>
# include <stdlib.h>
# include "btrees.h"
/* 給一個結(jié)點分配空間 */
struct btnode * allocateNode( struct btnode *ptr){
int i,max;
ptr = ( struct btnode *) malloc ( sizeof ( struct btnode));
if (!ptr){
printf ( "allocated error!/n" );
exit (1);
}
max = 2*M;
for (i=0; i<max; i++)
ptr->p[i] = NULL; /* 初始化指針 */
memset (ptr->k, 0, (max-1)* sizeof ( int )); /* 初始化鍵的值*/
return ptr;
}
/* 創(chuàng)建一個空的B樹,就一個根結(jié)點 */
struct btnode * btreeCreate( struct btnode *root){
root = allocateNode(root);
root->keyNum = 0;
root->isleaf = 1;
return root;
}

他博客里面已經(jīng)實現(xiàn)了,只是在定義B樹的時候指針數(shù)和關(guān)鍵碼數(shù)成一樣了,我于是自己重寫了一下。
[code]
void btreeSplitChild( struct btnode *parent, int pos, struct btnode *child){
struct btnode *child2;
int i;
child2 = allocateNode(child2);
child2->isleaf = child->isleaf;
//設(shè)置節(jié)點數(shù)
child2->keyNum = M-1;
//復制數(shù)據(jù)
for (i=0; i<M-1; i++)
child2->k[i] = child->k[i+M];
//如果不是葉節(jié)點,復制指針
if (!child->isleaf)
for (i=0; i<M; i++)
child2->p[i] = child->p[i+M];
child->keyNum = M-1;
for (i=parent->keyNum; i>pos; i--){
parent->k[i] = parent->k[i-1];
parent->p[i+1] = parent->p[i];
}
parent->k[pos] = child->k[M-1];
parent->keyNum++;
parent->p[pos+1] = child2;
}

相關(guān)文章

  • C++ DLL實現(xiàn)循環(huán)播放音樂的示例詳解

    C++ DLL實現(xiàn)循環(huán)播放音樂的示例詳解

    這篇文章主要為大家詳細介紹了C++ DLL實現(xiàn)循環(huán)播放音樂的相關(guān)知識,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解下
    2024-03-03
  • C++樹之遍歷二叉樹實例詳解

    C++樹之遍歷二叉樹實例詳解

    這篇文章主要給大家介紹了關(guān)于C++樹之遍歷二叉樹的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • C語言 奇偶排序算法詳解及實例代碼

    C語言 奇偶排序算法詳解及實例代碼

    這篇文章主要介紹了C語言 奇偶排序算法詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • Qt實現(xiàn)界面滑動切換效果的思路詳解

    Qt實現(xiàn)界面滑動切換效果的思路詳解

    這篇文章主要介紹了Qt實現(xiàn)界面滑動切換效果,主要包括設(shè)計思路及主要函數(shù)講解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • OpenCV實現(xiàn)繪制輪廓外接矩形

    OpenCV實現(xiàn)繪制輪廓外接矩形

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)繪制輪廓外接矩形的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-12-12
  • C語言中經(jīng)socket接收數(shù)據(jù)的相關(guān)函數(shù)詳解

    C語言中經(jīng)socket接收數(shù)據(jù)的相關(guān)函數(shù)詳解

    這篇文章主要介紹了C語言中經(jīng)socket接收數(shù)據(jù)的相關(guān)函數(shù)詳解,分別為recv()函數(shù)和recvfrom()函數(shù)以及recvmsg()函數(shù)的使用,需要的朋友可以參考下
    2015-09-09
  • C/C++靜態(tài)類和this指針詳解及實例代碼

    C/C++靜態(tài)類和this指針詳解及實例代碼

    這篇文章主要介紹了 C/C++靜態(tài)類和this指針詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 關(guān)于《C和指針》的學習筆記

    關(guān)于《C和指針》的學習筆記

    本篇文章是對《C和指針》這本書的學習做了筆記介紹。需要的朋友參考下
    2013-05-05
  • C++ atoi()函數(shù)用法案例詳解

    C++ atoi()函數(shù)用法案例詳解

    這篇文章主要介紹了C++ atoi()函數(shù)用法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • c++的virtual和override作用及說明

    c++的virtual和override作用及說明

    這篇文章主要介紹了c++的virtual和override作用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論