大话数据结构——查找

查找(Searching)是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。

一、顺序表查找

顺序查找又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)记录开始,逐个记性记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找陈宫,找到所查的记录;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找不成功。
时间复杂度为O(n)。

二、有序表查找

(一)折半查找
折半查找又称二分查找。它的前提是线性表中的记录必须是关键码有序(通常是从小到大有序),线性表必须采用顺序存储。
折半查找的基本思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。
时间复杂度为O(logn)

(二)插值查找
插值查找的关键是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法,其核心就在于插值的计算公式(key-a[low])/(a[high]-a[low])。
从时间复杂度上看,它也是O(logn),但对于表长比较大,而关键字分布又比较均匀的查找表来说,插值查找算法的平均性能比这般查找要好很多。

(三)斐波那契查找

三、线性索引查找

索引是把一个关键字与它对应的记录相关联的过程。一个索引由若干个索引构成,每个索引项至少应包含关键字和其对应的记录在存储器中的位置等信息。
线性索引是将索引项集合组织委员线性结构,称为索引表。 以下重点介绍三种线性索引:稠密索引、分块索引、倒排索引。

(一)稠密索引
稠密索引是指在线性索引中,将数据集中的每个记录对应一个索引项。
稠密索引要应对的可能是成千上万的数据,因此对于稠密索引这个索引表来说,索引项一定是按照关键码有序的排列。

(二)分块索引
例子:图书馆藏书。
分块有序,是把数据集的记录分成了若干块,将每块对应一个索引项,并且这些块需要满足:
(1)块内无序,即每一块内的记录不要求有序。当然,你如果能够让块内有序对查找来说更理想,不过这就要付出大量时间和空间代价,因此通常我们不要求快内有序。
(2)块间有序,例如,要求第二块所有记录的关键字均要大于第一块中所有记录的关键字,第三块所有记录的关键字均要大于第二块的所有记录关键字……因为只有块间有序,才有可能在查找时带来效率。
分块索引的索引项结构分为三个数据项:
(1)最大关键码,存储每一块中的最大关键字;
(2)存储了块中的记录个数,以便循环时用;
(3)用于指向块首数据元素的指针,便于开始对这一块中记录进行遍历。
分块索引

(三)倒排索引
网页搜索一般用的就是倒排索引。
倒排索引的通用结构是:

  • 次关键码(如“英文单词”)
  • 记录号表(如“文章编号”)

记录号表存储具有相同次关键字的所有记录的记录号(可以是指向记录的指针或者是该记录的主关键字)
倒排索引

四、二叉排序树

二叉排序树又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结构的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结构的值;
  • 它的左、右子树也分别为二叉排序树。
    按中序遍历它是棵有序树。

五、平衡二叉树(AVL树)

平衡二叉树,是一种二叉排序树,其中每一个结点的左子树和右子树的高度差至多等于1。
平衡二叉树

六、多路查找树(B树)

多路查找树,其每一个结点的孩子书可以多于两个,且每一个结点处可以存储多个元素。

(一)2-3树
2-3树是一棵多路查找树:其中的每一个结点都具有两个孩子(称为2结点)或三个孩子(称为3结点)。
一个2结点包含一个元素和两个孩子(或没有孩子)。
一个3结点包含一小一大两个元素和三个孩子(或没有孩子)。
2-3树

(二)2-3-4树
2-3-4树是2-3树的扩展,包括了4个结点的使用。一个结点包含小中大三个元素和四个孩子(或没有孩子)。

(三)B树
B树是一种平衡的多路查找树,2-3树和2-3-4树都是B树的特例。结点最大的孩子数目称为B树的阶,因此,2-3树是3阶的B树,2-3-4树是4阶的B树。

(四)B+树

七、散列表查找(哈希表)概述

散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。查找时,根据这个确定的对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。
我们把上述的对应关系f称为散列函数,又称为哈希函数。采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表后哈希表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【工作经验分享】java图片转文字

前言 又到一年金九银十之际。 Java作为目前用户最多,使用范围最广的软件开发技术之一。 Java的技术体系主要由支撑Java程序运行的虚拟机,提供各开发领域接口支持的Java,Java编程语言及许多第三方Jvav框架构成。 其中,以Java的虚拟器为今天的着…

【干货】java课程实战培训

开头 消息队列 RocketMQ 是阿里巴巴集团基于高可用分布式集群技术,自主研发的云正式商用的专业消息中间件,既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性,…

【干货】mysql建表语句注释

前言 难道程序员的职业生命线是青春饭?答案是的。 35岁考虑转行,然后35岁又成了一个新人,而外国可以做到60岁,啥也不说了,可能是觉得中年大叔油腻,不及小鲜肉便宜,唉,可叹市场更新…

【干货】mysql查询重复数据sql

前言 本系列的目的是明明白白、彻彻底底的搞定日期/时间处理的几乎所有case。上篇文章铺设所有涉及到的概念解释,例如GMT、UTC、夏令时、时间戳等等,若你还没看过,不仅强烈建议而是强制建议你前往用花5分钟看一下,因为日期时间处…

