演算法導論 B樹

2021-08-03 03:59:26 字數 2905 閱讀 9987

#include #include #define t 3

typedef struct bnodetype

bnode,*pbnode;

typedef struct

btree,*pbtree;

typedef struct

stype,*pstype;

pbnode allocatenode()

void b_tree_create(pbtree t)

void b_tree_split_child(pbnode x,int i)

if(!y->leaf) }

y->n=t-1;

for(int j=x->n+1;j>=i+1;j--)

x->c[i+1]=z;

for(int j=x->n;j>=i;j--)

x->key[i]=y->key[t];

x->n++;

}void b_tree_insert_nonfull(pbnode x, char k)

x->key[i+1]=k;

x->n++;

} else

i++;

if(x->c[i]->n==2*t-1)

b_tree_insert_nonfull(x->c[i],k); }}

void b_tree_insert(pbtree t,char k)

else

b_tree_insert_nonfull(r,k);

}pstype b_tree_search(pbnode x,char k)

else if(x->leaf)

return null;

else

return b_tree_search(x->c[i],k);

}//這個前驅函式假設x為非葉節點,包含葉節點的前驅函式需要用到父節點,這裡用不到所以沒寫

char predecessor(pbnode x,int i)

//這個後繼函式假設x為非葉節點,包含葉節點的後繼函式需要用到父節點,這裡用不到所以沒寫

char successor(pbnode x,int i)

void b_tree_delete(pbnode x,char k,pbtree t)

x->n--;

} //case 2

else

//case 2.b

else if(z->n>=t)

//case 2.c

else

//處理y子節點

j=y->n+1;

for(int m=1;m<=z->n+1;m++)

//處理y中key的個數

y->n+=z->n+1;

//處理x中key陣列

for(int m=i;mn;m++)

x->key[m]=x->key[m+1];

//處理x子節點

for(int m=i+1;mn+1;m++)

x->c[m]=x->c[m+1];

//處理x中key的個數

x->n--;

if(x->n==0)

free(z);

b_tree_delete(y,k,t);

}} }

//case 3

else

y->key[1]=xc;

for(int m=y->n+1;m>=1;m--)

y->c[1]=z->c[z->n+1];

y->n++;

//處理z

z->n--;

}else if(in+1 && x->c[i+1] && x->c[i+1]->n>=t)

for(int m=1;mn+1;m++)

z->n--;

}//case 3.b

else

y->key[t]=x->key[i-1];

//處理y子節點

for(int m=y->n+1;m>=1;m--)

y->c[m+t]=y->c[m];

for(int m=1;m<=z->n+1;m++)

//處理y中key的個數

y->n+=z->n+1;

//處理x中key陣列

for(int m=i-1;mn;m++)

x->key[m]=x->key[m+1];

//處理x子節點

for(int m=i-1;mn+1;m++)

x->c[m]=x->c[m+1];

//處理x中key的個數

x->n--;

if(x->n==0)

free(z);

}else if(in+1 && x->c[i+1] && x->c[i+1]->nc[i+1];

//處理y中key陣列

y->key[t]=x->key[i];

for(int m=1;m<=z->n;m++)

//處理y子節點

for(int m=1;m<=z->n+1;m++)

//處理y中key的個數

y->n+=z->n+1;

//處理x中key陣列

for(int m=i;mn;m++)

x->key[m]=x->key[m+1];

//處理x子節點

for(int m=i+1;mn+1;m++)

x->c[m]=x->c[m+1];

//處理x中key的個數

x->n--;

if(x->n==0)

free(z);}}

} b_tree_delete(y,k,t); }

}void printnode(pbnode x)

printf("\n");

}pbtree inittree()

void main()

演算法導論 B樹

這是為磁碟儲存而專門設計的一類平衡搜尋樹。由於磁碟訪問相對訪存極慢,因此度量b樹的效能,考慮 a.動態集合操作消耗的計算時間 b.執行了多少次的磁碟訪問。對每個b樹操作,磁碟訪問的次數隨著b樹的高度增加。b tree定義 第1.每個節點x有 a.x.n儲存節點x的關鍵字個數。b.x.n個關鍵字不嚴格...

《演算法導論》筆記 B樹

演算法 cc c 資料結構 b樹是平衡樹的一種,主要用於操作儲存在磁碟等二級儲存裝置上的大量資料。相比起記憶體 主存 來說,磁碟操作的速度非常慢 慢幾個數量級 所以涉及到儲存在磁碟的資料的時候,儘量減少磁碟的讀取和寫入操作對於提高操作速度是非常重要的。b樹就是針對這個特點進行設計以滿足相應要求的。b...

演算法導論B樹學習筆記

定義就不重複說明了 b樹與b 樹的不同是,b 樹中非葉子節點的節點也會出現在葉子節點中 b樹要求至少t 1,至多2t 1 b樹一 插入 1 關於高度的定理 h l ogtn 1 2h leqslant log t frac h logt 2n 1 2 操作 抽象出來就是插入到某個節點,滿了之後從中間...