数据结构与算法入门(上)

1、目标

--->20 个最常用的、最基础数据结构与算法,不管是应付面试还是工作需要,只要集中精力逐一攻克这 20 个知识点就足够了。

--->10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;

--->10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。

2、复杂度分析

--->复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半。

大 O 复杂度表示法

--->T(n) 它表示代码执行的时间;n 表示数据规模的大小;f(n) 表示每行代码执行的次数总和。因为这是一个公式,所以用 f(n) 来表示。公式中的 O,表示代码的执行时间 T(n) 与 f(n) 表达式成正比。

--->T(n) = O(2n+2)和T(n) = O(2n2+2n+3)。这就是大 O 时间复杂度表示法。大 O 时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度。

--->当 n 很大时,你可以把它想象成 10000、100000。而公式中的低阶、常量、系数三部分并不左右增长趋势,所以都可以忽略。我们只需要记录一个最大量级就可以了,如果用大 O 表示法表示刚讲的那两段代码的时间复杂度,就可以记为:T(n) = O(n); T(n) = O(n2)。

时间复杂度分析

1. 只关注循环执行次数最多的一段代码

--->我们在分析一个算法、一段代码的时间复杂度的时候,也只关注循环执行次数最多的那一段代码就可以了。

2. 加法法则:总复杂度等于量级最大的那段代码的复杂度

--->总的时间复杂度就等于量级最大的那段代码的时间复杂度。

3. 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

--->假设 T1(n) = O(n),T2(n) = O(n2),则 T1(n) * T2(n) = O(n3)。落实到具体的代码上,我们可以把乘法法则看成是嵌套循环

几种常见时间复杂度实例分析

--->对于刚罗列的复杂度量级,我们可以粗略地分为两类,多项式量级和非多项式量级。其中,非多项式量级只有两个:O(2n) 和 O(n!)。

常见的多项式时间复杂度

1. O(1)

--->O(1) 只是常量级时间复杂度的一种表示方法,并不是指只执行了一行代码。比如这段代码,即便有 3 行,它的时间复杂度也是 O(1),而不是 O(3)。

--->一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1)。

2. O(logn)、O(nlogn)

--->这段代码的时间复杂度就是 O(log2n)。

3. O(m+n)、O(m*n)

--->m 和 n 是表示两个数据规模。我们无法事先评估 m 和 n 谁的量级大,所以我们在表示复杂度的时候,就不能简单地利用加法法则,省略掉其中一个。

空间复杂度分析

--->时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系。类比一下,空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系。

--->我们常见的空间复杂度就是 O(1)、O(n)、O(n2 ),像 O(logn)、O(nlogn) 这样的对数阶复杂度平时都用不到。而且,空间复杂度分析比时间复杂度分析要简单很多。

内容小结

--->复杂度也叫渐进复杂度,包括时间复杂度和空间复杂度,用来分析算法执行效率与数据规模之间的增长关系,可以粗略地表示,越高阶复杂度的算法,执行效率越低。常见的复杂度并不多,从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n2 )。

相关推荐
Frank_zhou1 小时前
算法-链表实战【删除链表的倒数第 N 个结点】中等
数据结构
weixin_419658318 小时前
数据结构之二叉树
java·数据结构
心.c9 小时前
JavaScript 数据结构详解
前端·javascript·数据结构
-qOVOp-10 小时前
408第一季 - 数据结构 - B树与B+树
数据结构·b树
麦兜*10 小时前
【为什么InnoDB用B+树?从存储结构到索引设计深度解析】
java·数据结构·spring boot·b树·mysql·算法·数据库架构
追烽少年x10 小时前
数据结构---B树
数据结构
找不到、了11 小时前
关于B+树的介绍
数据结构·b树·mysql
IC 见路不走12 小时前
LeetCode 第75题:颜色分类
数据结构·算法·leetcode
Zephyrtoria15 小时前
区间合并:区间合并问题
java·开发语言·数据结构·算法