![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法分析理论
文章平均质量分 72
zhaol_90
好好学习,天天向上
展开
-
09 | 队列:队列在线程池等有限资源池中的应用
CPU 资源是有限的,任务的处理速度与线程个数并不是线性正相关。相反,过多的线程反而会导致CPU频繁切换,处理性能下降。所以,线程池的大小一般都是综合考虑要处理任务的特点和硬件环境,来事先设置的。 当我们向固定大小的线程池中请求一个线程时,如果线程池中没有空闲资源了,这个时候线程池如何处理这个请求?是拒绝请求还是排队请求?各种处理策略又是怎么实现的呢? 实际上,这些问题并不复杂,其底层的...原创 2018-12-19 15:09:48 · 170 阅读 · 0 评论 -
06 | 链表(上):如何实现LRU缓存淘汰算法? Linked List
缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存、数据库缓存、浏览器缓存等等。 存的大小有限,当缓存被用满时,哪些数据应该被清理出去,哪些数据应该被保留?这就需要缓存淘汰策略来决定。常见的策略有三种:先进先出策略 FIFO(First In,First Out)、最少使用策略 LFU(Least Frequently Used)、最近最少使用...原创 2018-12-18 14:17:00 · 355 阅读 · 0 评论 -
04 | 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度
最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂度。 最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度。 平均时间复杂度:用代码在所有情况下执行的次数的加权平均值表示。 均摊时间复杂度:在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低级别复杂度...原创 2018-12-18 14:15:17 · 202 阅读 · 0 评论 -
03 | 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?
事后统计法: (把代码跑一遍,通过统计、监控,就能得到算法的执行时间和占用的空间大小) 1)测试结果非常依赖测试环境,测试环境中硬件的不同会对测试结果有很大的影响。 2)测试结果受数据规模的影响很大。待排序数据的有序度不一样,排序的执行时间就会有很大的差别。 在不运行代码的情况下,用“肉眼”得到一段代码的执行时间; 所以代码的执行时间T(n)与每行代码的执行次数n成正比 ~~~ ...原创 2018-12-18 14:14:48 · 377 阅读 · 0 评论 -
02 | 如何抓住重点,系统高效地学习数据结构与算法?
从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。 数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构之上。因此,我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。 因为数据具有随机访问的特点,常用的二分查找算法需要用数据来存储数据。但如果我们选择链表这种数据结构,二分查找算法就无法工作了,因为链表不支持随机访问。 数据结构是静态的...原创 2018-12-18 14:13:34 · 353 阅读 · 0 评论 -
12 | 排序(下):如何用快排思想在O(n)内查找第K大元素?
上一节我讲了冒泡排序、插入排序、选择排序这三种排序算法,它们的时间复杂度都是 O(n2),比较高,适合小规模数据的排序。 今天,我讲两种时间复杂度为 O(nlogn) 的排序算法,归并排序和快速排序。这两种排序算法适合大规模的数据排序,比上一节讲的那三种排序算法要更常用。 归并排序和快速排序都用到了分治思想,非常巧妙。我们可以借鉴这个思想,来解决非排序的问题,比如:如何在 O(n) 的时间复杂...原创 2018-12-28 13:24:00 · 514 阅读 · 0 评论 -
11 | 排序(上):为什么插入排序比冒泡排序更受欢迎?
排序算法太多了有很多可能你连名字都没听说过,比如猴子排序、睡眠排序、面条排序等。我只讲众多排序算法中的一小撮,也是最经典的、最常用的:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。我按照时间复杂度把它们分成了三类。 思考题:插入排序和冒泡排序的时间复杂度相同,都是 O(n2),在实际的软件开发里,为什么我们更倾向于使用插入排序算法而不是冒泡排序算法呢? ...原创 2018-12-28 10:06:46 · 271 阅读 · 0 评论 -
Linked List Cycle
给定一个单链表,判断其中是否有环,已经是一个比较老同时也是比较经典的问题,在网上搜集了一些资料, 然后总结一下大概可以涉及到的问题,以及相应的解法。 首先,关于单链表中的环,一般涉及到一下问题: 1.给一个单链表,判断其中是否有环的存在; 2.如果存在环,找出环的入口点; 3.如果存在环,求出环上节点的个数; 4.如果存在环,求出链表的长度; 5.如果存在环,求出环上距离任意一个节点...转载 2018-12-19 21:52:14 · 195 阅读 · 0 评论 -
10 | 递归:如何用三行代码找到“最终推荐人”?
如何理解“递归”? 递归是一种应用非常广泛的算法(或者编程技巧)。比如 DFS 深度优先搜索、前中后序二叉树遍历等等。 周末你带着女朋友去电影院看电影,女朋友问你,咱们现在坐在第几排啊?电影院里面太黑了,看不清,没法数,现在你怎么办? 别忘了你是程序员,这个可难不倒你,递归就开始排上用场了。于是你就问前面一排的人他是第几排,你想只要在他的数字上加一,就知道自己在哪一排了。但是,前面的人也看不...原创 2018-12-19 15:48:58 · 357 阅读 · 1 评论 -
08 | 栈:如何实现浏览器的前进和后退功能?
后进者先出,先进者后出,这就是典型的“栈”结构。 从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。 特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,自然也就更容易出错。 当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,我们就应该首选“栈”这种数据结构。 栈...原创 2018-12-18 14:18:01 · 359 阅读 · 0 评论