![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 92
数据结构与算法
吃我一矛
这个作者很懒,什么都没留下…
展开
-
数据结构与算法-20-散列表(下)
我们已经学习了20节内容,你有没有发现,有两种数据结构,散列表和链表,经常会被放在一起使用。你还记得,前面的章节中都有哪些地方讲到散列表和链表的组合使用吗?我带你一起回忆一下。在链表那一节,我讲到如何用链表来实现LRU缓存淘汰算法,但是链表实现的LRU缓存淘汰算法的时间复杂度是O(n),当时我也提到了,通过散列表可以将这个时间复杂度降低到O(1)。在跳表那一节,我提到Redis的有序集合是使用跳表来实现的,跳表可以看作一种改进版的链表。当时我们也提到,Redis有序集合不仅使用了跳表,还用到了散列表。转载 2024-04-19 22:15:24 · 19 阅读 · 0 评论 -
数据结构与算法-19-散列表(中)
通过上一节的学习,我们知道,散列表的查询效率并不能笼统地说成是O(1)。它跟散列函数、装载因子、散列冲突等都有关系。如果散列函数设计得不好,或者装载因子过高,都可能导致散列冲突发生的概率升高,查询效率下降。在极端情况下,有些恶意的攻击者,还有可能通过精心构造的数据,使得所有的数据经过散列函数之后,都散列到同一个槽里。如果我们使用的是基于链表的冲突解决方法,那这个时候,散列表就会退化为链表,查询的时间复杂度就从O(1)急剧退化为O(n)。如果散列表中有10万个数据,退化后的散列表查询的效率就下降了10万倍。更转载 2024-04-18 22:42:43 · 31 阅读 · 0 评论 -
数据结构与算法-17-跳表
上两节我们讲了二分查找算法。当时我讲到,因为二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了吗?实际上,我们只需要对链表稍加改造,就可以支持类似"二分"的查找算法。我们把改造之后的数据结构叫作跳表(Skip list),也就是今天要讲的内容。跳表这种数据结构对你来说,可能会比较陌生,因为一般的数据结构和算法书籍里都不怎么会讲。转载 2024-04-18 22:33:09 · 31 阅读 · 0 评论 -
数据结构与算法-16-二分查找(下)
前面的问题是查找第一个值等于给定值的元素,我现在把问题稍微改一下,查找最后一个值等于给定值的元素,又该如何做呢?如果你掌握了前面的写法,那这个问题你应该很轻松就能解决。你可以先试着实现一下,然后跟我写的对比一下。我们还是重点看第 11 行代码。如果 a[mid]这个元素已经是数组中的最后一个元素了,那它肯定是我们要找的;如果 a[mid]的后一个元素 a[mid+1]不等于 value,那也说明 a[mid]就是我们要找的最后一个值等于给定值的元素。转载 2024-04-18 22:26:19 · 6 阅读 · 0 评论 -
数据结构与算法-15-二分查找(上)
二分查找的底层需要依赖数组这种数据结构,二数组为了只持随机访问的特性,要求内存空间连续,对内存的要求比较苛刻。比如,我们有1GB大小的数据,如果希望用数组来存储,那就需要1GB的连续内存空间。注意这的的“连续”二字,也就是说,即便有2GB的内存空间剩余,但是如果这剩余的2GB内存空间都是零散的,没有连续的1GB大小的内存空间,那照样无法申请一个1GB大小的数组。而我们的二分查找是作用在数组这种数据结构之上的,所以太大的数据用数组存储就比较吃里了,也就不能用二分查找了。转载 2024-04-18 21:54:11 · 20 阅读 · 0 评论 -
数据结构与算法-14-排序优化
几乎所有的编程语言都会提供排序函数,比如C语言中qsort(),C++ STL中的sort()、stable_sort(),还有Java语言中的Collections.sort()。在今天的内容中,我分析了C语⾔的中的qsort()的底层排序算法,你能否分析一下你所熟悉的语言中的排序函数都是用什么排序算法实现的呢?前面我们讲到,快速排序比较适合来实现排序函数,但是,我们也知道,快速排序在最坏情况下的时间复杂度是O(n ),如何来解决这个“复杂度恶化”的问题呢?我们知道,快速排序是用递归来实现的。转载 2024-04-17 22:02:40 · 14 阅读 · 0 评论 -
数据结构与算法-13-线性排序
实际上,有时候要排序的数据并不都是等长的,比如我们排序牛津字典中的20万个英文单词,最短的只有1个字母,最长的我特意去查了下,有45个字目,中文翻译是尘肺病。不过,C[6]内存储的并不是考生,而是对应的考生个数。假设我们现在需要对D,a,F,B,c,A,z这个字符串进行排序,要求将其中所有小写字目都排在大写字母的前面,但小写字母内部和大写字母内部不要求有序。从图中可以看出,分数为3分的考生有3个,小于3分的考生有4个,所以,成绩为3分的考生在排序之后的有序数组R[8]中,会保存下标4,5,6的位置。转载 2024-04-17 22:00:58 · 10 阅读 · 0 评论 -
数据结构与算法-12-排序(下)
你可能会说,我有个很笨的办法,每次取数组中的最小值,将其移动到数组的最前面,然后在剩下的数组中继续找最小值,以此类推,执行K次,找到的数据不就是第K大元素了吗?根据分治、递归的处理思想,我们可以用递归排序下标从p到q-1之间的数据和下标从q+1到r之间的数据,直到区间缩小为1,就说明所有的数据都有序了。从我们的原理分析和伪代码可以看出,归并排序的执行效率与要排序的原始数组的有序程度有关,所以其时间复杂度是非常稳定的,不管是最好情况、最坏情况,不过,时间复杂度就并不是O(n)了,而是O(K * n)。转载 2024-04-17 21:57:17 · 5 阅读 · 0 评论 -
数据结构与算法-11-排序(上)
(默认从小到大为有序),我想你应该已经想到了。关于逆序度,我就不举例子讲了。你可以对照我讲的有序度的例子自己看下。1。转载 2024-04-17 21:53:48 · 10 阅读 · 0 评论 -
数据结构与算法-10-递归
从图中,我们可以直观地看到,想要计算f(5),需要先计算f(4)和f(3),而计算f(4)还需要计算f(3),因此,f(3)就被计算了很多次,还是电影院的例子,第一排的就不需要再继续询问任何人,就知道自己在哪一排,也就是f(1)=1,这就是递归的终止条件。2,2,2,1这样子上去,也可以1,2,1,1,2这样子上去,总之之法有很多,那如何用编程求得总共有多少种走法呢?如果有7个台阶,你可以。比如电影院那个例子,你求解“自己在哪一排”的思路,和前面一排人求解“自己在哪一排”的思路,是一模一样的。转载 2024-04-17 21:52:05 · 8 阅读 · 0 评论 -
数据结构与算法-09-队列
循环队列,顾名思义,它长得像一个环。原本数组是有头有尾的,是一条直线。现在我们把首尾相连,扳成了一个环。我画了一张图,你可以直观地感受一下。图中这个队列的大小为8,当前head=4,tail=7。当有一个新的元素a入队时,我们放入下标为7的位置。但这个时候,我们并不把tail更新为8,而是将其在环中后移一位,到下标为0的位置。当再有一个元素b入队时,我们将b放入下标为0的位置,然后tail加1更新为1。阻塞队列其实就是在队列基础上增加了阻塞操作。转载 2024-04-17 21:50:30 · 9 阅读 · 0 评论 -
数据结构与算法-08-栈
不管是顺序栈还是链式栈,我们存储数据只需要一个大小为n的数组就够了。在入栈和出栈过程中,只需要一两个临时变量存储空间,转载 2024-04-17 21:48:38 · 20 阅读 · 0 评论 -
数据结构与算法-07-链表(下)
跟插入类似123ifnull) {null;从前面的一步一步分析,我们可以看出,针对链表的插入、删除操作,需要对插入第一个结点和删除最后一个结点的情况进行特殊处理。这样代码实现起来就会很繁琐,不简洁,而且也容易因为考虑不全而出错。如何来解决这个问题呢?我画了一个带头链表,你可以发现,哨兵结点是不存储数据的。因为哨兵结点一直存在,所以插入第一个结点和插入其他结点,删除最后一个结点和删除其他结点,都可以统一为相同的代码实现逻辑了。转载 2024-04-17 21:46:27 · 11 阅读 · 0 评论 -
数据结构与算法-06-链表(上)
今天我们来聊聊“链表(Linked list)”这个数据结构。学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应⽤场景,那就是LRU缓存淘汰算法。缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非常广泛的应用,比如常用的CPU缓存、数据库缓存、浏览器缓存等等。缓存的大小有限,当缓存被用满时,哪些数据应该被清理出去,哪些数据应该被保留?这就需要缓存淘汰策略来决定。常见的策略有三种:这些策略你不用死记,我打个比方你很容易就明白了。假如说,你买了很多本技术书,但有⼀天你发现,这些书太转载 2024-04-17 21:40:10 · 8 阅读 · 0 评论 -
数据结构与算法-05-数组
这个处理思想在快排中也会用到,在排序那一节具体来讲,这里就说到这儿。例子:假设数组 a[10] 中存储了如下 5 个元素 : a, b, c, d, e.现在需要将元素 x 插入到第 3 个位置.只需要将 c 放入到 a[5],将 a[2] 赋值为 x 即可.转载 2024-04-17 21:16:17 · 253 阅读 · 0 评论 -
数据结构与算法-04-复杂度分析(下)
另外,要查找的数据出现在 0~n-1 这n个位置的概率与时一样的,为1/n。难点,平均时间复杂度 就是他有可能是第1.2.3...n,中的某个分钟回来,那平均就是1+2+3+...n/n,把所有可能出现的情况的时间复杂度相加除以情况数。那么也有可能遇到突发情况,比如说电梯人多吖,路上摔了一胶,天知道他去干了什么,用了n分钟,没办法👐,主上有令,n分钟限时,那这就是“最坏的情况”。因此,前面的推导过程中存在的最大问题就是,没有将各种情况发生的概率考虑进去,如果我们把每种情况发生的概率也考虑进来。转载 2024-04-17 21:11:05 · 442 阅读 · 0 评论 -
数据结构与算法-03-复杂度分析(上)
当然,渐进式时间,空间复杂度分析只是一个理论模型,只能提供给粗略的估计分析,我们不能直接断定就觉得O(logN)的算法一定优于O(n), 针对不同的宿主环境,不同的数据集,不同的数据量的大小,在实际应用上面可能真正的性能会不同,个人觉得,针对不同的实际情况,进而进行一定的性能基准测试是很有必要的,比如在统一一批手机上(同样的硬件,系统等等)进行横向基准测试,进而选择适合特定应用场景下的最有算法。O(1)、O(n)、O(n2 ),像 像 O(logn)、O(nlogn) 这样的对数阶复杂度平时用不到。转载 2024-04-17 20:52:56 · 418 阅读 · 0 评论 -
数据结构与算法-概要说明
20 个 最常用的、最基础的数据结构与算法,不管是应付面试还 是工作需要,只要集中精力逐一攻克,就足够了。原创 2024-04-17 20:50:56 · 346 阅读 · 0 评论