【数据结构与算法】【算法思想】【算法总结】索引结构

“基础不是100分考60分,而是建摩天大楼的地基。”

为什么需要索引?

(1)在实际的软件开发工作的本质都可以抽象为“对数据的存储和计算”。对应到数据结构和算法中,那“存储”需要的就是数据结构,“计算”需要的就是算法。
(2)对于存储的需求,功能上无外乎增删改查。当存储的数据很多,性能就会成为这些系统要关注的重点,特别是在存储相关的基础系统、中间件中。
(3)“如何节省存储空间、如何提高数据增删改查的执行效率”,解决这样的问题离不开索引

索引的需求定义

对于系统设计需求,一般可以从功能性需求和非功能性需求两方面来分析

1. 功能性需求

(1)数据是格式化数据还是非格式化数据?
构建索引的原始数据,可分为两类:

  • 一类是结构化数据,如MySQL 中的数据;
  • 一类是非结构化数据,如搜索引擎中网页。非结构化数据,一般需要预处理,提取出查询关键词,对关键词构建索引。

(2)数据是静态数据还是动态数据?

  • 如果是一组静态数据,在构建索引时只需考虑查询效率
  • 动态数据构建索引,不仅要考虑索引的查询效率,在原始数据更新的同时,还需要动态地更新索引

(3)索引存储在内存还是硬盘?

  • 当数据量小时,索引可以存储在内存中。
  • 原始数据量很大时,对应的索引可能也会很大。内存有限,可能需要将索引存储在磁盘中。
  • 第三种情况:一部分存储在内存,一部分存储在磁盘,这样可以兼顾内存消耗和查询效率。

(4)单值查找还是区间查找?

  • 所谓单值查找,也就是根据查询关键词等于某个值的数据。
  • 所谓区间查找,就是查找关键词处于某个区间值的所有数据。不同的应用场景,查询的需求会多种多样。

(5)单关键词查找还是多关键词组合查找?

  • 对于单关键词的查找,索引构建起来相对简单。
  • 多关键词查询要分多种情况:
    A:像 MySQL 这种结构化数据的查询,可以实现针对多个关键词的组合,建立索引;
    B:像搜索引擎这样的非结构数据的查询,可以针对单个关键词构建索引,然后通过集合操作,如求并集、求交集等,计算出多个关键词组合的查询结果。
    不同的场景,不同的原始数据,对于索引的需求也会千差万别

2. 非功能性需求

(1)不管是存储在内存中还是磁盘中,索引对存储空间的消耗不能过大

  • 如果存储在内存中,索引对占用存储空间的限制就会非常苛刻
  • 如果存储在硬盘中,也不能掉以轻心,因为有时索引对存储空间的消耗会超过原始数据

(2)在考虑索引查询效率的同时,还要考虑索引的维护成本

  • 基于动态数据集合构建的索引要考虑索引的维护成本。因为在原始数据动态增删改的同时,也需要动态的更新索引。而索引的更新势必会影响到增删改操作的性能。

构建索引常用的数据结构有哪些?

如散列表、红黑树、跳表、B+ 树,除此之外,位图、布隆过滤器可以作为辅助索引,有序数组可以用来对静态数据构建索引

  • 散列表增删改查操作的时间复杂度是 O(1),被一些键值数据库用来构建索引,如 Redis、Memcache。这类索引,一般都构建在内存中。

  • 红黑树是常用的平衡二叉查找树,数据插入、删除、查找的时间复杂度是 O(logn),也非常适合用来构建内存索引。Ext 文件系统中,对磁盘块的索引,用的就是红黑树。

  • B+ 树比起红黑树更加适合构建存储在磁盘中的索引
    (1)B+ 树是一个多叉树,对相同个数的数据构建索引,B+ 树的高度要低于红黑树。
    (2)当借助索引查询数据时,读取 B+ 树索引需要的磁盘 IO 次数会更少。
    所以,如 MySQL、Oracle等,大部分关系型数据库的索引都是用 B+ 树来实现的

  • 跳表也支持快速添加、删除、查找数据,通过调整索引结点个数和数据个数之间的比例,可以很好地平衡索引对内存的消耗及其查询效率。Redis 中的有序集合,就是用跳表来构建的

  • 布隆过滤器有一定的判错率,但可以规避它的短处,发挥它的长处
    (1)尽管对于判定存在的数据可能并不存在,但是对于判定不存在的数据是一定不存在
    (2)布隆过滤器有个大特点:内存占用非常少,所以可以针对数据,构建一个布隆过滤器存储在内存中。
    (3)查询数据时,如果布隆过滤器判定数据不存在,就不必读取磁盘中的索引了。对于数据不存在的情况,数据查询就更加快速了。

  • 有序数组也可以被作为索引,如果数据是静态的只有查询操作,可以把数据的关键词(查询用的)抽取出来,组织成有序数组,然后利用二分查找算法来快速查找数据。

笔记整理来源: 王争 数据结构与算法之美

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

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

相关文章

【Breadth-first Search 】279. Perfect Squares

输入:一个非负整数n。 输出:这个非负整数可以写成几个完全平方数。返回这个数量。 规则:完全平方数可以表示为某个整数的平方。例如:1,4,9… 分析:1349 也就是说13可以写成2个完全平方数的和。我…

vs设置html的模板快

打开vs编辑器,点击文件--》首选项--》用户代码片段 之后选择先对应的编辑器模板 进入里面编写相对应的代码块 之后直接在编辑器中调用。 转载于:https://www.cnblogs.com/zengsf/p/10929653.html

【数据结构与算法】【算法思想】【算法应用】【排序查找搜索】并行

算法的目的就是为了提高代码执行的效率。当算法无法再继续优化的情况下,需要借助并行计算的处理思想对算法进行改造。 并行排序 假设要给大小为 8GB 的数据进行排序,最常用的是三种排序算法,归并排序、快速排序、堆排序,时间复杂…

