集训二十天算法回顾.
这二十天学到了什么?猛然一想好像确实也没什么。但细细一想,在这不知不觉中确实也学到了很多东西。能数出来的就挺多了,还有那些潜在意识中的学习,可以说是收获颇多啊。在这里感谢师兄们。
能数出来的算法有,并查集,深搜,广搜,最短路径(floyd,dijkstral),最小生成树(kruskal,prim),素数筛选法,最大子串,拓扑排序,排序(冒泡,插入,堆排序,快速排序,希尔排序)。
最开始学习的是并查集,我印象比较深刻,并查集大概讲的是,在一堆数据中,数据可能用某种共性,在一堆数据中可能可以分为几个不同的集合,这些集合中的数据是具有不同的共性的。
并查集可以用来解决求连通分支数的问题。既然可以求连通分支数这也可以求一个图中最少需要几条边可以变成一个连通图,将这个问题实际化,就可以解决一些交通网,电话线....的联通问题。
深度优先搜索,是图论里面一种很重要的算法。深度优先搜索的大概过程是,找到一个点,一直不断的向下遍历,直到无法遍历,然后回塑到起点,选择没走过的点继续遍历这个图。如何判断有没有走过这就需要一个技巧,就是标记数组。深度优先搜索的算法是用递归来进行写的,由于在进行深度遍历的过程中每一步都是一样的,可以使用递归。最后进行回溯,这也符合递归。深度搜索算法,可以创建一颗解空间树,去穷举问题的各种可能,从而达到解决问题的目的。深度优先帮助我们可以图中找到想要查询的路径。还有可以应用在一些社交平台上进行好友的查找。
广度优先搜索,也是图论中的一种很重要的算法。它和深度优先搜索都是对图进行遍历,但是不一样的是,广度优先搜索是对与当前结点所有相连的结点进行遍历。进行遍历的同时这些结点挨个挨个的进入一个队列。等到与当前结点所有的点遍历完成后,再从队列中得到队头,继续对这个队头进行四周的遍历,一直这样知道队列为空,即表示广度搜索对图的遍历完成。
最短路径学了两种算法,一种是dijkstral,地杰斯特拉被称为单源最短路径算法,闻其名知其意,我们要知道一个起始点,才能算到这个起始点到这幅图各个节点的最短路径。
floyd:Floyd运用到了局部最优解的思想,在运用三层循环一直不断选定一个点k,不断的对图内所有的点进行松弛操作,一旦松弛操作找到一条最优解就将其覆盖,这里运用到了动态规划。
在三重循环中,最外层是得到一个松弛点K,可以看到k点的取值是0—>n(n为图的结点数),所以所有的点都要成为一次松弛点,内层循环是得到两个点i,j. Dis[i][j]为i,j两个点之间的距离。(当然一开始将所有的点都进行初始化,INF=0x3fffffff,在进行输入数据之前所有的点都默认为无穷大,即两点之间没有边。)在执行完三重循环后可以得到任意两点间的最优路径(局部最优解,所以组成的整体也是最优的),所以Floyd可以得到图中任意两点间的最短路径。(这里有点难理解,但是事实就是这样,有的事情是比较难以明白的,有的算法难以理解很透彻的所以留下点印象或者感觉就行了)。 floyd可以得到图内任何两点的最优解。这是它相对于dijstra的一个优点,但是floyd用了三重循环遍历了所有的点,所有时间复杂度上会高于dijstra.对于最短路径的问题在解决不同的问题上可以选择这两种算法,看更倾向于哪一种更优。

浙公网安备 33010602011771号