首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《offer来了》第四章学习笔记

单链表操作 查找 插入 ? 删除 ? 单链表结构 ? ? 插入 ? 删除 ? ? 查询 ? 3.2.双向链表 每个数据节点中都有两个指针,分别指向其直接后继和直接前驱节点。 ? 结构 ? ?...4.1.计算散列算法 ◎ 直接定址法:取关键字或关键字的某个线性函数值为散列地址,即 h(key)= key 或h(key)=a×key+b,其中 a 和 b 为常数。...5.1.插入 (1)将待插入的新节点与当前节点进行比较,如果两个节点的值相同,则表示新节点已经存在于二叉排序树中,直接返回 false。...,直到图中所有已被访问的顶点的邻接点都被访问;若此时图中尚有顶点未被访问,则另选图中未曾被访问的一个顶点作为起始点重复上述过程,直至图中所有顶点均被访问。...深度优先遍历 假设从图中的某个顶点 V 出发,在访问 V 节点后依次从 V 未被访问的邻接点出发以深度优先的原则遍历图,直到图中所有和 V 节点路径连通的顶点都被访问;若此时图中尚有顶点未被访问,则另选一个未曾访问的顶点作为起始点重复上述过程

96840

图文并茂说MySQL索引——入门进阶必备

在这里,我会带大家来看看记录的插入是如何变化的,记录原理是什么。...目录项记录只有主键值和页的编号两个列,而普通的用户记录的列是用户自己定义的,可能包含很多列,另外还有InnoDB自己添加的隐藏列。 那innodb怎么查询呢? 以查找主键为8的记录为例。...从图中可以看出,我们插入了一条主键值为320的用户记录之后需要两个新的数据页: 为存储该用户记录而新生成了页31。...在上图中,如果插入c2 = NULL的记录,那么该B+树叶子节点中,将会在c2 = 2记录的左边,因为MySQL认为NULL值是最小的。...---- 5.联合索引   我们也可以同时以多个列的大小作为排序规则,也就是同时为多个列建立索引,比如说我们想让B+树按照c2和c3列的大小进行排序,那么 先把各个记录和页按照c2列进行排序。

