B-tree中,每個(gè)結(jié)點(diǎn)包含:
1、本結(jié)點(diǎn)所含關(guān)鍵字的個(gè)數(shù);
2、指向父結(jié)點(diǎn)的指針;
3、關(guān)鍵字;
4、指向子結(jié)點(diǎn)的指針;
對(duì)于一棵m階B-tree,每個(gè)結(jié)點(diǎn)至多可以擁有m個(gè)子結(jié)點(diǎn)。各結(jié)點(diǎn)的關(guān)鍵字和可以擁有的子結(jié)點(diǎn)數(shù)都有限制,規(guī)定m階B-tree中,根結(jié)點(diǎn)至少有2個(gè)子結(jié)點(diǎn),除非根結(jié)點(diǎn)為葉子節(jié)點(diǎn),相應(yīng)的,根結(jié)點(diǎn)中關(guān)鍵字的個(gè)數(shù)為1~m-1;非根結(jié)點(diǎn)至少有[m/2]([],向上取整)個(gè)子結(jié)點(diǎn),相應(yīng)的,關(guān)鍵字個(gè)數(shù)為[m/2]-1~m-1。
B-tree性能
B-tree有以下特性:
1、關(guān)鍵字集合分布在整棵樹(shù)中;
2、任何一個(gè)關(guān)鍵字出現(xiàn)且只出現(xiàn)在一個(gè)結(jié)點(diǎn)中;
3、搜索有可能在非葉子結(jié)點(diǎn)結(jié)束;
4、其搜索性能等價(jià)于在關(guān)鍵字全集內(nèi)做一次二分查找;
5、自動(dòng)層次控制;
由于限制了除根結(jié)點(diǎn)以外的非葉子結(jié)點(diǎn),至少含有M/2個(gè)兒子,確保了結(jié)點(diǎn)的至少利用率,其最低搜索性能為:
其中,M為設(shè)定的非葉子結(jié)點(diǎn)最多子樹(shù)個(gè)數(shù),N為關(guān)鍵字總數(shù);
所以B-樹(shù)的性能總是等價(jià)于二分查找(與M值無(wú)關(guān)),也就沒(méi)有B樹(shù)平衡的問(wèn)題;
由于M/2的限制,在插入結(jié)點(diǎn)時(shí),如果結(jié)點(diǎn)已滿(mǎn),需要將結(jié)點(diǎn)分裂為兩個(gè)各占M/2的結(jié)點(diǎn);刪除結(jié)點(diǎn)時(shí),需將兩個(gè)不足M/2的兄弟結(jié)點(diǎn)合并。
鑒于B-tree具有良好的定位特性,其常被用于對(duì)檢索時(shí)間要求苛刻的場(chǎng)合,例如:
1、B-tree索引是數(shù)據(jù)庫(kù)中存取和查找文件(稱(chēng)為記錄或鍵值)的一種方法。
2、硬盤(pán)中的結(jié)點(diǎn)也是B-tree結(jié)構(gòu)的。與內(nèi)存相比,硬盤(pán)必須花成倍的時(shí)間來(lái)存取一個(gè)數(shù)據(jù)元素,這是因?yàn)橛脖P(pán)的機(jī)械部件讀寫(xiě)數(shù)據(jù)的速度遠(yuǎn)遠(yuǎn)趕不上純電子媒體的內(nèi)存。與一個(gè)結(jié)點(diǎn)兩個(gè)分支的二元樹(shù)相比,B-tree利用多個(gè)分支(稱(chēng)為子樹(shù))的結(jié)點(diǎn),減少獲取記錄時(shí)所經(jīng)歷的結(jié)點(diǎn)數(shù),從而達(dá)到節(jié)省存取時(shí)間的目的。
節(jié)點(diǎn)可以歸納為板,欄板,挑檐、剪力墻等構(gòu)件相互組合。
1 這要看你的這根梁起的作用。從你上傳的圖來(lái)看應(yīng)該是框架梁(旁邊是現(xiàn)澆板),框架梁的受力鋼筋是凈長(zhǎng)+(左右錨固、左右支座-保護(hù)層+彎折兩者取大值),而圈梁的受力筋是凈長(zhǎng)+15D*2。兩個(gè)平挑出去的可以...
這可你最好不要分開(kāi)繪圖,直接用異形梁定義就行,在網(wǎng)格中畫(huà)出截面圖形后直接劃到圖上,一次性到位。 你那樣畫(huà)四相當(dāng)麻煩的呀。 別折騰了,在表格輸入中自己列式計(jì)算,一次性整樓計(jì)算完。
/* btrees.h */
/*
* 平衡多路樹(shù)的一種重要方案。
* 在 1970 年由 R. Bayer 和 E. McCreight 發(fā)明。
*/
#define M 1
/* B 樹(shù)的階,即非根節(jié)點(diǎn)中鍵的最小數(shù)目。
* 有些人把階定義為非根節(jié)點(diǎn)中子樹(shù)的最大數(shù)目。
*/
typedef int typekey;
typedef struct btnode { /* B-Tree 節(jié)點(diǎn) */
int d; /* 節(jié)點(diǎn)中鍵的數(shù)目 */
typekey k[2*M]; /* 鍵 */
char *v[2*M]; /* 值 */
struct btnode *p[2*M+1]; /* 指向子樹(shù)的指針 */
} node, *btree;
/*
* 每個(gè)鍵的左子樹(shù)中的所有的鍵都小于這個(gè)鍵,
* 每個(gè)鍵的右子樹(shù)中的所有的鍵都大于等于這個(gè)鍵。
* 葉子節(jié)點(diǎn)中的每個(gè)鍵都沒(méi)有子樹(shù)。
*/
/* 當(dāng) M 等于 1 時(shí)也稱(chēng)為 2-3 樹(shù)
* +----+----+
* | k0 | k1 |
* +-+----+----+---
* | p0 | p1 | p2 |
* +----+----+----+
*/
extern int btree_disp; /* 查找時(shí)找到的鍵在節(jié)點(diǎn)中的位置 */
extern char * InsValue; /* 與要插的鍵相對(duì)應(yīng)的值 */
extern btree search(typekey, btree);
extern btree insert(typekey,btree);
extern btree delete(typekey,btree);
extern int height(btree);
extern int count(btree);
extern double payload(btree);
extern btree deltree(btree);
/* end of btrees.h */
/*******************************************************/
/* btrees.c */
#include <stdlib.h>
#include <stdio.h>
#include "btrees.h"
btree search(typekey, btree);
btree insert(typekey,btree);
btree delete(typekey,btree);
int height(btree);
int count(btree);
double payload(btree);
btree deltree(btree);
static void InternalInsert(typekey, btree);
static void InsInNode(btree, int);
static void SplitNode(btree, int);
static btree NewRoot(btree);
static void InternalDelete(typekey, btree);
static void JoinNode(btree, int);
static void MoveLeftNode(btree t, int);
static void MoveRightNode(btree t, int);
static void DelFromNode(btree t, int);
static btree FreeRoot(btree);
static btree delall(btree);
static void Error(int,typekey);
int btree_disp; /* 查找時(shí)找到的鍵在節(jié)點(diǎn)中的位置 */
char * InsValue = NULL; /* 與要插的鍵相對(duì)應(yīng)的值 */
static int flag; /* 節(jié)點(diǎn)增減標(biāo)志 */
static int btree_level = 0; /* 多路樹(shù)的高度 */
static int btree_count = 0; /* 多路樹(shù)的鍵總數(shù) */
static int node_sum = 0; /* 多路樹(shù)的節(jié)點(diǎn)總數(shù) */
static int level; /* 當(dāng)前訪(fǎng)問(wèn)的節(jié)點(diǎn)所處的高度 */
static btree NewTree; /* 在節(jié)點(diǎn)分割的時(shí)候指向新建的節(jié)點(diǎn) */
static typekey InsKey; /* 要插入的鍵 */
btree search(typekey key, btree t)
{
int i,j,m;
level=btree_level-1;
while (level >= 0)
{
for(i=0, j=t->d-1; i<j; m=(j+i)/2, (key > t->k[m])?(i=m+1):(j=m));
if (key == t->k [ i ])
{
btree_disp = i;
return t;
}
if (key > t->k [ i ]) /* i == t->d-1 時(shí)有可能出現(xiàn) */
i++;
t = t->p[ i ];
level--;
}
return NULL;
}
btree insert(typekey key, btree t)
{
level=btree_level;
InternalInsert(key, t);
if (flag == 1) /* 根節(jié)點(diǎn)滿(mǎn)之后,它被分割成兩個(gè)半滿(mǎn)節(jié)點(diǎn) */
t=NewRoot(t); /* 樹(shù)的高度增加 */
return t;
}
void InternalInsert(typekey key, btree t)
{
int i,j,m;
level--;
if (level < 0) /* 到達(dá)了樹(shù)的底部: 指出要做的插入 */
{
NewTree = NULL; /* 這個(gè)鍵沒(méi)有對(duì)應(yīng)的子樹(shù) */
InsKey = key; /* 導(dǎo)致底層的葉子節(jié)點(diǎn)增加鍵值+空子樹(shù)對(duì) */
btree_count++;
flag = 1; /* 指示上層節(jié)點(diǎn)把返回的鍵插入其中 */
return;
}
for(i=0, j=t->d-1; i<j; m=(j+i)/2, (key > t->k[m])?(i=m+1):(j=m));
if (key == t->k[ i ])
{
Error(1,key); /* 鍵已經(jīng)在樹(shù)中 */
flag = 0;
return;
}
if (key > t->k[ i ]) /* i == t->d-1 時(shí)有可能出現(xiàn) */
i++;
InternalInsert(key, t->p[ i ]);
if (flag == 0)
return;
/* 有新鍵要插入到當(dāng)前節(jié)點(diǎn)中 */
if (t->d < 2*M) /* 當(dāng)前節(jié)點(diǎn)未滿(mǎn) */
{
InsInNode(t, i); /* 把鍵值+子樹(shù)對(duì)插入當(dāng)前節(jié)點(diǎn)中 */
flag = 0; /* 指示上層節(jié)點(diǎn)沒(méi)有需要插入的鍵值+子樹(shù),插入過(guò)程結(jié)束 */
}
else /* 當(dāng)前節(jié)點(diǎn)已滿(mǎn),則分割這個(gè)頁(yè)面并把鍵值+子樹(shù)對(duì)插入當(dāng)前節(jié)點(diǎn)中 */
SplitNode(t, i); /* 繼續(xù)指示上層節(jié)點(diǎn)把返回的鍵值+子樹(shù)插入其中 */
}
/*
* 把一個(gè)鍵和對(duì)應(yīng)的右子樹(shù)插入一個(gè)節(jié)點(diǎn)中
*/
void InsInNode(btree t, int d)
{
int i;
/* 把所有大于要插入的鍵值的鍵和對(duì)應(yīng)的右子樹(shù)右移 */
for(i = t->d; i > d; i--)
{
t->k[ i ] = t->k[i-1];
t->v[ i ] = t->v[i-1];
t->p[i+1] = t->p[ i ];
}
/* 插入鍵和右子樹(shù) */
t->k[ i ] = InsKey;
t->p[i+1] = NewTree;
t->v[ i ] = InsValue;
t->d++;
}
/*
* 前件是要插入一個(gè)鍵和對(duì)應(yīng)的右子樹(shù),并且本節(jié)點(diǎn)已經(jīng)滿(mǎn)
* 導(dǎo)致分割這個(gè)節(jié)點(diǎn),插入鍵和對(duì)應(yīng)的右子樹(shù),
* 并向上層返回一個(gè)要插入鍵和對(duì)應(yīng)的右子樹(shù)
*/
void SplitNode(btree t, int d)
{
int i,j;
btree temp;
typekey temp_k;
char *temp_v;
/* 建立新節(jié)點(diǎn) */
temp = (btree)malloc(sizeof(node));
/*
* +---+--------+-----+-----+--------+-----+
* | 0 | ...... | M | M+1 | ...... |2*M-1|
* +---+--------+-----+-----+--------+-----+
* |<- M+1 ->|<- M-1 ->|
*/
if (d > M) /* 要插入當(dāng)前節(jié)點(diǎn)的右半部分 */
{
/* 把從 2*M-1 到 M+1 的 M-1 個(gè)鍵值+子樹(shù)對(duì)轉(zhuǎn)移到新節(jié)點(diǎn)中,
* 并且為要插入的鍵值+子樹(shù)空出位置 */
for(i=2*M-1,j=M-1; i>=d; i--,j--)
{
temp->k[j] = t->k[ i ];
temp->v[j] = t->v[ i ];
temp->p[j+1] = t->p[i+1];
}
for(i=d-1,j=d-M-2; j>=0; i--,j--)
{
temp->k[j] = t->k[ i ];
temp->v[j] = t->v[ i ];
temp->p[j+1] = t->p[i+1];
}
/* 把節(jié)點(diǎn)的最右子樹(shù)轉(zhuǎn)移成新節(jié)點(diǎn)的最左子樹(shù) */
temp->p[0] = t->p[M+1];
/* 在新節(jié)點(diǎn)中插入鍵和右子樹(shù) */
temp->k[d-M-1] = InsKey;
temp->p[d-M] = NewTree;
temp->v[d-M-1] = InsValue;
/* 設(shè)置要插入上層節(jié)點(diǎn)的鍵和值 */
InsKey = t->k[M];
InsValue = t->v[M];
}
else /* d <= M */
{
/* 把從 2*M-1 到 M 的 M 個(gè)鍵值+子樹(shù)對(duì)轉(zhuǎn)移到新節(jié)點(diǎn)中 */
for(i=2*M-1,j=M-1; j>=0; i--,j--)
{
temp->k[j] = t->k[ i ];
temp->v[j] = t->v[ i ];
temp->p[j+1] = t->p[i+1];
}
if (d == M) /* 要插入當(dāng)前節(jié)點(diǎn)的正中間 */
/* 把要插入的子樹(shù)作為新節(jié)點(diǎn)的最左子樹(shù) */
temp->p[0] = NewTree;
/* 直接把要插入的鍵和值返回給上層節(jié)點(diǎn) */
else /* (d<M) 要插入當(dāng)前節(jié)點(diǎn)的左半部分 */
{
/* 把節(jié)點(diǎn)當(dāng)前的最右子樹(shù)轉(zhuǎn)移成新節(jié)點(diǎn)的最左子樹(shù) */
temp->p[0] = t->p[M];
/* 保存要插入上層節(jié)點(diǎn)的鍵和值 */
temp_k = t->k[M-1];
temp_v = t->v[M-1];
/* 把所有大于要插入的鍵值的鍵和對(duì)應(yīng)的右子樹(shù)右移 */
for(i=M-1; i>d; i--)
{
t->k[ i ] = t->k[i-1];
t->v[ i ] = t->v[i-1];
t->p[i+1] = t->p[ i ];
}
/* 在節(jié)點(diǎn)中插入鍵和右子樹(shù) */
t->k[d] = InsKey;
t->p[d+1] = NewTree;
t->v[d] = InsValue;
/* 設(shè)置要插入上層節(jié)點(diǎn)的鍵和值 */
InsKey = temp_k;
InsValue = temp_v;
}
}
t->d =M;
temp->d = M;
NewTree = temp;
node_sum++;
}
btree delete(typekey key, btree t)
{
level=btree_level;
InternalDelete(key, t);
if (t->d == 0)
/* 根節(jié)點(diǎn)的子節(jié)點(diǎn)合并導(dǎo)致根節(jié)點(diǎn)鍵的數(shù)目隨之減少,
* 當(dāng)根節(jié)點(diǎn)中沒(méi)有鍵的時(shí)候,只有它的最左子樹(shù)可能非空 */
t=FreeRoot(t);
return t;
}
void InternalDelete(typekey key, btree t)
{
int i,j,m;
btree l,r;
int lvl;
level--;
if (level < 0)
{
Error(0,key); /* 在整個(gè)樹(shù)中未找到要?jiǎng)h除的鍵 */
flag = 0;
return;
}
for(i=0, j=t->d-1; i<j; m=(j+i)/2, (key > t->k[m])?(i=m+1):(j=m));
if (key == t->k[ i ]) /* 找到要?jiǎng)h除的鍵 */
{
if (t->v[ i ] != NULL)
free(t->v[ i ]); /* 釋放這個(gè)節(jié)點(diǎn)包含的值 */
if (level == 0) /* 有子樹(shù)為空則這個(gè)鍵位于葉子節(jié)點(diǎn) */
{
DelFromNode(t,i);
btree_count--;
flag = 1;
/* 指示上層節(jié)點(diǎn)本子樹(shù)的鍵數(shù)量減少 */
return;
}
else /* 這個(gè)鍵位于非葉節(jié)點(diǎn) */
{
lvl = level-1;
/* 找到前驅(qū)節(jié)點(diǎn) */
r = t->p[ i ];
while (lvl > 0)
{
r = r->p[r->d];
lvl--;
}
t->k[ i ]=r->k[r->d-1];
t->v[ i ]=r->v[r->d-1];
r->v[r->d-1]=NULL;
key = r->k[r->d-1];
}
}
else if (key > t->k[ i ]) /* i == t->d-1 時(shí)有可能出現(xiàn) */
i++;
InternalDelete(key,t->p[ i ]);
/* 調(diào)整平衡 */
if (flag == 0)
return;
if (t->p[ i ]->d < M)
{
if (i == t->d) /* 在最右子樹(shù)中發(fā)生了刪除 */
i--; /* 調(diào)整最右鍵的左右子樹(shù)平衡 */
l = t->p [ i ];
r = t->p[i+1];
if (r->d > M)
MoveLeftNode(t,i);
else if(l->d > M)
MoveRightNode(t,i);
else
{
JoinNode(t,i);
/* 繼續(xù)指示上層節(jié)點(diǎn)本子樹(shù)的鍵數(shù)量減少 */
return;
}
flag = 0;
/* 指示上層節(jié)點(diǎn)本子樹(shù)的鍵數(shù)量沒(méi)有減少,刪除過(guò)程結(jié)束 */
}
}
/*
* 合并一個(gè)節(jié)點(diǎn)的某個(gè)鍵對(duì)應(yīng)的兩個(gè)子樹(shù)
*/
void JoinNode(btree t, int d)
{
btree l,r;
int i,j;
l = t->p[d];
r = t->p[d+1];
/* 把這個(gè)鍵下移到它的左子樹(shù) */
l->k[l->d] = t->k[d];
l->v[l->d] = t->v[d];
/* 把右子樹(shù)中的所有鍵值和子樹(shù)轉(zhuǎn)移到左子樹(shù) */
for (j=r->d-1,i=l->d+r->d; j >= 0 ; j--,i--)
{
l->k[ i ] = r->k[j];
l->v[ i ] = r->v[j];
l->p[ i ] = r->p[j];
}
l->p[l->d+r->d+1] = r->p[r->d];
l->d += r->d+1;
/* 釋放右子樹(shù)的節(jié)點(diǎn) */
free(r);
/* 把這個(gè)鍵右邊的鍵和對(duì)應(yīng)的右子樹(shù)左移 */
for (i=d; i < t->d-1; i++)
{
t->k[ i ] = t->k[i+1];
t->v[ i ] = t->v[i+1];
t->p[i+1] = t->p[i+2];
}
t->d--;
node_sum--;
}
/*
* 從一個(gè)鍵的右子樹(shù)向左子樹(shù)轉(zhuǎn)移一些鍵,使兩個(gè)子樹(shù)平衡
*/
void MoveLeftNode(btree t, int d)
{
btree l,r;
int m; /* 應(yīng)轉(zhuǎn)移的鍵的數(shù)目 */
int i,j;
l = t->p[d];
r = t->p[d+1];
m = (r->d - l->d)/2;
/* 把這個(gè)鍵下移到它的左子樹(shù) */
l->k[l->d] = t->k[d];
l->v[l->d] = t->v[d];
/* 把右子樹(shù)的最左子樹(shù)轉(zhuǎn)移成左子樹(shù)的最右子樹(shù)
* 從右子樹(shù)向左子樹(shù)移動(dòng) m-1 個(gè)鍵+子樹(shù)對(duì) */
for (j=m-2,i=l->d+m-1; j >= 0; j--,i--)
{
l->k[ i ] = r->k[j];
l->v[ i ] = r->v[j];
l->p[ i ] = r->p[j];
}
l->p[l->d+m] = r->p[m-1];
/* 把右子樹(shù)的最左鍵提升到這個(gè)鍵的位置上 */
t->k[d] = r->k[m-1];
t->v[d] = r->v[m-1];
/* 把右子樹(shù)中的所有鍵值和子樹(shù)左移 m 個(gè)位置 */
r->p[0] = r->p[m];
for (i=0; i<r->d-m; i++)
{
r->k[ i ] = r->k[i+m];
r->v[ i ] = r->v[i+m];
r->p[ i ] = r->p[i+m];
}
r->p[r->d-m] = r->p[r->d];
l->d+=m;
r->d-=m;
}
/*
* 從一個(gè)鍵的左子樹(shù)向右子樹(shù)轉(zhuǎn)移一些鍵,使兩個(gè)子樹(shù)平衡
*/
void MoveRightNode(btree t, int d)
{
btree l,r;
int m; /* 應(yīng)轉(zhuǎn)移的鍵的數(shù)目 */
int i,j;
l = t->p[d];
r = t->p[d+1];
m = (l->d - r->d)/2;
/* 把右子樹(shù)中的所有鍵值和子樹(shù)右移 m 個(gè)位置 */
r->p[r->d+m]=r->p[r->d];
for (i=r->d-1; i>=0; i--)
{
r->k[i+m] = r->k[ i ];
r->v[i+m] = r->v[ i ];
r->p[i+m] = r->p[ i ];
}
/* 把這個(gè)鍵下移到它的右子樹(shù) */
r->k[m-1] = t->k[d];
r->v[m-1] = t->v[d];
/* 把左子樹(shù)的最右子樹(shù)轉(zhuǎn)移成右子樹(shù)的最左子樹(shù) */
r->p[m-1] = l->p[l->d];
/* 從左子樹(shù)向右子樹(shù)移動(dòng) m-1 個(gè)鍵+子樹(shù)對(duì) */
for (i=l->d-1,j=m-2; j>=0; j--,i--)
{
r->k[j] = l->k[ i ];
r->v[j] = l->v[ i ];
r->p[j] = l->p[ i ];
}
/* 把左子樹(shù)的最右鍵提升到這個(gè)鍵的位置上 */
t->k[d] = l->k[ i ];
t->v[d] = l->v[ i ];
l->d-=m;
r->d+=m;
}
/*
* 把一個(gè)鍵和對(duì)應(yīng)的右子樹(shù)從一個(gè)節(jié)點(diǎn)中刪除
*/
void DelFromNode(btree t, int d)
{
int i;
/* 把所有大于要?jiǎng)h除的鍵值的鍵左移 */
for(i=d; i < t->d-1; i++)
{
t->k[ i ] = t->k[i+1];
t->v[ i ] = t->v[i+1];
}
t->d--;
}
/*
* 建立有兩個(gè)子樹(shù)和一個(gè)鍵的根節(jié)點(diǎn)
*/
btree NewRoot(btree t)
{
btree temp;
temp = (btree)malloc(sizeof(node));
temp->d = 1;
temp->p[0] = t;
temp->p[1] = NewTree;
temp->k[0] = InsKey;
temp->v[0] = InsValue;
btree_level++;
node_sum++;
return(temp);
}
/*
* 釋放根節(jié)點(diǎn),并返回它的最左子樹(shù)
*/
btree FreeRoot(btree t)
{
btree temp;
temp = t->p[0];
free(t);
btree_level--;
node_sum--;
return temp;
}
void Error(int f,typekey key)
{
if (f)
printf("Btrees error: Insert %d!\n",key);
else
printf("Btrees error: delete %d!\n",key);
}
int height(btree t)
{
return btree_level;
}
int count(btree t)
{
return btree_count;
}
double payload(btree t)
{
if (node_sum==0)
return 1;
return (double)btree_count/(node_sum*(2*M));
}
btree deltree (btree t)
{
level=btree_level;
btree_level = 0;
return delall(t);
}
btree delall(btree t)
{
int i;
level--;
if (level >= 0)
{
for (i=0; i < t->d; i++)
if (t->v[ i ] != NULL)
free(t->v[ i ]);
if (level > 0)
for (i=0; i<= t->d ; i++)
t->p[ i ]=delall(t->p[ i ]);
free(t);
}
return NULL;
}
/* end of btrees.c */
另外還有一種與此類(lèi)似的樹(shù)結(jié)構(gòu)叫B+樹(shù),像 Berkerly DB , sqlite , mysql 數(shù)據(jù)庫(kù)都使用了B+樹(shù)算法處理索引。
B+和B-(即B)是因?yàn)槊總€(gè)結(jié)點(diǎn)上的關(guān)鍵字不同。一個(gè)多一個(gè),一個(gè)少一個(gè)。
對(duì)于B+樹(shù),其結(jié)點(diǎn)結(jié)構(gòu)與B-tree相同,不同的是各結(jié)點(diǎn)的關(guān)鍵字和可以擁有的子結(jié)點(diǎn)數(shù)。如m階B+樹(shù)中,每個(gè)結(jié)點(diǎn)至多可以擁有m個(gè)子結(jié)點(diǎn)。非根結(jié)點(diǎn)至少有[m/2]個(gè)子結(jié)點(diǎn),而關(guān)鍵字個(gè)數(shù)比B-tree多一個(gè),為[m/2]~m。
這兩種處理索引的數(shù)據(jù)結(jié)構(gòu)的不同之處:
1。B樹(shù)中同一鍵值不會(huì)出現(xiàn)多次,并且它有可能出現(xiàn)在葉結(jié)點(diǎn),也有可能出現(xiàn)在非葉結(jié)點(diǎn)中。而B(niǎo)+樹(shù)的鍵一定會(huì)出現(xiàn)在葉結(jié)點(diǎn)中,并且有可能在非葉結(jié)點(diǎn)中也有可能重復(fù)出現(xiàn),以維持B+樹(shù)的平衡。
2。因?yàn)锽樹(shù)鍵位置不定,且在整個(gè)樹(shù)結(jié)構(gòu)中只出現(xiàn)一次,雖然可以節(jié)省存儲(chǔ)空間,但使得在插入、刪除操作復(fù)雜度明顯增加。B+樹(shù)相比來(lái)說(shuō)是一種較好的折中。
3。B樹(shù)的查詢(xún)效率與鍵在樹(shù)中的位置有關(guān),最大時(shí)間復(fù)雜度與B+樹(shù)相同(在葉結(jié)點(diǎn)的時(shí)候),最小時(shí)間復(fù)雜度為1(在根結(jié)點(diǎn)的時(shí)候)。而B(niǎo)+樹(shù)的時(shí)間復(fù)雜度對(duì)某建成的樹(shù)是固定的。
結(jié)點(diǎn)平差在工程測(cè)量中的具體應(yīng)用
格式:pdf
大?。?span id="jx7phmi" class="single-tag-height">187KB
頁(yè)數(shù): 10頁(yè)
評(píng)分: 4.3
拉結(jié)點(diǎn)預(yù)埋技術(shù)交底
格式:pdf
大小:187KB
頁(yè)數(shù): 3頁(yè)
評(píng)分: 4.4
第 1 頁(yè) 共 3 頁(yè) 1、本表由施工單位填寫(xiě),交底單位和接受單位各存一份。 2、當(dāng)做分項(xiàng)工程施工技術(shù)交底時(shí),應(yīng)填寫(xiě)“分項(xiàng)工程名稱(chēng)”欄,其他技術(shù)交底可不填寫(xiě)。 技 術(shù) 交 底 記 錄 表 C2-1 編 號(hào) 工程名稱(chēng) 鷹潭恒大綠洲( 4~14#棟)主體 及配套工程 -10#樓 交底日期 2011年 9月 施工單位 中鐵建設(shè)集團(tuán)武漢分公司第五項(xiàng)目部 分項(xiàng)工程名稱(chēng) / 交底提要 腳手架預(yù)埋技術(shù)交底 交底內(nèi)容: 一、施工準(zhǔn)備 600mm長(zhǎng)鋼管(數(shù)量根據(jù)現(xiàn)場(chǎng)需要確定) 、拉結(jié)點(diǎn)預(yù)埋位置布置圖(如圖 1-1 和圖 1-2 所示) 二、施工方法 根據(jù)圖 1-1 中的拉結(jié)點(diǎn)預(yù)埋位置, 混凝土澆筑施工前, 在相應(yīng)樓層的相應(yīng)位置預(yù)埋 600mm 長(zhǎng)鋼管作為連墻件與結(jié)構(gòu)的拉結(jié)點(diǎn)。 三、拉結(jié)點(diǎn)構(gòu)造要求及注意事項(xiàng) 1、不大于 30m2 設(shè)置一個(gè)拉結(jié)點(diǎn)。 2、連墻件采用剛性拉接,層層設(shè)置,以承受水平方向的壓力作用,加