数据结构与算法
文章平均质量分 83
tzzt01
程序界的小学生
展开
-
各种时间复杂度的相关代码
文章目录前言一、log(n)二、n*log(n)前言O(logn)、O(nlogn)、O(n^2)等这些时间复杂度对应的代码是什么样?也许记住这些代码能更好、更快地算出时间复杂度。简单的时间复杂度就不在此写了。一、log(n)public void cal(int n) { int i = 1; while (i < n) { // 假设循环 x 次后跳出循环,也就是 2^x ≥ n , // 则循环次数 x 就等于 log以2为底的n次方。即log2(n) i = i原创 2021-07-05 14:01:55 · 792 阅读 · 0 评论 -
0.前置内容
如何高效学习数据结构和算法数据结构和算法的东西并不多,常用的、基础的知识点更是屈指可数。只要掌握了正确的学习方法,学起来并没有看上去那么难,更不需要什么高智商、厚底子。什么是数据结构?什么是算法?从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。那数据结构和算法有什么关系呢?为什么大部分书都把这两个东西放到一块儿来讲呢?数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构之上。 因此,我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。学习原创 2021-04-27 13:25:11 · 140 阅读 · 1 评论 -
1.时间复杂度分析和空间复杂度分析
极客时间《数据结构和算法》的课堂笔记。强烈建议购买此课程。原创 2021-04-18 00:13:34 · 432 阅读 · 0 评论 -
2.复杂度分析进阶
平均情况复杂度在数组查询的案例中,最好情况时间复杂度是 O(1),最坏情况时间复杂度是 O(n)。但其实最好与最坏情况是极端情况,更多的时候是不在数组两端的中间某位置。所以为了更准确的表示平均情况下的时间复杂度,引入另一个改变:平均情况时间复杂度。 int cal(int n) { int sum = 0; int i = 1; for (; i <= n; ++i) { sum = sum + i; } return sum; }在数组遍历某元素的过原创 2021-04-26 11:07:06 · 133 阅读 · 0 评论 -
3.数组:为什么很多编程语言中数组都从0开始编号?
任何编程语言都有数组这种数据类型。它不仅是一种编程语言中的数据类型,也是一种最基础的数据结构。在大部分编程语言中,数组都是从 0 开始编号的,但你是否下意识地想过,为什么数组要从 0 开始编号,而不是从 1 开始呢? 从 1 开始不是更符合人类的思维习惯吗?你可以带着这个问题来学习接下来的内容。如何实现随机访问?数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据。线性表由于数组是连续存储,只要知道基址和数据类型所占字节数,就能根据下标找到任意位置的元素值。即:a原创 2021-04-27 14:02:05 · 110 阅读 · 0 评论 -
总结1--在实际开发中,如何权衡选择使用哪种数据结构和算法?
文章目录前言一、时间、空间复杂度不能跟性能划等号1. 代码的执行时间有时不跟时间复杂度成正比2. 对于处理不同问题的不同算法,其复杂度大小没有可比性二、抛开数据规模谈数据结构和算法都是“耍流氓”三、结合数据特征和访问方式来选择数据结构四、区别对待 IO 密集、内存密集和计算密集五、善用语言提供的类,避免重复造轮子六、千万不要漫无目的地过度优化总结前言作为软件开发工程师,我们要把数据结构和算法,应用到软件开发中,解决实际的开发问题。不过,要想在实际的开发中,灵活、恰到好处地应用数据结构和算法,需要非.原创 2021-05-06 09:40:06 · 636 阅读 · 0 评论 -
4.链表(上)
文章目录一、与数组的比较1.数据结构不同2. 复杂度不同查询复杂度不同插入和删除复杂度不同3. 链表 VS 数组性能大比拼二、链表结构1.单链表2.循环链表和双向链表总结一、与数组的比较1.数据结构不同数组需要连续的内存空间来存储,对内存的要求比较高。比如申请一个100MB大小的数组,如果内存中没有连续的、足够大的存储空间,即使内存的剩余总可用空间大于100MB,仍然会申请失败。而链表恰恰相反,它并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用,所以如果我们申请的是 100原创 2021-05-07 09:27:12 · 68 阅读 · 0 评论 -
5.链表(下)——如何轻松写出正确的链表代码
文章目录前言技巧一、理解指针或引用的含义技巧二:警惕指针丢失和内存泄漏技巧三:利用哨兵简化实现难度技巧四:重点留意边界条件处理技巧五:举例画图,辅助思考技巧六:多写多练,没有捷径前言写链表代码是最考验逻辑思维能力的。因为,链表代码到处都是指针的操作、边界条件的处理,稍有不慎就容易产生 Bug。链表代码写得好坏,可以看出一个人写代码是否够细心,考虑问题是否全面,思维是否缜密。所以,这也是很多面试官喜欢让人手写链表代码的原因。所以,这一节讲到的东西,你一定要自己写代码实现一下,才有效果。技巧一、理解原创 2021-05-17 10:24:43 · 86 阅读 · 0 评论 -
6. 栈:如何实现浏览器的前进和后退功能?
文章目录前言一、如何理解“栈”?二、如何实现一个“栈”?支持动态扩容的顺序栈栈的应用解答开篇总结思考前言如何实现浏览器的前进、后退功能?这就要用到我们今天要讲的“栈”这种数据结构。带着这个问题,我们来学习今天的内容。一、如何理解“栈”?栈就像手枪的弹夹,最后装填的子弹,最先射出。后进者先出,先进者后出,这就是典型的“栈”结构。从栈的操作特性上来看,栈是一种“操作受限”的线性表, 只允许在一端插入和删除数据。那直接使用数组或者链表不就好了吗?为什么还要用这个“操作受限”的“栈”呢?事实上,从功原创 2021-05-18 11:18:49 · 144 阅读 · 0 评论 -
7. 队列:队列在线程池等有限资源池中的应用
文章目录前言一、如何理解“队列”?二、顺序队列和链式队列1. 基于数组的队列实现方法2. 基于链表的队列实现方法循环队列总结前言我们知道,CPU 资源是有限的,任务的处理速度与线程个数并不是线性正相关。相反,过多的线程反而会导致 CPU 频繁切换,处理性能下降。 所以,线程池的大小一般都是综合考虑要处理任务的特点和硬件环境,来事先设置的。当我们向固定大小的线程池中请求一个线程时,如果线程池中没有空闲资源了,这个时候线程池如何处理这个请求?是拒绝请求还是排队请求?各种处理策略又是怎么实现的呢?实际上转载 2021-05-25 10:23:41 · 94 阅读 · 0 评论 -
8. 递归
文章目录前言一、如何理解“递归”?递归需要满足三个条件1. 一个问题的解可以分解为几个子问题的解2. 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样3. 存在递归终止条件二、如何编写递归代码?避免堆栈溢出递归代码要警惕重复计算怎么将递归代码改写为非递归代码?解答开篇总结思考前言递归的应用非常广泛,之后要讲的很多数据结构和算法的编码实现都要用到递归,搞懂递归非常重要,否则,后面复杂一些的数据结构和算法学起来就会比较吃力。本课要解决的问题问题给定一个用户 ID,如何查找这个用户的“最终原创 2021-05-27 10:22:28 · 93 阅读 · 0 评论 -
9.排序(上):为什么插入排序比冒泡排序更受欢迎
文章目录前言一、如何分析一个“排序算法”?1. 最好情况、最坏情况、平均情况时间复杂度2. 时间复杂度的系数、常数 、低阶3. 比较次数和交换(或移动)次数二、排序算法的内存消耗三、排序算法的稳定性案例冒泡排序(Bubble Sort)第一,冒泡排序是原地排序算法吗?第二,冒泡排序是稳定的排序算法吗?第三,冒泡排序的时间复杂度是多少?有序度和逆序度有序度逆序度插入排序(Insertion Sort)第一,插入排序是原地排序算法吗?第二,插入排序是稳定的排序算法吗?第三,插入排序的时间复杂度是多少?选择排序(原创 2021-05-11 14:49:28 · 237 阅读 · 0 评论