前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >原 B树C语言代码实现

原 B树C语言代码实现

作者头像
王果壳
发布于 2018-05-17 04:02:24
发布于 2018-05-17 04:02:24
3.9K00
代码可运行
举报
文章被收录于专栏:王硕王硕
运行总次数:0
代码可运行

在这里实现的是在主存中的操作,没有进行文件的存储和修改。

头文件btree.h:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef _BTREE_H   
#define _BTREE_H  
  
#define MIN_T 3 
#define MAX_T (MIN_T * 2)

typedef struct BTreeNodedata BTreeNodedata;
typedef struct BTreeNodedata *BTreeNode;
typedef struct BTreedata BTreedata;
typedef struct BTreedata *BTree;

/*
 * B树结点结构体
 */
struct BTreeNodedata
{
 int n;	//关键字个数
 int leaf;	是否是叶子结点,1为叶子结点,0反之
 int key[MAX_T - 1];	//关键字,这里的关键字为了简便编程设为int
 BTreeNode child[MAX_T];	//子结点
};

/*
 * B树的结构体
 */
struct BTreedata
{
 BTreeNode	root;	//B树的根结点
};

#define BTREE_NODE_SIZE sizeof(BTreeNodedata)
#define BTREE_SIZE sizeof(BTreedata)

BTreeNode  allocate_node();	//为结点分配空间
void btree_create(BTree tree);	//初始化树
void btree_search(BTreeNode node, int key);	//寻找关键字位置
void btree_split_child(BTreeNode node, int location);	//分裂子结点
void btree_insert_nonfull(BTreeNode node, int key);	//向未满结点插入关键字
void btree_insert(BTree tree, int key);	//向树插入关键字
void display_node(BTreeNode *node_first, int n);	//显示以结点node_first为父结点的树
void display_btree(BTree tree);	//显示整棵树
BTreeNode btree_minimum(BTreeNode node);	//以node为根结点,寻找最小关键字
BTreeNode btree_maximum(BTreeNode node);	//以node为根结点,寻找最大关键字
void btree_min(BTree tree);	//在整棵树中寻找最小关键字
void btree_max(BTree tree);	//在整棵树中寻找最大关键字
void btree_left(BTreeNode parent, BTreeNode node, BTreeNode othernode, int location);	//将父结点、右兄弟、该结点的关键字调整
void btree_right(BTreeNode parent, BTreeNode node, BTreeNode othernode, int location);	//将父结点、左兄弟、该结点的关键字调整
int btree_merge_child(BTreeNode parent, int location);	//合并子结点,并返回下降子结点的位置
void btree_delete_leaf(BTreeNode node, int location);	//删除叶子结点关键字
int btree_delete_node_in(BTreeNode r_node, int i);	//删除内结点关键字,并返回下降子结点的位置
void btree_delete_node(BTreeNode r_node, int key);	//删除以r_node为根结点的树中关键字
void btree_delete(BTree tree, int key);	//删除树中的关键字

#endif

程序btree.c:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "btree.h"
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <assert.h>

/*
 * 为新结点分配空间
 */
BTreeNode 
allocate_node()
{  
	BTreeNode node = (BTreeNode) malloc (BTREE_NODE_SIZE);

	return node;
}

/*
 * 生成一棵空树
 * 关键字个数为0,且为叶子结点
 */
void
btree_create(BTree tree)
{
	BTreeNode r_node = allocate_node();

	(r_node)->n = 0;
	(r_node)->leaf = 1;

	(tree)->root = r_node;
}

/*
 * 在以node为根结点的树中,寻找关键字位置
 * 返回关键字所在结点,并将关键字位置保存在location 
 */
void 
btree_search(BTreeNode node, int key)
{
	
	int j = 0;

	/* 
     * 遍历当前结点,寻找恰当的关键字,如果找到相等的关键字,返回结点并将关键字位置保存在location
     * 如果没找到相等结点,且该结点为叶子结点,则报错
     * 否则递归寻找
     */
	while(j < node->n && key > node->key[j])
		j++;
	if(j < node->n && key == node->key[j])
	{
		printf("the %d key's location is %d in the node %p\n", key, j, node);
	}
	else if(node->leaf)
	{
		printf("error:there is no a key\n");
	}
	else  btree_search(node->child[j], key);
}