【微信小程序】java最简单观察者模式

开头 对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一。因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统、内存、CPU、编程语言等多方面的基础能力,更为考验一个程序员的内功。 那到底应该怎么学习并…

【性能优化实战】java验证码识别训练

前言 今天刚好有空,跟大家聊聊如何学好算法进大厂。 前两天一个读者和我说,他坚持刷算法题2个月,薪资翻番去了他梦寐以求的大厂,期间面字节跳动还遇到了原题…其实据我所知目前国内的大厂和一些独角兽,已经越来越效仿…

吸水间最低动水位标高_体验长安逸动EV460:再也不用为电动车续驶里程焦虑了...

文| 车突突车图腾出品,未经许可,谢绝转载● ● ●人们都在期待碧水蓝天,而且越来越多的消费者也开始践行环保理念,在买车时关注起了纯电动汽车。不过遗憾的是,纯电动汽车目前还没能成为主流。一方面,是因为…

java开发工具包jdk包括哪些

害怕干不过SpringBoot?莫慌,我送你套神级pdf文档 随着 Spring Boot 使用越来越广泛,Spring Boot 已经成为 Java 程序员面试的知识点,很多同学对 Spring Boot 理解不是那么深刻,经常就会被几个连环追问就给干趴下了&am…

微信计步器怎么不计步_难以关闭的微信朋友圈广告

太难关掉了。”试图关闭朋友圈广告的小曾,在对照着腾讯视频上的一个长达6分钟的视频演示之后,通过14次操作才得以关闭。这14步操作具体如下:点击“我”—点击“设置”—点击“关于微信”—点击“微信隐私保护指引”—下拉两个屏幕的面积—点击…

java开发工具有哪些

前言 Netty 是一款基于 Java 的网络编程框架,能为应用程序管理复杂的网络编程、多线程处理以及并发。Netty 隐藏了样板和底层代码,让业务逻辑保持分离,更加易于复用。使用 Netty 可以得到一个易于使用的 API,让开发人员可以专注自…

expdp导出 schema_记录一则expdp任务异常处理案例

在XTTS迁移测试阶段,遇到执行几个expdp的导出任务,迟迟没有返回任何信息,对应日志无任何输出。环境:AIX 6.1 Oracle 10.2.0.4现象:在XTTS迁移测试阶段,遇到执行几个expdp的导出任务,迟迟没有返…

java开发工具软件排行榜

前言: 都说学历是敲门砖,是一点都没错,即使是在重技术轻学历的互联网企业,面试官对于学历越高的程序员初印象会更好,面试也会更顺利,而大部分专科学历的程序员,除非有过硬的技术,否…

java开发工程师工作内容怎么写

什么是分布式锁?在回答这个问题之前,我们先回答一下什么是锁。 普通的锁,即在单机多线程环境下,当多个线程需要访问同一个变量或代码片段时,被访问的变量或代码片段叫做临界区域,我们需要控制线程一个一个…

community 计算模块度_光模块深度:国内光模块企业快速崛起

一、核心观点二、发展追溯:技术是底蕴、创新是动力1 光通信发展:技术迭代加快,国产替代是前进的方向依据摩尔定律,光模块的小型化、低成本以及高速率是产品迭代的主要方向。2 竞争格局:市场集中度高,巨头地位稳固,国内厂商稳步崛起…

java开发工程师的自我评价

前言 京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数据读多写少的情况。 我们把订单数据存储在MySQL中,但显然只通过DB来支撑大量的查询是不…

华为魔术手机拆机图解_华为P9进水不显示维修案例

看点:iPhone X原装屏与国产屏有哪些区别?看点:换7P、8P屏幕:C11和DTP和DKH的区别狮淘:华人手机维修师专属工具集合店,不锈钢拆机片5个只需9.9元!包邮山猫潮品:手机渠道直供&#xff…

java开发工程师自我介绍文本

前言 每年金三银四,金九银十之际,想进阶梦想挑战大厂的朋友层出不穷。 梦想是要有的,万一就实现了呢?且撇开大牛们不说,每年面试之时问题也层出不穷,不得不说,每年被算法绝杀的朋友也是不在少数…

ad09只在一定范围内查找相似对象_23、面向对象编程

目录:对象的概念类与对象面向对象编程类的定义与实例化属性访问类属性与对象属性属性查找顺序与绑定方法小结视频链接一 对象的概念”面向对象“的核心是“对象”二字,而对象的精髓在于“整合“,什么意思?所有的程序都是由”数据”…

java开发工程师转行可以做什么

前言 分布式事务主要解决分布式一致性的问题。说到底就是数据的分布式操作导致仅依靠本地事务无法保证原子性。与单机版的事务不同的是,单机是把多个命令打包成一个统一处理,分布式事务是将多个机器上执行的命令打包成一个命令统一处理。 MySQL 提供了…

atlas怎么看日志_亿级的日志治理!微服务最佳方案,ELK stack从零搭建

ELK Stack 诞生背景一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理…