1、为什么要学习数据结构和算法?
对全文的看法:
列举大部分现代程序职业人所面临的问题------>直接归因于数据结构和算法基础--->神话算法的万能性
本身就是基础,过分强调神话其功能;
愿意投入时间的原因:
a、大公司面试;b、这个是基础-是编程的基石-是内功心法->写出高性能代码的前提;c、知其然,知其所以然
学成评判标准:
a、有时间复杂度空间复杂度看问题的意思
b、逻辑思维意思
c、高质量代码
2、如何抓住重点,系统高效地学习数据结构与算法?----- 重点+方法
一句话------抓得住重点,用对方法方法
这是一个思维训练过程,更是习惯养成过程
先划重点:
十个数据结构:
数组,链表,堆,栈, 二叉树,队列,散列表,图,trie树,跳表
十个算法:
递归,排序,二分查找,搜索,哈希算法,贪心算法,分治算法,回溯算法,动态规划,字符串匹配
讲方法:
从这几个方面问自己 ------ 来历、自身特点,适合解决的问题,实际的应用场景
总则 ------ 要辩证的思考,多问为什么,不要死记硬背
细则 ------ 边学边练,多问多思考
flag:每篇文字都有我的评论区留言
03 | 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?------算法性能评价标准(终极目标------多快好省+优雅)
前提是假设每一条代码执行的时间一样
代码执行时间随数据规模增长的变化趋势------ 渐进时间复杂度
关注执行次数最多的那段代码
加法法则+乘法法则
O(n) O(n2) O(n*logn) O(log n)
思考题:
一般不进行性能分析,除非是阶段性功能完成了,有时间,需要代码重构,或者出现了问题才会去性能分析;或者为了达到什么样的一个性能目标;一定是要一个驱动力去完成这个动作,不然应该不会考虑进行什么时间空间复杂度分析
04 | 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度
来历:在查找的过程中,条件终止,差异化的处理耗时
平均:加权平均或者期望平均(算上了出现的概率)---复杂度有量级的差异时才考虑(最好,最坏,平均)
摊还分析,平摊分析,均摊分析------均摊等于最好
思考题:
应该跟摊还分析的例子是一样的嘛
对于清空那个地方还是有点困惑,看了第一条得到了答案,下标指向哪里就代表哪里开始
05 | 数组:为什么很多编程语言中数组都从0开始编号?
数组这种基础数据结构的精髓是什么?随机存取,指定大小------线性(一前一后) 连续空间,相同数据类型
java中有对应的容器
数组,链表,队列,栈 都是线性表;非线性 图和树
数组长于------随机访问------移动数组
链表长于------插入删除------遍历
数组
两个思考题都没有答上来:
先标记再删除
来历:结合内存分配特点而存在
特点:随机访问,插入删除需要移动,或者标记
适合解决的问题:随机访问
实际应用:jvm内存管理
06 | 链表(上):如何实现LRU缓存淘汰算法?
五花八门的链表 ------
单链表:尾节点指向空
双向链表:更常用
循环链表:特点是到头结点方便,如约瑟夫问题
来历:克服连续空间有限的问题
特点:删除和插入块,但是定位删除和插入点应该也是查询操作;除了不需要连续空间,没有任何优势啊,对比数组来说
适合解决的问题:几乎没什么优势
实际应用:LRU就是一个队列,链表和数组都可以搞定
思考题:单链表翻转,^_^
07 | 链表(下):如何轻松写出正确的链表代码?