本文是我学习查找的一点感悟,希望给没有接触过的人的一个大体的概念。
数据结构这门课程中,树是比较难以理解的,但是树在工作中用的也是最多的,要想弄懂底层的一些细节,树是必须要掌握的,即使它在难,只要持之以恒,都是可以学会弄懂,做到融会贯通的。
查找,就是在一堆元素中找到自己需要的那个。比较简单的,大家都能想到的,就是把自己要找的和这些记录逐个比较,找到符合自己的,然后取出来,如果把这些记录都遍历完了,也没找到,那就证明没有你需要的。这个太简单易懂了。但是在计算机世界中,这样通俗易懂简单粗暴的方式未必是最高效的。你想想,如果数据量好几T,那每次找个记录都遍历一次,那也太傻了吧。于是乎哪些计算机届的前人们就开始思考,如何能更高效的查询???
查询的本质在于:数据是如何存储的。上面遍历查询的方式,也许是数据的保存毫无规律,没法,只能去遍历。但是如果数据保存是有规律的呢?比如说按照存储的记录某个特性升序或者降序去存储,那么我查询是不是会快很多。只要保存的方式有规律可循,那么查询肯定比杂乱无章的存储快很多!
假设数据是按照升序排列存储的吧。既然数据的存储是升序,那么我可以采用二分查找吧。也就是先把自己要查的关键值和存储数据中间的元素做比较,如果正好相等,那恭喜你,中大奖了。如果没有找到,别气馁,根据代查找元素和中间那个值的大小判断数据在那个范围,然后在那个范围继续用二分查找,如此下去,直到找到那个元素,或没找到。这个方法比之前的方法好多了吧。它不用去和所有的数据逐个比较,只要和少数几个比较,就可以找到,效率确实快了很多。是个查找的好方法。
那么这个是不是最优查找了呢?至少和第一个方法比起来是这样的。要知道人类是永远不会满足的。所以哪些计算机届的前辈们还是想找更快一点的方法。因为二分查找的确有问题啊!!!比如说,我的数据很大,好几T,即使是二分查找,依然要比较很多次。但是我们还想更快点,于是我们想给这些数据按照范围建个索引吧。建索引在计算机里是很常见的做法。一个指针指向某个范围内的元素,然后把这些指针存储起来,查找时先找到对应的索引,然后找到相应的记录,对于大的数据而言,这样的确时快很多。如果我们愿意,还可以建二级三级索引,对于大的数据貌似可以,这个也比较直观的。
不知道大家注意到没,上面的讨论都是局限于线性结构。开始说要讨论树,现在还没见到树的影子呢!是的,线性的东西比较直观,也好理解,但是树就需要更深一步思考了。如果把查找和树联系在一起呢???这个思维过程是怎么样的???这个才是最重要的,如果不理解树,死记硬背是毫无意义的,一定要知道它的来龙去脉才能彻底弄懂。
天才往往是看的比别人思考的更多,也更深。再来看看二分查找,中间的元素只需一次就能找到,1/4 和 3/4 的元素只需两次, 1/8,3/8,5/8 和 7/8 的元素只需三次,如此下去,发现这个规律好像和二叉树很像,中间元素是根,1/4 和 3/4 的元素是根的两个节点,,,而且查找的次数就是节点的深度。啊啊,这个发现很了不起。它打开了一个大门,从线性向非线性的大门。大门已被打开,下面就是如何进入这个大门。我们知道,如果数据的保存是有序的,那么数据的查找会比无序的查询要快,到底能快多少,这个就要看存储的序有多好。那么我们就来看看如何构造有序的树吧。
这个就需要想象力了。当然想象以后还是需要数学去验证,它是不是很高效。
首先,树分为二叉树和森林。二叉树很简单,每个节点最多两个分支。那么我如何利用这两个分支呢?序!!!数据保存在这些节点上要有序!!!那什么序好呢?首先序要一致吧。如果不一致,实现起来很麻烦也不好。节点有数据,左分支,又分支构成。如果我让每个节点的数据有序,那么整个树不就是有序了。那么这三者的序是如何呢?升序还是降序,左右分支排序是怎么样的。这中间应该有很多考虑和复杂的计算,本博客只是讲思路,就不深入下去了。因为牛逼轰轰的前辈大牛们已经给我们弄好了。咱们就把节点上的树按左节点树最小,又节点最大,中间居中,如何?其实这个就是二叉排序树。树中的每个节点都符合这样的规则。就这么简单吗?是的,思想就是这么简单。但是要考虑到存储,构造这样的二叉树,则很复杂,但是思想它就是这么简单!简单就是美。经过数学计算,这样的树效率可以比上面的要好很多。但是世界上没有十全十美的,它的缺点就是,有时候,树的倾斜太厉害,根的左右两个分支高度差距太大了。那么我们就想方设法让它们差距尽可能小呗,哈,这就是平衡二叉树。确定说是每个节点上两个分支的高度差不能超过1,简单吧。但是复杂的是实现。。。
我觉得二叉树差不多就这样了吧,因为它就两个分支,还能咋变化呢?真正复杂的是森林吧,就是一个节点可以有多于两个分支。这个存储数据,效率会不会比二叉树高?我想会!因为同样的数据量,它会更矮。矮,比较次数也会更少,查询效率也会更高吧。当然对于数据量很大的,如果数据量很小,,,不准抬杠你们。
看看多叉(相比于二叉,多叉,计算机没这么叫的吧)是如何存储数据的吧。它的定义好抽象,不好理解。我就把它翻译成白话文吧。
1 树个节点上可以有很多元素,这些元素呢按照升序排列,这是必须的啊。
2 其次,这些个元素中间用一些指针隔开,元素左边指针指向的元素小于这个节点,右边指针都大于这个元素。除了叶子节点,其余节点必须都遵循这个规则。
3 所有叶子节点都在同一个深度。
over 了
唉,太简单了,简单到我都不想说了。但是但是,这个的实现,增删改查,还是很复杂的。但是原理就这么简单就这么任性。
数据都这么存储了,怎么查,我想我就不说了,你们应不会打我吧。
上面就是B树。
再来说说什么是 B+树吧,本人曾在面试中被问的一脸懵比,计算机就这样,学过简单要死,没学过,打死也不会。
B+树其实就是B树的变种,所以B没变,只是多了个+,嘿嘿。多了个+是有原因的,那就是每个节点的元素比B树多一个。B树节点元素比分支树少一个,B+树呢?
1 就是节点元素树和分支树一样啊,也就是一个元素上跟一个节点(这不是wodang的独生子女政策么)
2 元素指向的那个节点中的元素都是小于等于这个元素本身值
3 每个节点中的元素都是升序排列,这个老生长谈了,奉行wodang独生子女政策,二胎暂时还没放开。。。。
万事开头难,坚持总会胜利!
全文完!

被折叠的 条评论
为什么被折叠?



