本讲内容:
为什么学习数据结构和算法?
学习重点是什么?
复杂度分析?
为什么学习数据结构和算法
阅读框架源码,理解其背后的设计思想
不想只会写CRUD,只写出能用的代码,而是想写出高质量,性能较优的代码
以上都是为了能在软件开发行业有长久的发展,不管是在升职加薪还是以后跳槽面试,都是必不可少的
学习重点是什么?
什么是数据结构和算法?
数据结构,就是一组数据的存储结构。
算法,就是操作数据的一组方法。
数据结构是为算法服务的,算法要作用在特定的数据结构之上。数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的。
为什么需要数据结构和算法?
首先来看数据结构和算法解决的是什么问题:如何更省、更快(空间和时间)地存储和处理数据的问题
其次为什么要解决这个问题?原因是随着计算机技术的发展,数据规模在不断扩大,但是计算机本身的计算和存储能力的发展相比于数据的扩张较为缓慢。而且人类对于高效率的追求是一个不变的目标。如何提高计算机的计算效率,由此产生了数据结构和算法。
如何衡量数据结构和算法?
为了提升计算效率,大家设计了很多种数据结构和算法。这些数据结构和算法之间谁更优,这时就需要一个衡量的标准和方法。这个衡量方法即为复杂度分析。
复杂度分析:时间复杂度分析和空间复杂度分析
这也对应了数据结构和算法解决的问题:更快和更省的存储和处理数据
学习内容
10个数据结构: 数组,链表,栈,队列,散列表,二叉树,堆,跳表,图,Trie树
10个算法: 递归,排序,二分查找,搜索,哈希算法,贪心算法,分治算法,回溯算法,动态规划,字符串匹配算法
复杂度分析
什么是复杂度分析?
复杂度分析是从时间和空间纬度衡量数据结构和算法的。具体点说,复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。
为什么要进行复杂度分析?
是一种理论分析的工具,能够帮助我们计算代码的性能,在进行实际测试之前有个宏观的认识,帮助我们写出高质量的代码。而且这种分析不依赖执行环境、成本低、效率高、易操作、指导性强。
怎么进行复杂度分析?
大 O 复杂度表示法
示例:
时间复杂度分析:
第 2、3 行代码分别需要 1 个 unit_time 的执行时间
第 4、5 行都运行了 n 遍,所以需要 2n*unit_time 的执行时间
这段代码总的执行时间就是 (2n+2)*unit_time。
所有代码的执行时间 T(n) 与每行代码的执行次数成正比。
分析方法:
1. 只关注循环执行次数最多的一段代码
2. 加法法则:总复杂度等于量级最大的那段代码的复杂度
3. 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
几种常见时间复杂度实例分析
多项式阶:随着数据规模的增长,算法的执行时间和空间占用,按照多项式的比例增长。包括,O(1)(常数阶)、O(logn)(对数阶)、O(n)(线性阶)、O(nlogn)(线性对数阶)、O(n^2)(平方阶)、O(n^3)(立方阶)
非多项式阶:随着数据规模的增长,算法的执行时间和空间占用暴增,这类算法性能极差。包括,O(2^n)(指数阶)、O(n!)(阶乘阶)