/*
 * 分裂父结点node中位置为location的子结点的满结点
 */
void
btree_split_child(BTreeNode node, int location)
{
	/* 建立新的空结点 */
	BTreeNode newnode = allocate_node();
	BTreeNode childnode = node->child[location];

	int i = 0;

	/* 初始化空结点newnode,将子结点childnode的信息复制到新结点node中 */
	newnode->leaf = childnode->leaf;
	newnode->n = MIN_T - 1;

	/* 将子结点childnode后T-1个关键字复制到新结点中,并改变子结点的n值 */
	for(i = 0;i <= MIN_T - 2;i++)
		newnode->key[i] = childnode->key[i + MIN_T];

	childnode->n = MIN_T - 1;

	/* 如果子结点非叶子结点,则相应的将子结点的结点点复制到新结点中 */
	if(!childnode->leaf)
		for(i = 0;i <= MIN_T - 1;i++)
			newnode->child[i] = childnode->child[i + MIN_T];

	/* 将父结点对应的关键字以及子结点位置向后移动一位 */
	for(i = node->n;i > location;i--)
	{
		node->key[i] = node->key[i - 1];
		node->child[i+1] = node->child[i];
	}

	/* 为父结点增加新的关键字和子结点,并修改n值 */
	node->child[location + 1] = newnode;
	node->key[location] = childnode->key[MIN_T - 1];
	node->n = node->n + 1;

}

/*
 * 对非满结点进行插入关键字   
 */
void
btree_insert_nonfull(BTreeNode node, int key)
{
	int i = node->n - 1;

	if(node->leaf)
	{
		/* 该结点为叶子结点时,找到对应位置,将关键字插入,并对结点node做出修改 */
		while(i >=0 && key < node->key[i])
		{
			node->key[i+1] = node->key[i];
			i--;
		}

		node->key[i+1] = key;
		node->n = node->n + 1;
	}
	else
	{
		/* 非叶子结点时,查找对应子结点,判断其是否为满结点,是,则分裂,否递归插入 */
		while(i >=0 && key < node->key[i])
			i--;
		i++;
		if(node->child[i]->n == MAX_T - 1)
		{
			btree_split_child(node, i);
			if(key > node->key[i])
				i++;
		}

		btree_insert_nonfull(node->child[i], key);
	}
}

/*
 * 对整棵树进行插入关键字
 * 当树为有且只有一个关键字,且已满时,需要建立新的结点作为树的根结点,
 * 而当原树的根结点作为新结点的子结点,进行分裂操作
 * 否则,直接进行非满结点插入操作
 */
void
btree_insert(BTree tree, int key)
{
	BTreeNode r_node = tree->root;

	if(r_node->n == MAX_T - 1)
	{
		BTreeNode r_node_new = allocate_node();

		r_node_new->leaf = 0;
		r_node_new->n = 0;
		r_node_new->child[0] = r_node;
		tree->root = r_node_new;
		btree_split_child(r_node_new, 0);
		btree_insert_nonfull(r_node_new, key);
	}
	else btree_insert_nonfull(r_node, key);
}

/*
 * 为了验证插入以及删除结果正确,添加输出函数
 * 输出以parent为父结点的子树的所有关键字
 * 这里将所有的同一层的结点放入到一个数组中,方便输出
 * 第一个参数node_first作为每一层结点数组的起始地址
 * n为该层结点数
 */
void
display_node(BTreeNode *node_first, int n)
{
	int i = 0, j = 0, k = 0,all = 0;
	BTreeNode *node = node_first;

	/* 将该层的结点所有的关键字输出,不同结点以“  ”为分隔,每层以“$$”为分隔	*/
	for(i = 0; i < n; i++)
	{
		for(j = 0; j < (*(node + i))->n; j++)
		{
			printf("%d ", (*(node + i))->key[j]);
		}
		all = all + (*(node + i))->n + 1;
		//printf(" %p ", *(node + i));
		printf("  ");
	}
	printf("$$\n");

	if(!(*node)->leaf)
	{
		BTreeNode nodes[all];
		i = 0;
		for(j = 0; j < n; j++)
		{
			for(k = 0; k <= (*(node + j))->n; k++)
			{
				nodes[i] = (*(node + j))->child[k];
				i++;
			}
		}
		display_node(nodes, all);
	}
}