第二十一期:干货盘点!推荐程序员使用的5款工具软件

说到程序员,大多数人脑袋里显现出来的第一个画面应当就是一个面容冷漠的人指尖在键盘上快速飞跃敲出一行行看不懂的字符就能轻而易举入侵别人的系统。然而想象很丰满,现实是很骨感的,大多数程序员都只是一个简单的码农。 作者:四…

207. Course Schedule

输入:课程数量n,每个课程的编号是0到n-1。课程学习的先后顺序用数组输入,例如[0,1]。要学习课程0,需要先学习课程1。 输出:如果可以学习完所有的课程,返回true,否则返回false。 分析&#xff1a…

第二十二期:New一个对象的时候发生了什么?

如你所知,Java是一门面向对象的编程语言。我们平常在写代码的时候也是在不停的操作各种对象,那么当你在写出User user new User();这样一行代码的时候,JVM都做了些什么呢? 作者:湖人总冠军 一、引言 如你所知&#…

Docker 第四章 访问容器

访问仓库 仓库(Repository)是集中存放镜像的地方。 一个容易混淆的概念是注册服务器(Registry)。实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面…

【数据结构与算法】【算法思想】Dijkstra算法

图的两种搜索算法,深度优先搜素和广度优先搜索。这两种算法主要是针对无权图的搜索算法。针对有权图,也就是图中的每条边都有一个权重,该如何计算两点之间的最短路径?最短路径算法(Shortest Path Algorithm&#xff09…

第二十三期:程序员节Keep被曝突然裁员300多人,60%是开发和运营

社交健身App “Keep”突然裁员超300人,而且是在1024程序员节。此次被裁的人员中,大约有60%的人是开发和运营,补偿方案为N1。 作者:三言财经 10月24日脉脉有多条消息称,社交健身App “Keep”突然裁员超300人&#xff0…

542. 01 Matrix

输入:元素值为0或者1的矩阵。 输出: 每个元素距离0的最近距离是多少。 规则:相邻单元格的距离是1,相邻是指上下左右4个方向。 分析:这类似于学习课程安排,可以从元素值为0的单元开始沿4个方向遍历。matrix[…

C++学习第二天(打卡)

C new 可以很方便的 分配一段内存。 比如 int *test new int ;int n;cin>>n;int * test new int [n]; 可以实现动态分配内存,比c的malloc 简洁多了, 同样也能new 一个 结构体。总之挺方便的。 new 之后 不用了 要用delet free 内存 另外对空指…

【数据结构与算法】【算法思想】 A *搜索算法

算法解析 这是一个非常典型的搜索问题。人物的起点就是他当下所在的位置,终点就是鼠标点击的位置。我们需要在地图中,找一条从起点到终点的路径。这条路径要绕过地图中所有障碍物,并且看起来要是一种非常聪明的走法。所谓“聪明”&#xff0…

第二十四期:管理 | 成功领导远程IT团队的7个技巧

管理虚拟工作环境需要各种真实世界的技能和工具。以下是激发创造力和生产力的策略。为了在日益缺乏人才和竞争激烈的IT世界中取得成功,越来越多的企业开始依赖于地理上分散的劳动力。 作者:John Edwards 管理虚拟工作环境需要各种真实世界的技能和工具…

310. Minimum Height Trees

输入:包含n个节点的无向图。n:表示从0到n-1,n个节点。edges:int数组,是从一个节点到另外一个节点。但是没有方向。 输出:以哪些节点为根节点,具有最小高度的树,返回这些根节点。 规则…

计算获取最小值和最大值

比如,在下面的销售业绩中,统计业务员的销售业绩中最大值和最小值。 下面是业务数据: CREATE TABLE [dbo].[SalesPerformance]([ID] [int] IDENTITY(1,1) NOT NULL,[Salesman] NVARCHAR(30) NOT NULL,[OrderDate] [DATE] NULL,[Sell] DECIM…

第二十五期:知乎用Go替代Python,说明了啥

众所周知,知乎早在几年前就将推荐系统从 Python 转为了 Go。于是乎,一部分人就说 Go 比 Python 好,Go 和 Python 两大社区的相关开发人员为此也争论过不少,似乎,谁也没完全说服谁。 作者:hello架构 大概每…

[Leetcode][第106题][JAVA][ 从中序与后序遍历序列构造二叉树][分治][递归]

【问题描述】[中等] 【解答思路】 public class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {int inLen inorder.length;int postLen postorder.length;// 特判if (inLen ! postLen) {throw new RuntimeException("输入错误");}return …

Springboot初次学习

-- 介绍取自springboot中文文档 :https://www.breakyizhan.com/springboot/3032.html Spring Boot可以轻松创建可以运行的独立的,生产级的基于Spring的应用程序。我们对Spring平台和第三方库采取自己的看法,以便您尽可能轻松地使用本教程。大…

第二十六期:英国建设下一代IOT基础设施的历史机遇和挑战

无论未来物联网发展的中心在哪里,都会带来一笔巨大的财富。但许多地区面临的真正障碍是缺乏可用的光纤基础设施来形成回程网络。接下来看一看全光纤在英国的推广情况。 作者:风车云马编译 世界各地的市政当局都在呼吁制定支持5G的基础设施计划。这些基…

[Leetcode][第889题][JAVA][根据前序和后序遍历构造二叉树][分治][递归]

【问题描述】[中等] 【解答思路】 copyOfRange class Solution {public TreeNode constructFromPrePost(int[] pre, int[] post) {if(prenull || pre.length0) {return null;}return dfs(pre,post);}private TreeNode dfs(int[] pre,int[] post) {if(prenull || pre.length0)…