声明:本帖子专为个人面试所写,本身只是为了加深自己的记忆,写完想着分享出来万一有人也需要呢。所以内容较浅,也比较基础,大佬们请绕道!参考链接在最后!不够看的可以看视频,老师讲的很好,就是有点浅,不过对于新手很友好!
目录:
一. 时间复杂度:
- 计算规则
- 常见时间复杂度
- 常见时间复杂度比较
- List常见内置操作的时间复杂度
- Dict常见内置操作时间复杂度:
二. 顺序表:
- 定义
- 存储方式
三. python中的顺序表(列表):里面一系列操作及时间比较
四. 链表:
- 为什么需要链表
- 链表的多种形式
- 链表与顺序表的时间复杂度比较
- 主要需要掌握的操作
五. 栈:
六. 队列:
七. 双端队列:
八. 排序算法:(包括定义,步骤,实现代码,时间复杂度及个人理解)
- 冒泡排序
- 选择排序
- 插入排序
- 快速排序
- 希尔排序
- 归并排序
- 常见排序算法时间复杂度比较
九. 树结构:
- 树的概念
- 树的术语
- 树的种类
- 树的存储
十. 二叉树:
- 完全二叉树
- 满二叉树
- 二叉树的节点和树的创建及添加节点
- 树的遍历
- 树的广度优先遍历
- 树的深度优先遍历
正文:
一. 时间复杂度(关于算法不得不提的东西):
- 计算规则:
- 基本操作,即只有常数项,认为其时间复杂度为O(1)
- 顺序结构,时间复杂度按加法进行计算
- 循环结构,时间复杂度按乘法进行计算
- 分支结构,时间复杂度取最大值
- 判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略
- 在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度
- 常见时间复杂度:
- 常见时间复杂度的关系:
- List常见内置操作的时间复杂度:
- 列表的索引,给指定索引赋值,在末尾添加元素,在末尾弹出元素,时间复杂度都为O(1),因为都是直接一步到位的找到所需元素。
- 从任意位置弹出/插入/删除元素,判断是否在列表中,删除某一段切片,反转整个列表,时间复杂度都为O(n),因为所有这些操作看似只有一步,但其内部影响着每一个元素。
- 切片操作取决于切片的长度所以是O(k)。
- 注意排序的时间也不短,用之前需要考虑,O(nlongn)
- Dict常见内置操作时间复杂度:
- 可以看出字典的查找,插入,获取,删除,时间复杂度都是O(1)
- 迭代和拷贝是O(n)
二. 顺序表:
- 定义:将元素顺序地存放在一块连续的存储区里,切记在内存中是连续存放的
- 存储方式:内置和外置。
- 内置的话要求元素的存储单元大小固定相同,可以直接存放物理地址,如列表里只有一种基本数据结构
- 外置的话是元素的存储单元大小不相同,顺序表中存放着元素的地址信息,这些地址信息链接着实际存放的数据元素,如一个列表里既有数字,又有字符串,数字
- 如上图所示,因为顺序存放的因素,列表在索引是时间复杂度为O(1),因为知道了第一个元素的地址后直接经过加法计算即可得到其他元素
- 更详细的顺序表的两种实现方式(一体式/分离式)在这里就不继续展开了
三. Python中的顺序表(列表):
- 在python中列表和元素都采用的是顺序表实现的,此处总结一下list的个人需要熟记的操作,为刷题时可以灵活使用(可能一次性想不全,日后刷题时再碰到时再补充)
- 生成列表:
- 列表推导式:a = [i for i in range(5)]
- list(range(5))
- 添加元素:
- list.append(x):在列表末尾添加元素(添加元素时速度最快)
- list.insert(index,x):在任意位置添加元素(速度最慢)
- list.extend():在末尾,既可只添加