/*
 * 为了验证插入和删除操作的正确性,添加输出函数
 * 将整棵树输出
 */
void
display_btree(BTree tree)
{
	BTreeNode r_node = tree->root;
	
	display_node(&r_node, 1);
}

/*
 * 返回以node为根结点树的最小关键字的结点,关键字的位置肯定为0
 */
BTreeNode 
btree_minimum(BTreeNode node)
{
	BTreeNode newnode = node;

	if(newnode->n < 1)
	{
		printf("this is null tree\n");
		return NULL;
	}

	if(node->leaf)
		return newnode;
	else
		newnode = btree_minimum(node->child[0]);

	return newnode;
}


/*
 * 返回以node为根结点树的最大关键字的结点,关键字的位置肯定为该结点的n-1值
 */
BTreeNode 
btree_maximum(BTreeNode node)
{
	BTreeNode newnode = node;

	if(newnode->n < 1)
	{
		printf("this is null tree\n");
		return NULL;
	}

	if(node->leaf)
		return newnode;
	else
		newnode = btree_maximum(node->child[node->n]);

	return newnode;
}

/*
 * 输出整棵树的最小关键字
 */
void
btree_min(BTree tree)
{
	BTreeNode r_node = tree->root;
	BTreeNode n_node = btree_minimum(r_node);

	printf("the min is %d\n", n_node->key[0]);
}

/*
 * 输出整棵树的最大关键字
 */
void
btree_max(BTree tree)
{
	BTreeNode r_node = tree->root;
	BTreeNode n_node = btree_maximum(r_node);

	printf("the max is %d\n", n_node->key[n_node->n - 1]);
}

/* 
 * 当下降的结点node的关键字个数为T-1时,
 * 为了满足下降过程中,遇到的结点的关键字个数大于等于T,
 * 对结点parent、node、othernode三个结点的关键字做调整。
 * 当node在other左侧时,即node的右结点时(父结点的右子结点), * 在T+1位置,增加一个关键字,其值为父结点对应的关键字值,
 * 将父结点对应关键字值赋值为右子结点中的第一个关键字。
 * 将右子结点的关键字和子结点(如果有的话)向前移动一位
 * 修改右子结点以及该结点的n值
 */
void
btree_left(BTreeNode parent, BTreeNode node, BTreeNode othernode, int location)
{
	int i = 0;
	node->key[node->n] = parent->key[location];
	parent->key[location] = othernode->key[0];

	for(i = 0; i <= othernode->n - 2; i++)
		othernode->key[i] = othernode->key[i + 1];

	if(!othernode->leaf)
	{
		node->child[node->n + 1] = othernode->child[0];
		for(i = 0; i <= othernode->n - 1; i++)
			othernode->child[i] = othernode->child[i + 1];
		
	}

	node->n = node->n + 1;
	othernode->n = othernode->n - 1;
}

/* 
 * 当下降的结点node的关键字个数为T-1时,
 * 为了满足下降过程中,遇到的结点的关键字个数大于等于T,
 * 对结点parent、node、othernode三个结点的关键字做调整。
 * 当node在other右侧时,即node的左结点时(父结点的左子结点),
 * node结点的关键字和子结点(如果有的话)向后移动一位,
 * 在第一个位置增加一个关键字,其值为父结点对应的关键字值,
 * 将父结点对应关键字值赋值为左子结点中的最后一个关键字。
 * 修改左子结点和该结点的n值
 */
void
btree_right(BTreeNode parent, BTreeNode node, BTreeNode othernode, int location)
{
	int i = 0;

	for(i = node->n - 1; i >= 0; i--)
		othernode->key[i+1] = othernode->key[i];

	node->key[0] = parent->key[location];
	parent->key[location] = othernode->key[othernode->n];

	if(!node->leaf)
	{
		node->child[0] = othernode->child[othernode->n + 1];
		for(i = othernode->n; i >= 0; i--)
			othernode->child[i + 1] = othernode->child[i];
		
	}

	node->n = node->n + 1;
	othernode->n = othernode->n - 1;
}

