最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c語(yǔ)言B樹(shù)深入理解

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

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

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


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

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

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

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

復(fù)制代碼 代碼如下:

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

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

# include <stdio.h>
# include <stdlib.h>
# include "btrees.h"
/* 給一個(gè)結(jié)點(diǎn)分配空間 */
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)建一個(gè)空的B樹(shù),就一個(gè)根結(jié)點(diǎn) */
struct btnode * btreeCreate( struct btnode *root){
root = allocateNode(root);
root->keyNum = 0;
root->isleaf = 1;
return root;
}

他博客里面已經(jīng)實(shí)現(xiàn)了,只是在定義B樹(shù)的時(shí)候指針數(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é)點(diǎn)數(shù)
child2->keyNum = M-1;
//復(fù)制數(shù)據(jù)
for (i=0; i<M-1; i++)
child2->k[i] = child->k[i+M];
//如果不是葉節(jié)點(diǎn),復(fù)制指針
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++中的單例類模板的實(shí)現(xiàn)方法詳解

    c++中的單例類模板的實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了c++中的單例類模板的實(shí)現(xiàn)方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • QT5.12連接MySQL的實(shí)現(xiàn)

    QT5.12連接MySQL的實(shí)現(xiàn)

    本文主要介紹了QT5.12連接MySQL的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • C++while和do-while語(yǔ)句求和詳解

    C++while和do-while語(yǔ)句求和詳解

    對(duì)于C語(yǔ)言中的while與do-while,相信很多都再熟悉不過(guò)了,最近在工作中就用到了,所以想著總結(jié)一下,方便自己或者有需要的朋友們參考借鑒,文中通過(guò)示例代碼介紹的很詳細(xì),感興趣的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • Qt?http編程之nlohmann?json庫(kù)使用詳解

    Qt?http編程之nlohmann?json庫(kù)使用詳解

    nlohmann是一個(gè)C++的JSON庫(kù),它提供了方便的方式來(lái)解析、生成和操作JSON數(shù)據(jù),這篇文章主要為大家介紹了nlohmann?json庫(kù)的簡(jiǎn)單使用,希望對(duì)大家有所幫助
    2024-04-04
  • Matlab實(shí)現(xiàn)讀寫txt文件數(shù)據(jù)與進(jìn)制轉(zhuǎn)換

    Matlab實(shí)現(xiàn)讀寫txt文件數(shù)據(jù)與進(jìn)制轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了Matlab實(shí)現(xiàn)讀寫txt文件數(shù)據(jù)與進(jìn)制轉(zhuǎn)換的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • C語(yǔ)言實(shí)現(xiàn)常用字符串庫(kù)函數(shù)(推薦)

    C語(yǔ)言實(shí)現(xiàn)常用字符串庫(kù)函數(shù)(推薦)

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)常用字符串庫(kù)函數(shù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • C語(yǔ)言實(shí)現(xiàn)校運(yùn)動(dòng)會(huì)項(xiàng)目管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)校運(yùn)動(dòng)會(huì)項(xiàng)目管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)校運(yùn)動(dòng)會(huì)項(xiàng)目管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++的靜態(tài)成員變量和靜態(tài)成員函數(shù)你了解多少

    C++的靜態(tài)成員變量和靜態(tài)成員函數(shù)你了解多少

    這篇文章主要為大家詳細(xì)介紹了C++的靜態(tài)成員變量和靜態(tài)成員函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++?重載運(yùn)算符在HotSpot?VM中的應(yīng)用小結(jié)

    C++?重載運(yùn)算符在HotSpot?VM中的應(yīng)用小結(jié)

    C++支持運(yùn)算符重載,對(duì)于Java開(kāi)發(fā)者來(lái)說(shuō),這個(gè)可能比較陌生一些,因?yàn)镴ava不支持運(yùn)算符重載,下面介紹一下HotSpot?VM中的運(yùn)算符重載,感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • C++ lambda閉包消除類成員變量的解決思路

    C++ lambda閉包消除類成員變量的解決思路

    在面向?qū)ο缶幊讨?類成員變量過(guò)多可能會(huì)造成干擾,可以采用函數(shù)式編程的思想,通過(guò)閉包和lambda表達(dá)式減少不必要的類成員,增強(qiáng)代碼的可控性和減少干擾,注意要正確使用mutable修飾符和值捕獲,以及合理安排lambda的初始化時(shí)機(jī),感興趣的朋友跟隨小編一起看看吧
    2024-09-09

最新評(píng)論

常熟市| 邢台市| 商丘市| 铜陵市| 土默特右旗| 桦甸市| 嘉黎县| 宾川县| 从化市| 霍林郭勒市| 宣汉县| 高唐县| 合山市| 穆棱市| 正宁县| 夹江县| 涟水县| 彰化市| 双江| 南丹县| 无为县| 锡林浩特市| 南丹县| 梅河口市| 阜宁县| 浦县| 呼伦贝尔市| 栾城县| 益阳市| 娄底市| 玛沁县| 深泽县| 沿河| 阿鲁科尔沁旗| 南昌县| 江口县| 湘乡市| 宾阳县| 岳池县| 商城县| 沂源县|