29210
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    数据结构面试题以及答案整理

    二、解释一下顺序存储与链式存储 顺序存储结构是用一段连续的存储空间来存储数据元素,可以进行随机访问,访问效率较高。链式存储结构是用任意的存储空间来存储数据元素,不可以进行随机访问,访问效率较低。...五、数组和链表的区别? 从逻辑结构来看:数组的存储长度是固定的,它不能适应数据动态增减的情况。链表能够动态分配存储空间以适应数据动态增减的情况,并且易于进行插入和删除操作。...广度优先搜索:(1)访问起始点v0(2)依次遍历v0的所有未访问过得邻接点 (3)再依次访问下一层中未被访问过得邻接点;重复以上步骤,直到所有的顶点都被访问过为止 十四、介绍一下拓扑排序以及是如何实现的...哈希表又称为散列表,是根据关键字码的值直接进行访问的数据结构,即它通过把关键码的值映射到表中的一个位置以加快查找速度,其中映射函数叫做散列函数,存放记录的数组叫做散列表。...哈希函数的构造方法包括:直接定址法,除留余数法,数字分析法,平方取中法,折叠法,随机数法 (1)直接定址法:取关键字的某个线性函数值作为散列地址,H(key)=a*key+b。

    1.3K30

    《大话数据结构》总结第一章 绪论第二章 算法第三章 线性表第四章 栈和队列第五章 字符串第六章 树第七章 图第八章 查找第九章 排序

    其实线索二叉树,等于是把一棵二叉树转变成了一个双向链表,这样对我们的插入删除结点、查找某个结点都带来了方便。所以我们对二叉树以某种次序遍历使其变为线索二叉树的过程称做是线索化。...处理三列冲突的方法: 开放定址法:所谓的开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。...直接插入排序:基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。...希尔排序(相当于直接插入法的升级)::将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。逐渐缩小这个“增量”。...这也就是我们为什么对快速排序优化时,增加了一个阀值,低于阀值时换作直接插入排序的原因。 因此对于数据量不是很大而记录的关键字信息量较大的排序要求,简单排序算法是占优的。

    1.4K51

    【肝帝一周总结:全网最全最细】☀️Mysql 索引数据结构详解与索引优化☀️《❤️记得收藏❤️》

    B 树索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取数据。下图就是一颗简单的 B 树。 在 B 树中,内部(非叶子)节点可以拥有可变数量的子节点(数量范围预先定义好)。...修改 key 与子树的判断逻辑,使子树大于等于上一 key 小于下一 key,最终所有访问都将落于叶子节点;叶子节点中直接存储数据行或数据行的位置。...同样在 Data Structure Visualizations 中选择 B+ TreesB + 树进行插入操作可以直观的看到插入过程 在动图中可以看出,B + 树的每一个叶子节点都有一个指针指向下一个节点...Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。...2、in 自动优化顺序 不需要考虑 =、in 等的顺序,mysql 会自动优化这些条件的顺序,以匹配尽可能多的索引列。

    82210

    数据结构-概述

    4.3.2 线索二叉树 线索二叉树的实质是对一个非线性结构进行线性化操作,使在这个访问序列中每一个结点都有一个直接前驱和直接后继。 引入线索二叉树的目的是加快查找结点前驱和后继的速度。...,(i,j,aij)表示在图中的i行j列的元素aij 二叉链表:用于存储二叉树的链表。...当以邻接表表示时,查找所有顶点的邻接点所需时间为O(|E|),访问顶点所需时间为O(|V|),总的时间复杂度为O(|V|+|E|) 基于邻接表的深度优先搜索树是不唯一的。...散列表:根据关键字而直接进行访问的数据结构。即散列表建立了关键字和存储地址之间的一种直接映射关系。...理想情况的时间复杂度为O(1) 6.4.2 散列函数的构造方法 直接定址法:直接取关键字的某个线性函数值作为散列地址。

    1.6K10

    24张图彻底弄懂九大常见数据结构!

    由于是通过指针进行下一个数据元素的查找和访问,使得链表的自由度更高。 这表现在对节点进行增加和删除时,只需要对上一节点的指针地址进行修改,而无需变动其它的节点。...8 散列表 散列表也叫哈希表,是一种通过键值对直接访问数据的机构。在初中,我们就学过一种能够将一个x值通过一个函数获得对应的一个y值的操作,叫做映射。...散列表的实现原理正是映射的原理,通过设定的一个关键字和一个映射函数,就可以直接获得访问数据的地址,实现O(1)的数据访问效率。...一般常用的有以下几种散列函数: 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。 数字分析法:通过对数据的分析,发现数据中冲突较少的部分,并构造散列地址。...这是因为:计算平方之后的中间几位和关键字中的每一位都相关,所以不同的关键字会以较高的概率产生不同的散列地址。

    63.1K1717

    一文带你深入理解Mysql索引底层数据结构与算法

    理解索引的特性 索引是帮助Mysql高效获取数据排好序的数据结构 索引是存储在文件里面的 索引的各种存储结构及优缺点 首先看一下,在数据库没有加索引的情况下,SQL中的where语句是如何查找目标记录的...如果不手动指定主键,InnoDB会从插入的数据中找出不重复的一列作为主键索引,如果没找到不重复的一列,这时候InnoDB会选择内置的ROWID作为主键,写入顺序和ROWID增长顺序一致;其次,索引的数据类型是整型...最后,B+树本质是多路多叉树,如果主键索引不是自增的,那么后续插入的索引就会引起B+树的其他节点的分裂和重新平衡,影响数据插入的效率,如果是自增主键,只用在尾节点做增加就可以。...mysql会优先以联合索引的第一列开始匹配,此后才会匹配下一列,如果不指定第一列匹配的值,那么也就无法知道下一步要查询那个节点(可以联想B+树的数据结构,第一列匹配到值后,会进行一次数据结构的排序筛选,...得出排好序的数据结构,在进行匹配下一列,得出最终结果,那么如果直接跳过第一列,匹配第二列,b+树会无法找到排好序的数据结构结果,就会进行全表扫描) 另外一种情况,如果遇到 ">"、"<"、"between

    70610

    Java常见的8种数据结构「建议收藏」

    优先级对列 栈按照“后进先出”、“先进后出”的原则来存储数据,先插入的数据被压入栈底,后插入的数据在栈顶,读出数据的时候,从栈顶开始依次读出 ;实现方式数组或者链表 对列 先进先出 队列会对两端进行定义...队头只允许删除操作(出队),队尾只允许插入操作(入队)实现方式数组或者链表 优先级对列 按照关键字值进行排序 插入到对应的位置;eg:在线程对列中 优先级高的优先处理 链表 链表是一种递归的数据结构,它或者为空...平衡二叉树(avl树)的难点在于,当删除或者增加节点的情况下,如何通过左旋或者右旋的方式来保持左右平衡。...当不能执行第一条的时候 如果栈不空,从栈中弹出一个顶点 重复执行1 2 如果不能执行则结束 广度优先搜素(BFS):访问起始点的所有邻接点,然后在访问较远的区域,用队列实现 访问下一个未访问的邻接点...,这个订点必须是当前顶点的邻接点,标记他,并插入队列中 如果1执行完事,则从队列中取一个顶点做为当前顶点,重复执行1 2 队列为空 不能执行2 则结束 无环有向图 的拓扑排序 将有向图中的顶点以线性方式进行排序

    79530

    《大话数据结构》(二)

    一个是存储顶点的信息;另一个是存储边的信息,这个边数组每个数据元素由一条边的起点下标、终点下标和权组成 C.图的遍历 1.图的遍历和树的遍历类似,从图中某一顶点出发访遍图中其余观点,且使每一个顶点仅被访问一次...从图中的某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径想通的顶点都被访问到。...若图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起始点,重复上述过程,直至图中所有访问点都被访问到为止。...random(key) J.处理散列冲突的方法 1.开放定址法:就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。...分割成若干个子序列,在这些子序列内分别进行直接插入排序,当整个序列基本有序时,注意只是基本有序时,再对全体记录进行一次直接插入排序 2.所谓基本有序,就是小的关键字基本在前面,大的基本在后面,不大不小的基本在中间

    1K31

    数据结构考研面试被问的问题_考研程序设计与数据结构

    链式存储结构 ——把数据元素存放在任意的存储单元中,这组存储单元可以是连续的,也可以是不连续的。通过指针来找到下一个数据元素的地址。...1 数组和链表的区别 数组 链表 事先定义长度,不能适应数据动态地增减 动态地进行存储分配,可以适应数据动态地增减 从栈中分配空间 从堆中分配空间 快速访问数据元素,插入删除不方便 查找访问数据不方便...每一个节点包括两个部分,一个用来存储数据,一个存储下一个元素的地址。 判断整个链表是否有环,如何找到这个环 提问:给定一个单链表,只给出头指针h: 1.如果判断是否存在环? 2.如何知道环的长度?...,进行深度遍历;重复以上步骤直到所有节点都被访问过为止 广度优先算法 类似于层次遍历 步骤: (1)访问起始点v (2)依次遍历v的所有未访问过得邻接点 (3)再依次访问下一层中未被访问过得邻接点;...、折半插入、冒泡排序、简单选择、堆排序、归并排序 稳定排序算法 直接插入排序,冒泡排序和归并排序。

    64910

    【C++】哈希表 --- 闭散列版本的实现

    1 C++中的哈希表 哈希表(Hash Table)是一种数据结构,它通过哈希函数将键映射到表中的一个位置来访问记录,支持快速的插入和查找操作。 哈希表的概念最早可以追溯到1953年,由H. P....发生哈希冲突该如何处理呢?...那如何寻找下一个空位置呢? 进行线性探测:从发生冲突的位置开始,依次向后探测,直到寻找到下一个空位置为止。...比如上图中的场景,现在需要插入元素44,先通过哈希函数计算哈希地址,hashAddr为4,因此44理论上应该插在该位置,但是该位置已经放了值为4的元素,即发生哈希冲突。...插入:通过哈希函数获取待插入元素在哈希表中的位置如果该位置中没有元素则直接插入新元素,如果该位置中有元素发生哈希冲突,使用线性探测找到下一个空位置,插入新元素 删除:采用闭散列处理哈希冲突时,不能随便物理删除哈希表中已有的元素

    10510

    「中高级前端」窥探数据结构的世界- ES6版

    在服务器上,像 Express这样的 Web框架也以类似的方式构建其中间件逻辑。当请求被接收时,它从一个中间件管道输送到下一个,直到响应被发出。...我们生活中如何使用散列的一些例子包括: 在大学中,每个学生都会被分配一个唯一的卷号,可用于检索有关它们的信息。...要存储键/值对,您可以使用一个简单的数组,如数据结构,其中键(整数)可以直接用作存储值的索引。 但是,如果密钥很大并且无法直接用作索引,此时就应该使用散列。...通过使用该键,您可以在 O(1)时间内访问该元素。 使用密钥,算法(散列函数)计算一个索引,可以找到或插入条目的位置。 具体执行分两步: 通过使用散列函数将元素转换为整数。...这里,访问特定字符串需要 O(n)时间(其中n是字符串数)。 这表明该哈希函数不是一个好的哈希函数。 如何优化这个哈希函数?

    93030

    Java数据结构和算法(十五)——无权无向图

    1、图的定义   我们知道,前面讨论的数据结构都有一个框架,而这个框架是由相应的算法实现的,比如二叉树搜索树,左子树上所有结点的值均小于它的根结点的值,右子树所有结点的值均大于它的根节点的值,类似这种形状使得它容易搜索数据和插入数据...这里以邻接矩阵为例,找到顶点所在的行,从第一列开始向后寻找值为1的列;列号是邻接顶点的号码,检查这个顶点是否未访问过,如果是这样,那么这就是要访问的下一个顶点,如果该行没有顶点既等于1(邻接)且又是未访问的...规则1:访问下一个未访问的邻接点(如果存在),这个顶点必须是当前顶点的邻接点,标记它,并把它插入到队列中。   ...对于上面的图,应用广度优先搜索:以A为起始点,首先访问所有与 A 相邻的顶点,并在访问的同时将其插入队列中,现在已经访问了 A,B,C,D和E。...搜索算法以一种系统的方式访问图中的每个顶点,主要通过深度优先搜索(DFS)和广度优先搜索(BFS),深度优先搜索通过栈来实现,广度优先搜索通过队列来实现。

    1.8K50

    MySQL中InnoDB及索引深入剖析

    下一条记录指得并不是按照我们插入顺序的下一条记录,而是按照主键值由小到大的顺序的下一条记录。...从图中可以看出来,index_demo表中的3条记录都被插入到了编号为10的数据页中了。...birthday, phone_number LIMIT 10; 因为这个B+树索引本身就是按照上述规则排好序的,所以直接从索引中提取数据,然后进行回表操作取出该索引中不包含的列就好了。...而获取到的记录的id字段的值可能并不相连,而在聚簇索引中记录是根据id(也就是主键)的顺序排列的,所以根据这些并不连续的id值到聚簇索引中访问完整的用户记录可能分布在不同的数据页中,这样读取完整的用户记录可能要访问更多的数据页...而记录又是存储在数据页中的,数据页和记录又是按照记录主键值从小到大的顺序进行排序,所以如果我们插入的记录的主键值是依次增大的话,那我们每插满一个数据页就换到下一个数据页继续插。

    73610

    「中高级前端」窥探数据结构的世界- ES6版

    在服务器上,像 Express这样的 Web框架也以类似的方式构建其中间件逻辑。当请求被接收时,它从一个中间件管道输送到下一个,直到响应被发出。...我们生活中如何使用散列的一些例子包括: 在大学中,每个学生都会被分配一个唯一的卷号,可用于检索有关它们的信息。...要存储键/值对,您可以使用一个简单的数组,如数据结构,其中键(整数)可以直接用作存储值的索引。 但是,如果密钥很大并且无法直接用作索引,此时就应该使用散列。...通过使用该键,您可以在 O(1)时间内访问该元素。 使用密钥,算法(散列函数)计算一个索引,可以找到或插入条目的位置。 具体执行分两步: 通过使用散列函数将元素转换为整数。...这里,访问特定字符串需要 O(n)时间(其中n是字符串数)。 这表明该哈希函数不是一个好的哈希函数。 如何优化这个哈希函数?

    1.2K20

    窥探数据结构的世界

    在服务器上,像 Express这样的 Web框架也以类似的方式构建其中间件逻辑。当请求被接收时,它从一个中间件管道输送到下一个,直到响应被发出。...我们生活中如何使用散列的一些例子包括: 在大学中,每个学生都会被分配一个唯一的卷号,可用于检索有关它们的信息。...要存储键/值对,您可以使用一个简单的数组,如数据结构,其中键(整数)可以直接用作存储值的索引。 但是,如果密钥很大并且无法直接用作索引,此时就应该使用散列。...通过使用该键,您可以在 O(1)时间内访问该元素。 使用密钥,算法(散列函数)计算一个索引,可以找到或插入条目的位置。 具体执行分两步: 通过使用散列函数将元素转换为整数。...这里,访问特定字符串需要 O(n)时间(其中n是字符串数)。 这表明该哈希函数不是一个好的哈希函数。 如何优化这个哈希函数?

    79230

    「中高级前端」窥探数据结构的世界- ES6版

    在服务器上,像 Express这样的 Web框架也以类似的方式构建其中间件逻辑。当请求被接收时,它从一个中间件管道输送到下一个,直到响应被发出。...我们生活中如何使用散列的一些例子包括: 在大学中,每个学生都会被分配一个唯一的卷号,可用于检索有关它们的信息。...要存储键/值对,您可以使用一个简单的数组,如数据结构,其中键(整数)可以直接用作存储值的索引。 但是,如果密钥很大并且无法直接用作索引,此时就应该使用散列。...通过使用该键,您可以在 O(1)时间内访问该元素。 使用密钥,算法(散列函数)计算一个索引,可以找到或插入条目的位置。 具体执行分两步: 通过使用散列函数将元素转换为整数。...这里,访问特定字符串需要 O(n)时间(其中n是字符串数)。 这表明该哈希函数不是一个好的哈希函数。 如何优化这个哈希函数?

    86030

    Java阿里面试题

    二叉平衡树:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 AVL树的插入和删除,主要是依靠左旋和右旋来达到平衡状态。...红黑树的插入,插入节点是红色,通过一系列选择和着色使其成为红黑树。 步骤为: 插入节点的父亲节点是黑色,直接插入。...所以红黑树的插入需要最多两次旋转,删除需要最多三次旋转 具体请查看 红黑树 (11)TCP如何保证可靠传输?三次握手过程? TCP用三次握手和滑动窗口机制来保证传输的可靠性和进行流量控制。...A收到B发过来的ACK消息,并且知道B将窗口大小调整为1,因此他只发送了一个单位的数据并且等待B的下一个确认报文。 5. 如此反复。 (14)Linux下如何进行进程调度的?...为了满足第三范式,应去掉"顾客姓名"列,放入客户表中。 (20)数据库中的索引的结构?什么情况下适合建索引? mysql索引结构是B+树和hash。

    1.2K10

    第06章_索引的数据结构

    ,如图所示: ​ 从图中可以看出来, index_demo 表中的 3 条记录都被插入到了编号为 10 的数据页中了。...# ② 迭代 2 次:多个目录项纪录的页 从图中可以看出,我们插入了一条主键值为 320 的用户记录之后需要两个新的数据页: 为存储该用户记录而新生成了 页 31 。...④ MyISAM 的回表操作是十分 快速 的,因为是拿着地址偏移量直接到文件中取数据的,反观 InnoDB 是通 过获取主键之后再去聚簇索引里找记录,虽然说也不慢,但还是比不上直接用地址去访问。...然后我们来看下如何用 B 树进行查找。...思考题:为了减少 IO,索引树会一次性加载吗? 思考题:B + 树的存储能力如何?

    20420
    领券