/*
 * 合并两个关键字个数为T-1父结点为parent位置为location的子结点
 * 以父结点对应的关键字为中间值连接两个子结点
 * 并返回需要下降的子结点位置
 */
int
btree_merge_child(BTreeNode parent, int location)
{
	int i;
	BTreeNode	lnode = NULL;
	BTreeNode	rnode = NULL;

	if(location == parent->n)
		location--;
	
	lnode = parent->child[location];
	rnode = parent->child[location + 1];

	/* 将父结点对应的关键字以及右兄弟所有的关键字复制该结点,同时修改左子的n值 */
	lnode->key[lnode->n] = parent->key[location];
	for(i = 0; i < rnode->n; i++)
	{
		lnode->key[MIN_T + i] = rnode->key[i];
		lnode->n++;
	}

	/* 如果有子结点同样复制到该结点 */
	if(!rnode->leaf)
		for(i = 0; i <= rnode->n; i++)
			lnode->child[MIN_T + i] = rnode->child[i];

	rnode->n= 0;
	lnode->n = MAX_T - 1;

	/* 对父结点相应的关键字和子结点位置发生变化 */
	for(i = location; i < parent->n - 1; i++)
	{
		parent->key[i] = parent->key[i + 1];
		parent->child[i + 1] = parent->child[i + 2];
	}

	/* 调整父结点的n值 */
	parent->n = parent->n - 1;
	rnode = NULL;

	return location;
}

/*
 * 对叶子结点node位置为location的关键字删除
 * 直接将位置location后的关键字向前移动一位
 */
void
btree_delete_leaf(BTreeNode node, int location)
{
	int i = 0;

	for(i = location; i < node->n - 1; i++)
		node->key[i] = node->key[i + 1];

	node->n = node->n - 1;
}

/*
 * 删除该层数组坐标为i的关键字
 */
int
btree_delete_node_in(BTreeNode r_node, int i)
{

	BTreeNode lnode = r_node->child[i];
	BTreeNode rnode = r_node->child[i + 1];
	int temp = 0;

	/* 
	* 当前于该位置的关键字的左子结点关键字个数大于等于T时,
	* 寻找该位置的关键的前驱(左子结点的最大关键字)
	*/
	if(lnode->n >= MIN_T)
	{
		BTreeNode newnode = btree_maximum(lnode);
		temp = r_node->key[i];
		r_node->key[i] = newnode->key[newnode->n - 1];
		newnode->key[newnode->n - 1] = temp;
	}
   /*
	* 相反的,若右子结点符合条件,则找寻后继(即右子结点的最小关键字)
	*/
	else if(rnode->n >= MIN_T)
	{
		BTreeNode newnode = btree_minimum(rnode);
		temp = r_node->key[i];
		r_node->key[i] = newnode->key[0];
		newnode->key[0] = temp;

		i++;
	}
   /*
	* 当左右子结点都不符合条件,则合并两个子结点
	*/
	else	i = btree_merge_child(r_node, i);

	return i;
}

/*
 * 删除以r_node为根结点的树的关键字key
 */
void
btree_delete_node(BTreeNode r_node, int key)
{
	int i = 0;


	/* 寻找关键字位置,或者下降的子结点位置 */
	while(i < r_node->n && key > r_node->key[i])
		i++;

	/* 若再该层且为叶子结点删除结点,否则下降寻找结点删除 */
	if(i < r_node->n && key == r_node->key[i])
		if(r_node->leaf)
			btree_delete_leaf(r_node, i);
		else
		{
			i = btree_delete_node_in(r_node, i);
			
			btree_delete_node(r_node->child[i], key);
		}
	else
	{
		if(r_node->leaf)
			printf("there is no the key %d!!\n", key);
		else
		{
			if(r_node->child[i]->n >= MIN_T){
				btree_delete_node(r_node->child[i], key);}
			else
			{
				if(i > 0 && r_node->child[i - 1]->n >= MIN_T)
				{
					btree_right(r_node, r_node->child[i], r_node->child[i - 1], i);}
				else if(i < r_node->n && r_node->child[i + 1]->n >= MIN_T)
					btree_left(r_node, r_node->child[i], r_node->child[i + 1], i);
				else
					i = btree_merge_child(r_node, i);

				btree_delete_node(r_node->child[i], key);
			}
		}
	}
}

