问题描述
它到底有什么优势?搞了1天,我愣是没看明白。。查找到底如何快了,为什么数据索引都是用它。。比如我有一组数string[]a={"Nick","Nnn","Aba","Nna","AAA"};如果把它B树化,它是如何构造的?查找是如何查找的?要说查找快的话,当然是哈希表,查找是O(1),那叫一个快。。
解决方案
解决方案二:
啥意思呀,B树,。。。哪来的这词。。
解决方案三:
B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;
解决方案四:
好高端。
解决方案五:
你可以找一本数据结构的教材看一下。B树是稳定可预测的,它可以保证查询的时间复杂性。并且它是具有合理的数据结构的,因此可以保证跟磁盘块的索引方式相一致。hash主要是针对内存中的数组,而不是针对海量数据。当把它针对海量数据来使用时,也还是必须使用类似“树”的形式将hash值映射到存储上,就不会显得快了。说“hash是o(1)的”这其实不可靠,只能说hash方法最快是o(1)的,但是最慢呢?其实hash方法最慢是o(n)。因此说hash很快,可以说hash跟“全表扫描接近”而很慢。hash是不稳定的,尽管达到“最慢”的可能性并不高,但是同样也不能保证总是达到最快的性能。因为它跟hash的算法有关,你用少量数据是不能测试出来的。比如说有1000万记录,假设用B+树可以保证平均进行13次读取操作读(假设不考虑缓存的情况下)就能查询出来记录,而用hash并不能永远都是最快1次读取操作就读取出来,也不能保证20次读取读就能读取出来(比如说信息集中于某一小部分hash值)。而且把hash值从内存转移到对应的磁盘具体的磁道、磁盘块上也是非常复杂的。
解决方案六:
引用2楼xuzuning的回复:
B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;
B-树:多路搜索树比如有ABC,ABB,AC是不是就像A||BC||CB这样来构建?
解决方案七:
B树未必是“二叉”的。在节点上往往是一个数组,例如有120个容量空间,而不总是只能容2个索引。而且说“n叉树、平衡树、B+树、B*树”等等,这只是一般的理论性的叫法。实际的系统,每一个都进行了扩充和优化,比理论上的模型更优。
解决方案八:
引用4楼sp1234的回复:
你可以找一本数据结构的教材看一下。B树是稳定可预测的,它可以保证查询的时间复杂性。并且它是具有合理的数据结构的,因此可以保证跟磁盘块的索引方式相一致。hash主要是针对内存中的数组,而不是针对海量数据。当把它针对海量数据来使用时,也还是必须使用类似“树”的形式将hash值映射到存储上,就不会显得快了。说“hash是o(1)的”这其实不可靠,只能说hash方法最快是o(1)的,但是最慢呢?其实hash方法最慢是o(n)。因此说hash很快,可以说hash跟“全表扫描接近”而很慢。hash是不稳定的,尽管达到“最慢”的可能性并不高,但是同样也不能保证总是达到最快的性能。因为它跟hash的算法有关,你用少量数据是不能测试出来的。比如说有1000万记录,假设用B+树可以保证平均进行13次读取操作读(假设不考虑缓存的情况下)就能查询出来记录,而用hash并不能永远都是最快1次读取操作就读取出来,也不能保证20次读取读就能读取出来(比如说信息集中于某一小部分hash值)。而且把hash值从内存转移到对应的磁盘具体的磁道、磁盘块上也是非常复杂的。
我大概明白你的意思。hash在理想的情况下(不同的key通过hash函数转换后的结果是不同的)是o(1)。如果冲突,接下来的查找就是线性的了。。关键是hash函数。。我主要不明白B树它到底是怎么构造和查找的,我愣是没明白。。我看了很多资源。。是不是像我5楼的回复那样构造?如果数据为5-18位长,我最多查找18次肯定能找到我要的数据
解决方案:
假设用B+树可以保证平均进行13次读取操作读-->假设用B+树可以保证最慢进行13次读取操作读用B+树,我们说“可以保证最慢进行多少次读操作(不考虑缓存的情况下)就能查询到”。而用hash,我们说“最快可以达到o(1)。这种差别就看得出来了!保存大量数据的最初,为了靠谱起见,必须能够使用B+树,而不是hash。但是作为研究,你可以自己在B+排序以外在选择hash排序,那是你自己的“爱好”。
解决方案:
中序,左序,右序……我全都忘了