Atitit 查找算法 艾提拉大总结
目录
1.1. 简单查找算法之折半查找、插值查找、斐波那契查找 1
8.1开场白 292
当你精心写了一篇博文或者上传一组照片到互联网上,来自世界各地的无数“蜘蛛”便会蜂拥而至。所谓蜘蛛就是搜索引擎公司服务器上软件,它把互联网当成了蜘蛛网,没日没夜的访问上面的各种信息。
8.2查找概论 293
比如网络时代的新名词,如“蜗居”、“蚁族”等,如果需要将它们收录到汉语词典中,显然收录时就需要查找它们是否存在,以及找到如果不存在时应该收录的位置。
8.3.1顺序表查找算法 296
8.3.2顺序表查找优化 297
我在纸上已经写好了一个100以内的正整数请你猜,问几次可以猜出来。当时已经介绍了如何才可以最快的猜出这个数字。我们把这种每次取中间记录查找的方法叫做折半查找。
实现这三种查找算法前,都需要对数据进行排序,三种的算法复杂度大致为log(n),针对于分布均匀的数组,插值查找的性能好于折半查找,插值查找涉及到了乘法除法运算,对于大量的数据查找效率显出低效,fabonacci查找只含有加减法运算,可以节省一定的计算量。
插值查找,与折半查找类似,也有三个“哨兵”,不过这次mid的取值不是通过简单low与high相加的一般。mid的取值是要通过计算key与low所对应元素的差异性。mid=low + ( key - a[low] ) * ( high - low ) / ( a[high]-a[low] )。后面的查找过程与折半查找类似
---------------------
在插值查找中,mid = low + ( (key - a[low]) / (a[high] - a[low]) ) * (high - low)。该算法对表长较大,而关键字分布比较均匀的情况下,性能较高,而对于分布不均匀的数据,则不太适用。
---------------------
当翻字典找单词,比如“better”时,我们绝逼不是从字典中间开始找,而是,相对靠前找吧,这就是按照一定的比例来进行分割查找的过程;
折半查找,我们计算mid的方式是:
mid = (low + high) / 2, 也就是 low + 1/2 * (high - low) ;
插值将其改进成:
mid = low + (key-a[low]/a[high]-a[low])*(high-low);
也就是将上述的比例参数1/2改进为自适应的,根据关键字在整个有序表中所处的位置,让mid值的变化更靠近关键字key,这样也就间接地减少了比较次数。
-
- 8.4.3斐波那契查找 302
斐波那契查找利用了黄金分割原理来实现。
黄金比例又称黄金分割,是指事物各部分间一定的数学比例关系,即将整体一分为二,较大部分与较小部分之比等于整体与较大部分之比,其比值约为1:0.618或1.618:1。
斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,从第3个数开始,后面的数为前面2个数的和,随着,数组长度的增加,前一个数比后一个数的值,越来越接近0.618,利用这个特性,可以将黄金比例运用到查找技术中。
黄金比例查找也是二分查找的一种提升算法,通过运用黄金比例的概念在数列中选择查找点进行查找,提高查找效率;
上述查找针对海量数据时,耗时非常大,故有了索引查找。
线性索引包括:稠密索引、分块索引、倒排索引。
稠密索引
稠密索引即数据集中每一个记录都对应一个索引。如下图所示:
对于稠密索引来说,索引的关键字一定是按照有序排列的。
缺点:索引量与数据量是同样规模的,反复读取索引耗时大。
即对数据集进行分块,每个块之间是有序的,对每个块建立索引项,从而减少索引的数量。
分块满足的两个条件
我母亲年纪大了,经常在家里找不到东西,于是她用一小本子,记录了家里所有小东西放置的位置,比如户口本放在右手床头柜下面抽屉中,钞票放在衣……咳,这个就不提了。
8.5.1稠密索引 307
8.5.2分块索引 308
8.5.3倒排索引 311
-
- 8.6二叉排序树 313
后来老虎来了,一人拼命地跑,另一人则急中生智,爬到了树上。而老虎是不会爬树的,结果……。爬树者改变了跑的思想,这一改变何等重要,捡回了自己的一条命。
8.6.1二叉排序树查找操作 316
8.6.2二叉排序树插入操作 318
8.6.3二叉排序树删除操作 320
8.6.4二叉排序树总结 327
平板就是一个世界,当诱惑降临,人心中的平衡被打破,世界就会混乱,最后留下的只有孤独寂寞失败。这种单调的机械化的社会,禁不住诱惑的侵蚀,最容易被侵蚀的,恰恰是最空虚的心灵。
8.7.1平衡二叉树实现原理 330
8.7.2平衡二叉树实现算法 334
-
- 8.8多路查找树(b树) 341
要观察一个公司是否严谨,看他们如何开会就知道了。如果开会时每一个人都只是带一张嘴,即兴发言,这肯定是一家不严谨的公司。
8.8.12-3树 343
8.8.22-3-4树 348
8.8.3b树 349
8.8.4b+树 351
-
- 8.9散列表查找(哈希表)概述 353
你很想学太极拳,听说学校有个叫张三丰的人打得特别好,于是到学校学生处找人,工作人员拿出学生名单,最终告诉你,学校没这个人,并说张三丰几百年前就已经在武当山作古了。
8.9.1散列表查找定义 354
8.9.2散列表查找步骤 355
8.10散列函数的构造方法 356
8.10.1直接定址法 357
8.10.2数字分析法 358
8.10.3平方取中法 359
8.10.4折叠法 359
8.10.5除留余数法 359
8.10.6随机数法 360
8.11处理散列冲突的方法 360
我们每个人都希望身体健康,虽然疾病可以预防,但不可避免,没有任何人可以说,生下来到现在没有生过一次病。
8.11.1开放定址法 361
8.11.2再散列函数法 363
8.11.3链地址法 363
8.11.4公共溢出区法 364
8.12散列表查找实现 365
8.12.1散列表查找算法实现 365
8.12.2散列表查找性能分析 367
8.13总结回顾 368
8.14结尾语 369
如果我是个喜欢汽车的人,时常搜汽车信息。那么当我在搜索框中输入“甲壳虫”、“美洲虎”等关键词时,不要让动物和人物成为搜索的头条。
- ref
Atitit 查找算法 艾提拉大总结
大话数据结构读书笔记艾提拉总结.docx
Atitit.数据结构原理概论
(2条消息)简单查找算法之折半查找、插值查找、斐波那契查找 - 不积跬步,无以致千里;不积小流,无以成江海 - CSDN博客.html
插值查找(死循环)与斐波那契查找.html
(2条消息)数据结构之线性索引查找 - rainxuanz的博客 - CSDN博客.html