算法基础
文章平均质量分 57
最常见的算法基础面试题,带你三分钟搞懂,面试再也不虚。
喵呜刷题
来来来,我们一起组队学习!
展开
-
MySQL聚簇索引与非聚簇索引
InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。MyISM使用的是非聚簇索引,非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。聚簇索引存储来说,行数据和主键B+树存储在一起,辅助键B+树只存储辅助键和主键,主键和非主键B+树几乎是两种类型的树。原创 2023-09-06 08:47:16 · 636 阅读 · 0 评论 -
B-Tree 索引和 Hash 索引的对比
有时,即使有索引可以使用,MySQL 也不使用任何索引。但是,如果这样的一个查询使用了 LIMIT 来检索只是少量的记录时,MySql 还是会使用索引,因为它能够更快地找到这点记录并将其返回。Hash 索引只能够用于使用 = 或者 <=> 运算符的相等比较(但是速度更快)。B-tree 索引可以用于使用 =, >, >=, <, <= 或者 BETWEEN 运算符的列比较。如果 LIKE 的参数是一个没有以通配符起始的常量字符串的话也可以使用这种索引。这种类型的索引不能够用于按照顺序查找下一个条目。原创 2023-09-06 08:46:48 · 716 阅读 · 0 评论 -
说说BTree和B+Tree
而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。InnoDB存储引擎中页的大小为16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K个键值(因为是估值,为方便计算,这里的K取值为〖10〗^3)。原创 2023-09-06 08:46:25 · 152 阅读 · 0 评论 -
Java版斐波那契查找
* 斐波那契查找(黄金分割原理) * 黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是0.618。原创 2022-05-06 10:25:38 · 195 阅读 · 0 评论 -
Java版插值查找
* 插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。原创 2022-05-06 10:24:40 · 124 阅读 · 0 评论 -
Java版二分查找(折半查找)
* 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。 * 但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。原创 2022-05-06 10:24:06 · 459 阅读 · 0 评论 -
Java版顺序查找
* 线性查找又称顺序查找,是一种最简单的查找方法,它的基本思想是从第一个记录开始, * 逐个比较记录的关键字,直到和给定的K值相等,则查找成功;若比较结果与文件中n个记录的关键字都不等,则查找失败原创 2022-05-06 10:23:26 · 143 阅读 · 0 评论 -
说说什么是跳表?
跳表全称为跳跃列表,它允许快速查询,插入和删除一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表,且每一层链表中的元素是前一层链表元素的子集(见下面的示意图)。一开始时,算法在最稀疏的层次进行搜索,直至需要查找的元素在该层两个相邻的元素中间。这时,算法将跳转到下一个层次,重复刚才的搜索,直到找到需要查找的元素为止。原创 2022-05-05 10:45:16 · 508 阅读 · 0 评论 -
红黑树自平衡策略
自平衡策略对于一棵红黑树的操作最基本的无外乎增删改查,其中查和改都不会改变树的结构,所以与普通平衡二叉树操作无异。剩下的就是增删操作,插入和删除都会破坏树的结构,不过借助一定的平衡策略能够让树重新满足定义。平衡策略可以简单概括为三种: 左旋转 、 右旋转 ,以及 变色 。在插入或删除结点之后,只要我们沿着结点到根的路径上执行这三种操作,就可以最终让树重新满足定义。原创 2022-05-05 10:44:37 · 1526 阅读 · 1 评论 -
缓存淘汰算法--LRU算法
LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。详细算法实现如下:原创 2022-05-05 10:44:00 · 2022 阅读 · 0 评论 -
LRU和LFU的区别
LRU和LFU都是内存管理的页面置换算法。LRU,即:最近最少使用淘汰算法(Least Recently Used)。LRU是淘汰最长时间没有被使用的页面。LRU关键是看数据最后一次被使用到发生替换的时间长短,时间越长,数据就会被置换;原创 2022-05-05 10:42:44 · 8382 阅读 · 0 评论 -
Java的循环队列(环形缓冲、RingBuffer)
RingBuffer好处线程安全,可以边写边读。创建一个循环队列(环形缓冲、RingBuffer),实际元素存在一个数组中,操作数组的指针,不移动元素。原创 2022-05-05 10:42:10 · 1728 阅读 · 0 评论 -
最大堆_最小堆
堆树的定义是:n个元素的序列{k1,k2,…,kn},当且仅当满足如下关系时被成为堆树:堆树是一颗完全二叉树;堆树中某个节点的值总是不大于或不小于其孩子节点的值;堆树中每个节点的子树都是堆树。原创 2022-05-05 10:41:30 · 257 阅读 · 0 评论 -
二叉树遍历
二叉树是一种非常重要的数据结构,非常多其他数据结构都是基于二叉树的基础演变而来的。对于二叉树,有深度遍历和广度遍历,深度遍历有前序、中序以及后序三种遍历方法,广度遍历即我们寻常所说的层次遍历。原创 2022-05-05 10:40:18 · 78 阅读 · 0 评论 -
Java版常用查找算法复杂度
平均时间复杂度最差查找时间查找前提前提时间复杂度插入新值时间原创 2022-05-05 10:22:30 · 337 阅读 · 0 评论 -
Java版基数排序
* 实现基数排序 LSD-从最低位开始排 MSD-从最高位开始排 * 取得数组中的最大数,并取得位数; * ARR为原始数组,从最低位开始取每个位组成基数数组; * 对基数进行计数排序(利用计数排序适用于小范围数的特点);原创 2022-05-05 10:21:56 · 125 阅读 · 0 评论 -
Java版桶排序
* 设置一个定量的数组当作空桶; * 遍历输入数据,并且把数据一个一个放到对应的桶里去; * 对每个不是空的桶进行排序; * 从不是空的桶里把排好序的数据拼接起来。原创 2022-05-05 10:21:24 · 507 阅读 · 2 评论 -
Java版计数排序
* 找出待排序的数组中最大和最小的元素; * 统计数组中每个值为我的元素出现的次数,存入数组Ç的第我项; * 对所有的计数累加(从ç中的第一个元素开始,每一项和前一项相加); * 反向填充目标数组:将每个元素我放在新数组的第C(ⅰ)项,每放一个元素就将C(ⅰ)减去1。原创 2022-05-04 10:09:19 · 279 阅读 · 0 评论 -
Java版堆排序
* 利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。 * 将初始待排序关键字序列(R1,R2 ... .Rn)构建成大顶堆,此堆为初始的无序区; * 将堆顶元素R [1]与最后一个元素 - [R [n]的交换,此时得到新的无序区(R1,R2,...... Rn中-1)和新的有序区(RN),且满足ř并[1,2,...,N-1] <= R [原创 2022-05-04 10:08:24 · 168 阅读 · 0 评论 -
Java版快速排序
* 1、数组第一个值为【基准数】,设置【哨兵i】和【哨兵j】 * 2、【哨兵j】从左往右找一个大于【基准数】的数,【哨兵i】从右往左找一个小于【哨兵】的数,然后交换他们 * 3、【基准数】将整个序列分为两组,左边一组小于【基准数】,右边一组大于【基准数】 * 4、、使用【递归】继续设置【基准数】 * 5、循环步骤1、步骤2、步骤3、步骤4原创 2022-05-04 10:07:43 · 113 阅读 · 0 评论 -
Java版归并排序(合并排序)
* 分而治之(divide - conquer);每个递归过程涉及三个步骤 * 第一, 分解: 把待排序的 n 个元素的序列分解成两个子序列, 每个子序列包括 n/2 个元素. * 第二, 治理: 对每个子序列分别调用归并排序MergeSort, 进行递归操作 * 第三, 合并: 合并两个排好序的子序列,生成排序结果.原创 2022-05-04 10:07:01 · 1630 阅读 · 0 评论 -
Java版希尔排序
* 希尔排序 针对有序序列在插入时采用移动法。 * 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序; * 随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。原创 2022-05-04 10:06:14 · 95 阅读 · 0 评论 -
Java版插入排序
* 插入排序与打扑克时整理手上的牌非常类似原创 2022-05-04 10:05:34 · 83 阅读 · 0 评论 -
Java版选择排序
* 1)第一轮逐一扫描所有数字,并取出最小那个放在第一位; * 2)第二轮扫描剩下的数字,并取出第二小的那个数字放在第二位; * 3)以此循环反复,直到所有数字都已经排序。原创 2022-05-04 10:04:32 · 80 阅读 · 0 评论 -
Java版冒泡排序
* 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 * 针对所有的元素重复以上的步骤,除了最后一个。 * 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。原创 2022-05-04 10:03:55 · 95 阅读 · 0 评论 -
Java版常用排序算法复杂度
时间复杂度是指执行这个算法所需要的计算工作量;空间复杂度是指执行这个算法所需要的内存空间;时间和空间都是计算机资源的重要体现,而算法的复杂性就是体现在运行该算法时的计算机所需的资源多少;原创 2022-05-04 10:03:05 · 704 阅读 · 0 评论 -
说说什么是红黑树?
R-B Tree,全称是Red-Black Tree,又称为“红黑树”,红黑树就是一种平衡的二叉查找树,说他平衡的意思是他不会变成“瘸子”,左腿特别长或者右腿特别长。原创 2022-05-04 10:02:34 · 3941 阅读 · 0 评论 -
时间复杂度你真的了解吗?
时间复杂度的理解时间复杂度用来检验某个算法处理一定量的数据要花多长时间。O(x)这个表示法用一个函数来描述算法处理给定的数据需要多少次运算。重要的不是数据量,而是当数据量增加时运算如何增加。原创 2022-03-05 12:00:49 · 166 阅读 · 0 评论