加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

自己实现基于key-value的NoSQL数据库(三)—— B+树和Hash算法

发布时间:2020-12-13 13:41:01 所属栏目:百科 来源:网络整理
导读:前一篇文章中,效率成了很关键的问题,比较数据库还是需要能高效查找数据才行 那么如何解决查找问题呢?一个很好的办法是使用B+树,关于B+树就不做多的介绍了,网上有很多 这里只贴出定义 B-树 是一种多路搜索树(并不是二叉的): 1.定义任意非叶子结点最多

前一篇文章中,效率成了很关键的问题,比较数据库还是需要能高效查找数据才行


那么如何解决查找问题呢?一个很好的办法是使用B+树,关于B+树就不做多的介绍了,网上有很多

这里只贴出定义


B-树

       是一种多路搜索树(并不是二叉的):

       1.定义任意非叶子结点最多只有M个儿子;且M>2;

       2.根结点的儿子数为[2,M];

       3.除根结点以外的非叶子结点的儿子数为[M/2,M];

       4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)

       5.非叶子结点的关键字个数=指向儿子的指针个数-1;

       6.非叶子结点的关键字:K[1],K[2],…,K[M-1];且K[i] < K[i+1];

       7.非叶子结点的指针:P[1],P[2],P[M];其中P[1]指向关键字小于K[1]的

子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1],K[i])的子树;

       8.所有叶子结点位于同一层;

       如:(M=3)


B+树

       B+树是B-树的变体,也是一种多路搜索树:

       1.其定义基本与B-树同,除了:

       2.非叶子结点的子树指针与关键字个数相同;

       3.非叶子结点的子树指针P[i],指向关键字值属于[K[i],K[i+1])的子树

(B-树是开区间);

       5.为所有叶子结点增加一个链指针;

       6.所有关键字都在叶子结点出现;

至于实现,给出一个连接可以看看 https://github.com/begeekmyfriend/bplustree


然后数据库的键是字符串型的,如果转换出数字呢?答案是用hash算法,网上也有很多经典的实现

这里给出Bizzard公司的经典算法(采用了部分,不是全部)

#pragma once

#include <string>

unsigned long cryptTable[0x500];

void prepareCryptTable()
{
	unsigned long seed = 0x00100001,index1 = 0,index2 = 0,i;

	for (index1 = 0; index1 < 0x100; index1++)
	{
		for (index2 = index1,i = 0; i < 5; i++,index2 += 0x100)
		{
			unsigned long temp1,temp2;
			seed = (seed * 125 + 3) % 0x2AAAAB;
			temp1 = (seed & 0xFFFF) << 0x10;
			seed = (seed * 125 + 3) % 0x2AAAAB;
			temp2 = (seed & 0xFFFF);
			cryptTable[index2] = (temp1 | temp2);
		}
	}
}

unsigned long HashString(const std::string& key,unsigned long dwHashType)
{
	unsigned char *ckey = (unsigned char *)key.c_str();
	unsigned long seed1 = 0x7FED7FED,seed2 = 0xEEEEEEEE;
	int ch;
	while (*ckey != 0)
	{
		ch = toupper(*ckey++);
		seed1 = cryptTable[(dwHashType << 8) + ch] ^ (seed1 + seed2);
		seed2 = ch + seed1 + seed2 + (seed2 << 5) + 3;
	}
	return seed1;
}

暴雪的源码中是用了三次hash值来决定一个数据的,数据冲突的几率是 1: 18889465931478580854784 几乎不可能出现

而我们这里由于纯粹的学习原理而已,所以采用一次就行了


接下来就是要把这两个算法整合进数据库中,用来代替以前的搜索算法

需要对算法进行一定的修改


在下一张章中实现

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读