18.5.5 二叉树的删除新增查找最小最大
哈夫曼编码 排序 斐波那契数列 栈实现计算器 栈实现中序表达式转后序。
18.5.6
堆(优先队列) 散列 图论 深度优先 红黑树
18.5.26
图论算法:
{
欧拉回路:用一只笔画出不重复的线通过所有的顶点。
深度广度优先算法。
无向有向图无圈有圈图 拓扑排序
网络流问题:对应交通流量或者水管里的流水,是可以通过边来传递的
最短路径算法:dijkstra算法
最小生成树:kruskal算法、prim算法。对应房子里用最短路径铺电线。
np-完全性问题
}
18.6.28
{
树、
avl树、
二叉树、
B树、
红黑树、
伸展树
}
二叉树节点的增删操作
平衡树的初步了解
avl树的增加删除细节编写
树的常见算法题:树的深度, 树的(叶子)节点数,两个节点的最低公共节点
开始学习堆——优先队列。目前概念是主要用来计算出优先级(排序?),和树有点类似。但是不适合用来查找某个具体的值,因为需要使用线性遍历来查找。
{
二叉堆的基本操作
左式堆
斜堆
二项队列
}
堆的应用和基本操作了解。
堆的上滤和下滤的操作。
算法设计技巧:
1、分治算法
2、动态规划
3、随机化算法
4、回溯算法
5、贪婪算法 :哈法曼编码、装箱问题
17:40 - 18:10 对常用的算法设计有个大概的理解。
18:15 - 18:40 最小点对问题-分治初步理解
24:00 - 1:15 算是理解了一维的最近点
2018. 7.17
10:20 - 11:00 最近点算法
14:30 - 15:15 了解了二维的最近点距离的算法思路,还有个点不懂,为什么strip区域带中的点最多为√n
15:20 - 16:20 分治算法解决 ----求n个元素中第k个大小的值,
16:30 - 18:00 最长序列和问题 , 各种时间复杂度,n3 n2
2018. 7.18
动态规划
----------矩阵
-----------catalan 数:
17:00 -- 20:00 动态规划 ☞ 最优二叉搜索树。原问题分解为子问题,保存子问题的解,避免重复计算。
2018.8.5
11:40- 12:30 回溯算法:收费公路问题 ,自己的想法:难点在于程序的回溯实现,需要保存最开始可能的分支,
一旦一个分支走不下去就需要往回走,错误分支里数据的处理也需要回滚
19.5.8
1、二进制开关算法
n瓶毒药,最少需要使用多少只小白鼠才能知道那瓶药有毒
将n瓶药以01的形式编号,然后组合(如何组合:按照每位数值是否为1来组合)不同的药给小白鼠喝。
2、一致性hash问题(分布式一致性)
一致性hash算法解决分布式存储。
将服务器和key通过自定义的hash算法分布在0~2^32次方的圆环上,key存储在最近的一个服务器上,这样新增了一个服务器之后,相比余数分布式算法,只会影响在添加的节点到沿逆时针方向第一台服务器之间的key,影响的比较小。
通过增加虚拟节点来保证数据的分散性。
20.5.5
常见的算法:
时间复杂度和空间复杂度的解释:随着问题规模的变大,一个程序所花费的时间,或者说需要运行的次数;空间复杂度是,一个程序需要的内存大小。递归中需要保存递归栈的数据,这就需要空间。
首先是利用基本的数据机构比如栈、队列、树、堆,图论实现的一些算法,
栈可以实现计算器的+-*/的运算。还可以实现二叉树的中序遍历操作(非递归实现)。
树的一些知识,平衡二叉树,avl树的增加删除节点操作,树的左右节点的高度差最多不超过2。
队列的应用:在图的广度优先搜索非递归中实现,将图的某一个节点的所有邻接节点放到队列中,依次出队列,当遍历第一个节点的时候,再将该节点的邻接节点放到队列中,这样可以实现。
堆,也叫做优先队列。应用有堆排序。
还有一些比较常见的有意思的算法:斐波那契,汉诺塔,卡特兰数。
深度优先广度优先搜索:是对图的节点进行遍历的操作。递归。
排序算法:
1、最直观:选择排序(依次选择最大最小,两层循环,第二次循环从原来基础上+1)
经典:冒泡排序(相比选择排序,内存循环的时候两两比较直接到位,控制好内层循环)
插入排序:(将未排序的往前面已经排好的队列中比较插入,控制好内层循环)
平均效率比较好的算法:快排(基准值选择后,两边递归,难点是如何将元素分到基准值的两边(思路是这样的:循环队列和基准值进行比较,满足条件则将当前值放到自己设置的那个点),这个解决了,余下的就剩下递归了)
插入排序的改进:希尔排序(缩小增量进行插入排序,三层循环,第一层循环增量,第二次循环数据,第三次循环比较交互位置)
(效率比较好的排序)堆排序:思路是将所有的数据放到堆中,这样可以得到第一个最大的值(堆的最上面是最大值或最下值),排序的思路转化为调整堆为有序堆。巧妙。(递归的运用,构造堆时用到递归,交换位置后也需要使用递归)