/*
 * 删除树内的关键字key,如果根结点为空,则替换根结点
 */
void
btree_delete(BTree tree, int key)
{
 BTreeNode r_node = tree->root;
 btree_delete_node(r_node, key);
 if(tree->root->n == 0 && tree->root->leaf == 0)
   tree->root = tree->root->child[0];
}

这是实现B树的详细C代码。

为了验证结果我以1-100数字作为关键字插入到树中,并且查找5,33的位置,删除100,94,81,36,42,下面看一下结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
{
	BTree tree = (BTree) malloc (BTREE_SIZE);
	tree->root	= (BTreeNode) malloc (BTREE_NODE_SIZE);

	int keys[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,24,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,
82,81,83,84,85,86,87,88,89,90,91,92,99,94,93,95,96,97,98,100};
	int i = 0;

	btree_create(tree);
	for(i = 0; i <= 99; i++){
		btree_insert(tree, keys[i]);
		//display_btree(&tree);
		}
btree_max(tree);
	display_btree(tree);
	btree_max(tree);
	btree_min(tree);
	btree_search(tree->root,5);

	btree_search(tree->root,33);


	btree_delete(tree, 100);
	display_btree(tree);
	btree_delete(tree, 94);
	display_btree(tree);
	btree_delete(tree, 81);
	display_btree(tree);
	btree_delete(tree, 36);
	display_btree(tree);

btree_delete(tree, 42);

	display_btree(tree);
	btree_max(tree);
	btree_min(tree);

	free(tree);	
	return 0;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# gcc -o btree btree.c -Wall
[root@localhost ~]# ./btree 
the max is 100

输出完全插入后的树:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
27 54   $$
9 18   36 45   63 72 81 90   $$
3 6   12 15   21 24   30 33   39 42   48 51   57 60   66 69   75 78   84 87   93 96   $$
1 2   4 5   7 8   10 11   13 14   16 17   19 20   22 23   25 26   28 29   31 32   34 35   37 38   40 41   43 44   46 47   49 50   52 53   55 56   58 59   61 62   64 65   67 68   70 71   73 74   76 77   79 80   82 83   85 86   88 89   91 92   94 95   97 98 99 100   $$

输出关键字的做大最小值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
the max is 100
the min is 1

输出5,33的位置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
the 5 key's location is 1 in the node 0x9ff50c0
the 33 key's location is 1 in the node 0x9ff53d0

删除100后的树:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
27 54   $$
9 18   36 45   63 72 81   $$
3 6   12 15   21 24   30 33   39 42   48 51   57 60   66 69   75 78   84 87 90 93 96   $$
1 2   4 5   7 8   10 11   13 14   16 17   19 20   22 23   25 26   28 29   31 32   34 35   37 38   40 41   43 44   46 47   49 50   52 53   55 56   58 59   61 62   64 65   67 68   70 71   73 74   76 77   79 80   82 83   85 86   88 89   91 92   94 95   97 98 99   $$

删除94后的树:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
27 54   $$
9 18   36 45   63 72 81   $$
3 6   12 15   21 24   30 33   39 42   48 51   57 60   66 69   75 78   84 87 90 93 97   $$
1 2   4 5   7 8   10 11   13 14   16 17   19 20   22 23   25 26   28 29   31 32   34 35   37 38   40 41   43 44   46 47   49 50   52 53   55 56   58 59   61 62   64 65   67 68   70 71   73 74   76 77   79 80   82 83   85 86   88 89   91 92   95 96   98 99   $$

删除81后的树:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
27 54   $$
9 18   36 45   63 72 82   $$
3 6   12 15   21 24   30 33   39 42   48 51   57 60   66 69   75 78   87 90 93 97   $$
1 2   4 5   7 8   10 11   13 14   16 17   19 20   22 23   25 26   28 29   31 32   34 35   37 38   40 41   43 44   46 47   49 50   52 53   55 56   58 59   61 62   64 65   67 68   70 71   73 74   76 77   79 80   83 84 85 86   88 89   91 92   95 96   98 99   $$

删除36后的树:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
27 63   $$
9 18   45 54   72 82   $$
3 6   12 15   21 24   30 33 39 42   48 51   57 60   66 69   75 78   87 90 93 97   $$
1 2   4 5   7 8   10 11   13 14   16 17   19 20   22 23   25 26   28 29   31 32   34 35 37 38   40 41   43 44   46 47   49 50   52 53   55 56   58 59   61 62   64 65   67 68   70 71   73 74   76 77   79 80   83 84 85 86   88 89   91 92   95 96   98 99   $$

删除42后的树:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
27   $$
9 18   45 54 63 72 82   $$
3 6   12 15   21 24   30 33 39   48 51   57 60   66 69   75 78   87 90 93 97   $$
1 2   4 5   7 8   10 11   13 14   16 17   19 20   22 23   25 26   28 29   31 32   34 35 37 38   40 41 43 44   46 47   49 50   52 53   55 56   58 59   61 62   64 65   67 68   70 71   73 74   76 77   79 80   83 84 85 86   88 89   91 92   95 96   98 99   $$

最后再输出一次最大最小值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
the max is 99
the min is 1
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
查找--数据结构
查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。
宁在春
2022/10/31
6570
查找--数据结构
文心一言 VS 讯飞星火 VS chatgpt (251)-- 算法导论18.2 4题
B树(B-tree)是一种自平衡的树,常用于数据库和文件系统的索引结构。在B树中,每个节点最多有 m 个子节点(对于B树,m 是阶数,即节点的最大子节点数),并且每个非根节点至少有 ⌈m/2⌉ 个子节点(其中 ⌈x⌉ 表示不小于 x 的最小整数)。
福大大架构师每日一题
2024/05/18
970
文心一言 VS 讯飞星火 VS chatgpt (251)-- 算法导论18.2 4题
文心一言 VS 讯飞星火 VS chatgpt (248)-- 算法导论18.2 1题
首先,我们要了解B树(B-tree)的基本概念和插入规则。B树是一种自平衡的树,主要用于磁盘或其他直接存取辅助设备中的数据存储。一个度为m的B树满足以下条件:
福大大架构师每日一题
2024/04/30
1130
文心一言 VS 讯飞星火 VS chatgpt (248)-- 算法导论18.2 1题
树(8)
B-Tree树即B树,B即Balanced,平衡的意思。有人把B-Tree翻译成B-树,容易让人产生误解。会以为B-树是一种树,而B树又是另一种树。实际上,B-Tree就是指的B树。
JusterZhu
2022/12/07
2280
树(8)
【愚公系列】2023年11月 七大查找算法(五)-树查找
在编程语言中,查找算法是指在一个数据集合中查找某个元素是否存在的算法。常见的查找算法包括:
愚公搬代码
2023/11/18
2680
文心一言 VS 讯飞星火 VS chatgpt (253)-- 算法导论18.2 6题
首先,我们要明确B树(B-tree)是一种自平衡的树,常用于数据库和文件系统的索引结构。B树的一个关键特性是每个非叶子节点(除了根节点和叶子节点)至少包含 t-1 个关键字和 t 个子节点,其中 t 是B树的最小度数(minimum degree)。B树的高度是 O(log_t n),其中 n 是树中关键字的总数。
福大大架构师每日一题
2024/05/17
1220
文心一言 VS 讯飞星火 VS chatgpt (253)-- 算法导论18.2 6题
二叉查找树 C++实现(含完整代码)
       一般二叉树的查找是通过遍历整棵二叉树实现,效率较低。二叉查找树是一种特殊的二叉树,可以提高查找的效率。二叉查找树又称为二叉排序树或二叉搜索树。
Tencent JCoder
2022/05/06
6870
二叉查找树 C++实现(含完整代码)
【数据结构】树——二叉搜索树(C++)
不移动大量数据可以用链表实现,但是寻找合适的位置还得遍历每个结点的data。如何高效的进行此操纵呢。
半生瓜的blog
2023/05/13
2150
【数据结构】树——二叉搜索树(C++)
文心一言 VS 讯飞星火 VS chatgpt (252)-- 算法导论18.2 5题
当我们在B树(或B+树)中考虑不同大小的内部结点和叶结点时,我们可以为每个类型的结点选择不同的t值。内部结点可以有一个较小的t值(例如t_internal),因为它们需要额外的空间来存储指向子结点的指针。而叶结点因为不需要存储子指针,所以可以有一个较大的t值(例如t_leaf),从而存储更多的键值对。
福大大架构师每日一题
2024/05/17
1260
文心一言 VS 讯飞星火 VS chatgpt (252)-- 算法导论18.2 5题
DS高阶:B树系列
        若接近有序的数据插入到BS中,会导致退化成单支树,时间复杂度退化为O(N)
小陈在拼命
2024/05/26
1010
DS高阶:B树系列
C++:AVL树保姆级详解
当搜索二叉树退化成一条链的时候,搜索的时间复杂度将会变成O(N),效率就会变的很低;说到底产生这的原因就是在二叉树的高度上没有要求;AVL树的实现解决了这个问题;
啊QQQQQ
2024/11/19
650
C++:AVL树保姆级详解
文心一言 VS 讯飞星火 VS chatgpt (243)-- 算法导论18.1 1题
在B树中不允许最小度数 t=1 的主要原因在于这样会导致树的结构退化为链表,失去了B树作为平衡多路搜索树的优势。当 t=1 时,每个非根节点将只能包含最多一个关键字和两个子节点,这使得B树不再能够有效地利用空间,并且在搜索、插入和删除操作上性能会大大降低。
福大大架构师每日一题
2024/04/25
1460
文心一言 VS 讯飞星火 VS chatgpt (243)-- 算法导论18.1 1题
深入探讨磁盘B树的内部机制:代码实现与理论解析
红黑树、B/B+树、Hash是非常常用的数据结构,特别是布隆过滤器。这三个数据结构都是具备查找功能的,是一种强查找的数据结构。比如将它们用于存储一个集合,可以快速查找到指定的数据。排序的数据结构,在平常用的时候,基本上都是这几个。这篇文章都将帮助深入了解磁盘B树。
Lion Long
2024/09/12
2220
深入探讨磁盘B树的内部机制:代码实现与理论解析
算法导论第十八章 B树
一、高级数据结构   本章以后到第21章(并查集)隶属于高级数据结构的内容。前面还留了两章:贪心算法和摊还分析,打算后面再来补充。之前的章节讨论的支持动态数据集上的操作,如查找、插入、删除等都是基于简单的线性表、链表和树等结构,本章以后的部分在原来更高的层次上来讨论这些操作,更高的层次意味着更复杂的结构,但更低的时间复杂度(包括摊还时间)。 B树是为磁盘存储还专门设计的平衡查找树。因为磁盘操作的速度要远远慢于内存,所以度量B树的性能,不仅要考虑动态集合操作消耗了多少计算时间,还要考虑这些操作执行了多少次磁盘
Linux云计算网络
2018/01/11
7370
算法导论第十八章 B树
一个简单的二叉搜索树(C++实现)
参考:http://www.cnblogs.com/skywang12345/p/3576373.html
xcywt
2022/05/09
2630
九种查找算法
对于任意一个序列,从一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。
C语言与CPP编程
2020/10/19
1.1K0
libuv源码阅读(3)--heap-inl.h
总结:最小时间堆是libuv用来管理 定时器容器的,每个定时器容器以超时时间排序,插入到堆中,每次事件循环中查看是否有超时的定时任务。
wanyicheng
2021/03/06
4220
libuv源码阅读(3)--heap-inl.h
文心一言 VS 讯飞星火 VS chatgpt (256)-- 算法导论18.3 2题
首先,我会提供 B-Tree 删除操作的伪代码,然后我会给出使用 Go 语言实现的简化版本。请注意,一个完整的 B-Tree 实现会涉及很多细节和边界情况,这里只是展示一个基本的框架。
福大大架构师每日一题
2024/05/17
1290
文心一言 VS 讯飞星火 VS chatgpt (256)-- 算法导论18.3 2题
磁盘读写了解
1、时间复杂度o(1), o(n), o(logn), o(nlogn)。算法时间复杂度有的时候说o(1), o(n), o(logn), o(nlogn),这是算法的时空复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。
heidsoft
2022/01/11
1.1K0
磁盘读写了解
Java数据结构与算法解析(九)——B树
在计算机科学中,B树(英语:B-tree)是一种自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。
老马的编程之旅
2022/06/22
5150
Java数据结构与算法解析(九)——B树
相关推荐
查找--数据结构
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文