极客大学架构师训练营 数据结构与算法 平衡二叉树 红黑树 动态规划 遗传算法 第15课 听课总结
说明
讲师:李智慧
数据结构与算法
时间复杂度与空间复杂度
时间复杂度
- 并不是计算程序具体运行的时间,而是算法执行语句的次数。
O(2^n)
表示对n数据处理需要进行2^n
次计算。O(1)
,O(log(n))
,O(n^a)
多项式时间复杂度O(n^a)
和O(n!)
非多项式的时间复杂度。
空间复杂度
- 一个算法在运行过程中临时占用存储空间大小的量度。
O(n)
表示需要临时存储n个数据。
NP问题
- P问题:能在多项式时间复杂度内解决的问题。
- NP问题:能在多项式时间复杂度内验证答案正确与否的问题。
NP ?= P
- NP-hard 问题:比NP问题更难的问题(NP问题的解法可以规约到NP-hard问题的解法)
- NP完全问题:是一个NP-hard问题,也是一个NP问题。
NP问题举例:数独填写,横竖都是填写不重复的1~9个数, 方块也是写的1~9个数。
访问全部地区的最省方式。
数组
创建数组必须要内存中一块连续的空间。
数组中必须存放相同的数据类型。
随机快速读写是数组的一个重要特性,根据数组的下标访问数据,时间复杂度为 O(1).
链表
链表可以使用零散的内存空间存储数据。
所以链表中的每个数据元素都必须包含一个指向下一个数据元素的内存地址指针。要想在链表中查找一个数据,只能遍历链表,所以链表的查询时间复杂度总是O(N).
链表中增删数据要比数组性能好的多
- 链表增删数据时间复杂度总是O(1).
- 数组增删数据时间复杂度总是O(N).
数组链表结合,实现快速查找和快速增删
Hash 表
如何既快速访问数据,有快速增删数据?
- Hash表查、增、删数据时间复杂度总是O(1).
Hash 冲突
如果Hash(Key)的位置,存储不止一个值,就挨个匹配key值,取出相应的value值。
栈
数组和链表都被称为线性表。
栈就是在线性表的基础上加了这样的操作限制条件:后面添加的数据,在删除的时候必须先删除,即通常所说的“后进先出”。
线程运行时专有内存为什么被称为线程栈?
线程调用栈
void f() {int x = g(1);x++; // g 函数返回,当前堆栈顶部为f函数栈帧,在当前栈帧继续执行f函数的代码。
}int g(int x) {return x + 1;
}
队列
队列也是一种受限的线性表,栈是后进先出,而队列是先进先出。
典型的应用场景:生产者消费者;阻塞等待的线程被放入队列。
用队列搜索好友中关系最近的有钱人
构建一个队列:
- 把你入队列。
- 然后把你出队列,把你的好友Bob, Alice, Claire入队列。看看是否是有钱人?如果不是。
- 把Bob,Alice,Claire依次出队列,把他们的好友入队列。
用队列搜索最短路径
- CAB先入队列,
- CAB出队列,把CAB的临近结点CAT,CAR入队列。
- CAT,CAR相继出队列,把它们的临近结点BAT入队列,发现这就是终点。也就是最短路径是CAB - CAT - BAT.
树
二叉排序树
- 左子树上所有节点的值均小于或等于它的根节点的值。
- 右子树上所有节点的值均大于或等于它的跟节点的值。
- 左、右子树也分别为二叉排序树。
时间复杂度:O(logn)
不平衡的二叉排序树
不平衡的二叉排序树退化为链表,时间复杂度:O(n)
平衡二叉(排序)树
从任何一个结点出发,左右子树深度只差的绝对值不超过1.
左右子树仍然为平衡二叉树。
旋转二叉树恢复平衡
插入式,最多只需要两次旋转就会重新恢复平衡。
删除时,需要维护从被删结点到根节点这条路径上所有节点的平衡性,时间复杂度为O(logn)
.
右旋的过程:
- 15变成根节点;
- 17比15大,则17是15的右节点。
- 16比17小,则16是17的左节点。
左旋的过程:
- 25变成根节点;
- 22比25小,则22是25的左节点。
- 23比22大,则23是22的右节点。
红黑(排序)树
- 每个节点只有两种颜色:红色和黑色。
- 根节点是黑色的。
- 每个叶子节点(Null)都是黑色的空节点。
- 从根节点到叶子节点,不会出现两个连续的红色节点。
- 从任何一个节点出发,到叶子节点,这条路径上都有相同数目的黑色节点。
增删结点的时候,红黑树通过染色和旋转,保持红黑树满足定义
TreeMap就是用红黑树实现的。
红黑树 vs 平衡二叉树
- 红黑树最多只需3次旋转就会重新达成红黑平衡,时间复杂度O(1).
- 在大量增删的情况下,红黑树的效率更高。
- 红黑树的平衡性不如平衡二叉树,查找效率要差一些。
跳表
时间复杂度:O(logn)
空间复杂度:O(n)
常用算法
- 穷举算法
- 递归算法
- 贪心算法
- 动态规划
递归算法(快速排序算法)
def quicksort(array):if len(array) < 2:return array // 基线条件: 为空或只包含一个元素的数组是 “有序”的else:pivot = array[0] // 递归条件less = [i for i in array[1:] if i <= pivot] // 由所有小于基准值的元素组成的子数组greater = [i for i in array[1:] if i > pivot] // 由所有大于基准值的元素组成的子数组return quicksort(less) + [pivot] + quicksort(greater)print quicksort([10, 5, 2, 3])
注意:
递归算法一定要有退出条件,否则就会栈溢出 Stack Overflow.
栈的空间是有限的,所以函数调用不能太深,比如写个计数,超过1000就退出。
时间复杂度:O(n * log(n))
贪心算法
背包问题: 拿一个装4磅中背包到商城买东西,将哪些商品放入背包才能受益最大化。
每一步都找当前的最优价,但是不一定是结果的最优解。
- 音响 = 4磅,3000美元。
- 笔记本 + 吉他 = 4磅, 4500美元。
改进贪心算法 - 迪杰斯特拉算法(最快路径)
迪杰斯特拉算法(最快路径)
- 找出 “最便宜” 的节点,即可在最短时间内到达的节点。
- 更新该节点的邻居的开销,检查是否有前往它们的更短路径,如果有,就更新其开销。
- 重复这个过程,直到对图中的每个节点都这样做了。
- 计算最终路径。
迪杰斯特拉算法的核心是找到起点到每个节点的最快路径。
动态规划
动态规划算法解决背包问题:
通过找到合适的角度,将所求解的目标值在某(几)个维度上展开,将一个大问题拆解为若干小问题,小问题的最优解,寻找大问题的最优解。
每个动态规划算法都是从一个网格开始,背包问题的网格如下:
遗传算法不一定得到最优解
遗传算法过程
遗传算法解决背包问题
遗传算法( Genetic Algorithm, GA ) 是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
遗传算法以一种群体中的所有个体对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。
例子:80公斤背包装哪些物品价值最大?
物品 | 重量 | 价值 |
---|---|---|
1 | 10 | 15 |
2 | 15 | 25 |
3 | 20 | 35 |
4 | 25 | 45 |
5 | 30 | 55 |
6 | 35 | 70 |
基因编码与染色体
物品基因编码
物品1 | 物品2 | 物品3 | 物品3 | 物品5 | 物品6 | 染色体 |
---|---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 1 | 111111 |
基因组合:染色体
选择初始染色体:随机产生(也可以人为或者算法选择)
- 100100, 对应物品1、物品4存在。
- 101010, 对应物品1、物品3、物品5存在。
- 010101, 对应物品2、物品4、物品6存在。
- 101011, 对应物品1、物品3、物品5、物品6存在。
适应函数与控制参数
选择适应度函数,这里为商品总价值。
- 100100 = 15 + 45 = 60.
- 101010 = 15 + 35 + 55 = 105.
- 010101 = 25 + 45 + 70 = 140.
- 101011 = 15 + 35 + 55 + 70 = 175.
选择控制参数,这里为重量
- 100100 = 10 + 25 = 35.
- 101010 = 10 + 20 + 30 = 60.
- 010101 = 15 + 25 + 35 = 75.
- 101011 = 10 + 20 + 30 + 35 = 95.
染色体101011超重,淘汰。
选择算法
在剩下的染色体中选择可以被遗传下去的染色体以及繁殖次数。
- 100100, 适应度函数为 60.
- 101010, 适应度函数为 105.
- 010101, 适应度函数为 140.
选择算法
- 轮盘选择 ( Roulette Wheel Selection ): 是一种回放式随机采样方法。每个染色体进入下一代的概率等于它的适应度值与整体适应度值和的比例。
- 随机竞争选择( Stochastic Tournament): 每次按轮盘赌选择一对个体,然后让这两个个体进行竞争,适应度高的被选中,如此反复,直到选满为止。
- 均匀排序:对群体中的所有个体按照适应度大小进行排序,基于这个排序来分配各个个体被选中的概率。
交叉遗传
选中结果: 101010 和 010101 个繁殖两次
生产下一代:染色体交叉遗传
个体 | 染色体 | 配对 | 交叉点位置 | 交叉结果 |
---|---|---|---|---|
1 | 101010 | 1-2 | 3 | 101101 |
2 | 010101 | 1-2 | 3 | 010010 |
3 | 101010 | 3-4 | 4 | 101001 |
2 | 010101 | 3-4 | 4 | 010110 |
循环迭代,如果连续几代遗传都没有出现更强的染色体(价值总和更大),那么算法收敛,当前最大价值的染色体为最终解。
有时候会在遗传过程中进行基因突变,得到基因突变染色体。
时间复杂度:O(1)
极客大学架构师训练营 数据结构与算法 平衡二叉树 红黑树 动态规划 遗传算法 第15课 听课总结相关推荐
- 可复制领导力 - 极客大学架构师训练营 架构师老A
说明 分享人: 架构师老A 分享主题:<可复制领导力> 分享提纲: 个人能力成长阶梯 东西方领导力差异 管理者角色认知 架构师老A自我介绍 老A亲爱的老师们,同学们,大家好晚上,今晚由我给 ...
- 极客大学架构师训练营大作业
大作业 背景 产品需求 技术方案建议 练习要求 用例图 泳道图 部署图 时序图 用户下单&支付 快递员位置上报 系统派单 订单状态图 背景 产品需求 技术方案建议 练习要求 用例图 说明: ● ...
- 极客大学产品经理训练营 产品文档和原型 作业4
作业 [本周作业]写一个用例,挑一个:你自己的产品 / 你喜欢的产品 / [拍东西]发起拍卖/ [知识星球]加入星球/ [极客时间]购买课程: 1. 标题作者修改历史 标题:[极客时间]购买课程 作者 ...
- 极客大学产品经理训练营:业务流程与产品文档 第11课总结
讲师:邱岳 1. 原型图 1.1 手绘图 + Scanner Pro 1.2 线框图 1.3 高保真产品图 1.4 做原型图的目的 坍缩:规划时梦到自己成了乔布斯,赶紧画个图让自己冷静冷静: 具体:具 ...
- 极客大学产品经理训练营:数据分析与商业分析,商业分析到业务分析 第18课总结
讲师:邱岳 1. 产品经理眼中的利润.成本.收入 利润 = 收入 - 成本 奶茶利润率极高,达到60%左右.但是奶茶盈利比较难. 所有买水的产品利润率都极高,比如可口可乐,咖啡,奶茶等. 案例:有个面 ...
- 极客大学产品经理训练营:产品文档和原型咋弄 - 流程图 第9课总结
讲师:邱岳 1. 图的意义 流程图.活动图.时序图.状态图,本次聚焦于过程和行为描述. 提效.宏观.点睛. 梳理思路 用例:做什么? 流程图:怎么做? 2. 流程图.活动图.时序图 3. 动手画 – ...
- 极客大学产品经理训练营 极客时间购买课程-大作业
1. 标题作者修改历史 标题:[极客时间]购买课程 作者 历史 时间 易筋 创建 2021-01-09 易筋 添加购买流程图6 2021-03-02 易筋 添加购买时序图7 2021-03-16 2. ...
- 面试中常见的数据结构与算法题整理,想当架构师,数据结构与算法不过关可不行(数组+字符串,共60题)
[Java架构师面试网]收集整理了一些Java面试的常见问题,这些问题可能会在你下一次技术面试中遇到.想成为Java架构师,这些都是不可避免也是必须要掌握的哦,对于其他模块的面试题,我后续也将单独分享 ...
- 极客大学产品经理训练营:业务架构与概念模型 第10课总结
讲师:邱岳 1. 什么是状态图 系统中的概念或对象随着一些事件的发生,改变了状态,通常这个状态比较多.比较复杂时,我们需要用状态图来表示他们的边界,以及触发状态转换的活动. 2. 动手画 – 员工状态 ...
- 极客大学产品经理训练营:产品经理的职业规划 第20课总结
讲师:邱岳 1. 简历(你)作为产品 简历可能是你向你未来同事展示的第一个作品,关于你自己的经历.特点.审美,所以要像设计和研发一个产品那样设计好你的简历. 当谈论产品的时候,我们的思路应该依然是:用 ...
最新文章
- 1977中文版_历年星云、雨果获奖长篇中文版汇总
- h.264 scanning process for transform coefficients
- 旁门左道也谈cacti安装
- css中字间距调整(转)
- mybatis 自动生成integer_通过mybatis-generator-core工具自动关联表生成对应model、mappers及dao层代码类完整教程...
- opencv编译找不到nvcuvid.h文件
- beego框架开发投票网站(1) beego基础之运行逻辑
- Hard lockup occurs due to an infinite loop encountered in distribute_cfs_runtime()
- mysql数据库操作常用命令_MySQL数据库操作常用命令小结
- 台式计算机提示内存不足怎么办,一招解决电脑提示内存不足-电脑内存不足怎么办...
- 首发全DIY强大微信朋友圈截图制作生成小程序源码下载点赞,评论等等
- 用产品思维写好你的简历
- 平台币继续拉升,短期仍看涨
- Python编程从入门到实践(第二版)课后习题自写代码
- 百度跳动争抢优质内容,豆瓣微博们何去何从?
- 构建自定义的wince系统
- c语言实验一,c语言实验-实验一.doc
- Android反编译工具jadx详细使用方法
- 谈谈实施数据治理时常犯的10大错误
- 剪绳子(动规、数论、贪心)
热门文章
- c++频繁读取数据会丢失_AMADA数控冲床255参数丢失故障
- mysql 插入万条数据_你向 MySQL 插入 100万 条数据用了多久?
- 简单的网站项目开发流程 .
- 无刷新,动态设置页面焦点的问题
- CSS进阶(2)—— width,height如此高深,难道你真懂得
- 这家初创公司用端到端安全保护物联网设备
- 3.格式化输出 年月日
- IOS错误---“A valid provisioning profile for this executable was not found”
- 我眼中的2011年互联网大事记
- Mybatis全局配置文件Configuration.xml详解