参考课程:算法
https://mooc.study.163.com/course/1000002012?_trace_c_p_k2_=71acf89eff5548528d3ffa68b0912f8f#/info设计模式
https://mooc.study.163.com/course/1000005000?_trace_c_p_k2_=60f72128fe6348b7ae19623592d44785#/info数组
复杂性假设每一个机器指令的执行时间是常量,而后考虑因为N变大而致使的增加速度。数据结构
时间复杂性分布式
空间复杂性函数
最坏复杂性优化
最小复杂性编码
平均复杂性设计
计算递归函数的复杂度有递归方程和定理。排序
暴力搜索
分治法
图搜索和枚举
分支界限、回溯
随机化方法
递归与迭代
顺序、并行、分布式
肯定性与非肯定性
近似求解与精确求解
量子算法
线性规划
动态规划
贪心法
启发式方法
步骤: 原始问题->划分子问题->求解子问题->合并结果。
思想:
0、入参:数据总量为T,求第N大的数
一、把数据分红k等份,每份T/k(此值要较小,便于排序)
二、对每份进行排序
三、每份取第N/k个数,做为一个集合,对这个集合取第N/k个数,此数记为M
四、把本来的T中,按照各组的第N/k个数,取出比M大的数和比M小的数,分别记为T1,T2
五、若是T1的元素数量大于N,则说明T1里的数据太多了,那么须要对T1中找第K个数;
若是T1的元素数量小于N,则说明T1里的数据太少了,那么须要在T2中找第N-K个数
递归执行。
快速排序实际也是个分治算法,每次分红两部分。若是当作一棵二叉树,每次选一个根节点,小于的在左节点,大于的在右节点,而后对左右进行递归。
快速排序的最坏状况发生在逆序时,也就是二叉树退化成了链表的时候。时间复杂度为O(n*n)
避免最坏状况的方法: 每次选数的时候用随机数,这样能够防止输入原始数组时恶意传递逆序数组。
中序:遇到节点压栈,遍历左树,左树遍历结束,弹出栈顶元素并打印,遍历右树;
先序:
后序:
彻底二叉树,用数组存放,访问用下标,父节点位置为1/2子节点位置。左儿子位置=当前位置*2,右儿子位置=当前位置*2+1
最大堆只保证父节点比子节点大,左右节点无关。
增长:加入最尾部,而后调整
删除:堆的删除用途都是删除最大/小值,也就是堆顶元素。删除后,用最后的补充,而后调整
最大堆的创建:顺序创建,从最后一个有子节点的节点开始调整,依次向上所有调整为最大堆。复杂度O(N)
哈夫曼树 就是一个断定树(决策树),但他要保证判断路径最优。又叫最优二叉树
https://mooc.study.163.com/learn/1000033001?tid=2402970002#/learn/content?type=detail&id=2403307452
建树过程,从全部树中挑两个权值最小的树,组成一个新树,用新树的权值代替以前的两个权值,再建下一个新树。
哈夫曼编码:不等长编码。把频率高的数据用短的编码,频率低的字符串用长的编码。
但要解决的问题是:二义性问题。解决二义性问题的方案是任意一个编码不能是其余编码的前缀。
保证这个的办法就是构造一个二叉树,每一个节点表明0/1,而后只有叶子节点能够存放真正的编码。
而保证最优的办法,就是这个二叉树不平衡,最频繁出现的编码的深度为最小。
而这个不平衡的二叉树,就是哈夫曼树。
他的建立过程:编码的出现频率就是其权重,而后按这个权重组成哈夫曼树。
函数调用及递归实现
深度优先搜索
回溯算法
计算机最容易计算后缀表达式,平常见到的是中缀表达式,因此第一步须要把中缀改为后缀
邻接矩阵
邻接表 -- 必定要够稀疏才合适使用
其余方法,好比非量子的坐标系。
深度优先 DFS Depth First Search :
一直走,走到头,返回,返回的过程当中,发现没走过的路,继续一直走。。。 原路返回的数据结构就是堆栈。
广度优先 BFS Breadth First Search :
取初始点,压栈,栈中取节点,获取与该节点连着的全部节点,压栈。。。
复杂地取决于数据结构,对于邻接矩阵,须要O(N*N);对于邻接表,须要O(N+E)