算法:
之前博主里转载了一篇非常详细的java十大排序的算法,里面包含了动图,代码和复杂度分析。
https://blog.youkuaiyun.com/delete_bug/article/details/106156040
冒泡
选择
插入
希尔
归并
快速
堆排序
计数排序
桶排序
基数排序
接下来是介绍几种高级算法
1 剪枝算法
在搜索算法中优化中,剪枝,就是通过某种判断,避免一些不必要的遍历过程,形象的说,就是剪去了搜索树中的某些“枝条”,故称剪枝。应用剪枝优化的核心问题是设计剪枝判断方法,即确定哪些枝条应当舍弃,哪些枝条应当保留的方法。
总之,剪枝策略,属于算法优化范畴;通常应用在DFS 和 BFS 搜索算法中;剪枝策略就是寻找过滤条件,提前减少不必要的搜索路径。
1.1剪枝的原则
1) 正确性
正如上文所述,枝条不是爱剪就能剪的. 如果随便剪枝,把带有最优解的那一分支也剪掉了的话,剪枝也就失去了意义. 所以,剪枝的前提是一定要保证不丢失正确的结果
2)准确性
在保证了正确性的基础上,我们应该根据具体问题具体分析,采用合适的判断手段,使不包含最优解的枝条尽可能多的被剪去,以达到程序“最优化”的目的. 可以说,剪枝的准确性,是衡量一个优化算法好坏的标准.
3)高效性
设计优化程序的根本目的,是要减少搜索的次数,使程序运行的时间减少. 但为了使搜索次数尽可能的减少,我们又必须花工夫设计出一个准确性较高的优化算法,而当算法的准确性升高,其判断的次数必定增多,从而又导致耗时的增多,这便引出了矛盾. 因此,如何在优化与效率之间寻找一个平衡点,使得程序的时间复杂度尽可能降低,同样是非常重要的. 倘若一个剪枝的判断效果非常好,但是它却需要耗费大量的时间来判断、比较,结果整个程序运行起来也跟没有优化过的没什么区别,这样就太得不偿失了.
对剪枝算法讲的非常透彻的一个视频,因为有些博客描述的不是很好,博主没有找到好一点的博客,所以推荐这个视频:
https://www.bilibili.com/video/BV1Bf4y11758?from=search&seid=14771482401397576676
2 回溯算法
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。
3最短路径算法
从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径。解决最短路的问题有以下算法,Dijkstra 算法,Bellman-Ford 算法,Floyd 算法和 SPFA算法等。
这是单源路劲算法:它求出的是一条路径
Dijkstra 算法
单是有时候需要求图中任意两节点之间的距离 ------->Floyd(费罗伊德)算法
文章的话再上边那篇里有,第一次学还是先看一下视频,比较好理解,这个算法比较难一点,我也就看了一百遍
https://www.bilibili.com/video/BV1LE411R7CS?from=search&seid=14785761868390793110
最主要的思想就是找中间点,最后更新好两个矩阵以后也是以中间点的思想取遍历图的,如果还是不懂可以私信作者,我们一起交流
SPFA算法:这个算法写的还是比价简单的,容易理解
https://blog.youkuaiyun.com/qq_35644234/article/details/61614581
64最小生成树算法–(Kruskal 和prim)
https://www.bilibili.com/video/BV1Eb41177d1?from=search&seid=2252166645685418420
在组织图的过程中避免掉环
每次更新表,扫描表,比较替换。
数据结构
散列表(哈希表)
红黑树
https://www.cnblogs.com/skywang12345/p/3245399.html
为什么不使用AVL树而使用红黑树?
红黑树和AVL树都是最常用的平衡二叉搜索树,它们的查找、删除、修改都是O(lgn) time
AVL树和红黑树有几点比较和区别:
(1)AVL树是更加严格的平衡,因此可以提供更快的查找速度,一般读取查找密集型任务,适用AVL树。
(2)红黑树更适合于插入修改密集型任务。
(3)通常,AVL树的旋转比红黑树的旋转更加难以平衡和调试。
B树
https://blog.youkuaiyun.com/c395565746c/article/details/6545106