java算法导图

时间:2023-02-24 09:57:47


java算法导图

java算法导图

 

算法的时间复杂度

java算法导图

java算法导图

算法复杂度分析

java算法导图

java算法导图

n=10,nlogn要比n^2快速6000倍,nlogn处理一天,n^2要处理15年。

 

算法思想

java算法导图

 

基础算法

-数组排序算法

选择排序

复杂度o(n^2),首先整个范围内找到最小的,将最小的与第一个位置交换,然后找剩下部分最小的元素,放在和当前还没有排序的第一个位置交换位置。

java算法导图

java算法导图

java算法导图

插入排序

复杂度o(n^2),把当前元素插入到前面合适的位置,前面的元素都是已经排好序的元素

java算法导图

java算法导图

java算法导图

java算法导图

 

归并排序

复杂度o(nlogn)归并排序首先将数组分成一半,然后把左边的数组与右边的数组排序,然后归并在一起。

使用递归实现自顶向下的归并排序

java算法导图

如果分到一定的细度,每一部分只有一个元素,此时不用排序进行简单的归并就可以了

归并到上一个层级再进行归并,归并到更高的层级,逐层的归并

java算法导图

java算法导图

归并过程使用3个索引进行跟踪

蓝色的箭头最终归并的过程中需要跟踪的位置

java算法导图

比较,把更小的放在蓝色箭头的位置

java算法导图

java算法导图

 

使用自底向上的归并排序

两个元素一组

java算法导图

分成4个元素一组

java算法导图

 

-快速排序

快速排序每次从当前考虑的数组选择一个元素,以当前元素为基点挪到排好序应该在的位置

java算法导图

然后了再对4之前所有小于4的元素与4之后所有大于4的元素分别继续使用快速排序,逐步递归下去完成快速排序。

如何把4挪到正确的位置上,以数组的第一个元素作为标记点,逐渐遍历右边所有没有访问的元素,逐渐整理一部分小于v一部分大于v,找到分界点。

java算法导图

 

 

-查找表算法

-查找问题

 

java算法导图

 

-链表算法

翻转链表,节点的值不变,节点所指向的next变了。

java算法导图

在链表中删除或者添加节点

java算法导图

 

 

-二叉树与递归算法

二叉树的递归结构,递归的终止条件与定义递归问题

java算法导图

java算法导图

二叉树的前中后序遍历

java算法导图

二分搜索树的基本操作

java算法导图

 

 

-队列算法问题

广度优先问题

树结构是图结构的特殊形式

树-层序遍历

java算法导图

图-无权图中的最短路径问题

 

-图算法问题

图的遍历

-深度优先遍历

深度优先就是从一个节点开始不停的往下试直到试不下去为止,图与树的不同,树往下走一定有走不下去的情况。、

图存在环要记录每一个点是否遍历过,如果遍历过下面遍历不需要走了。

java算法导图

一次深度遍历可以将整个图中所有的节点都遍历一遍了,可以获得图中的联通分量,也可以获得路径。

 

广度优先遍历

一次将图中所有的相邻节点遍历,之后再去遍历相邻节点的相邻节点,使用队列作为辅助的数据结构.

将0的相邻节点1,2,5,6,放入队列完成相应的一次操作

java算法导图

将队列首拿出来作为遍历的对象,已经加入过队列虽然没有遍历过也不用再次遍历了

java算法导图

以距离起始节点0的距离为顺序遍历的

 

最小生成树

Kruskal算法

每次取出还没有考虑的边中最短的那条边,把边加入图中是否会形成环,如果不能形成环就是最小生成树中的一条边

java算法导图

 

最短路径

路径规划问题寻找选择耗费最低的路径

无权图的最短路径-广度优先遍历

有权图的最短路径-松弛操作

java算法导图

Dijkstra算法

不能有负权的边,首先将起点标示讲起点所有的临边进行标示,找到没有访问的节点能够以最短的方式到达的顶点就是最短路径中的从原点到访问节点的最短路径。

然后从访问到的节点到其他节点寻找路径更加短的路径(松弛操作)

java算法导图

然后寻找还没有找到最短路径的顶点最短路径能抵达的顶点是1,只要3个距离,然后以1为顶点继续松弛操作。

java算法导图

Bellman-Ford算法

处理负权边。如果一个图拥有负权环就没有最短路径了。

如果一个图没有负权环,从一点到另外一点的最短路径,最多经过所有的V个顶点,有V-1条边,否则存在经过顶点两次既存在负权环。

经过两次松弛操作查看有没又一条只有两条边的路径使得最终总路径的权值最小。

java算法导图

 

 

-递归与回溯法

-树形问题,多种字母的组合

java算法导图

 

-回溯问题

递归调用寻找答案的过程中的重要特征就是回溯,沿着一条路径寻找答案,一旦到底要返回继续寻找

回溯一般用于查找某个解,回溯法是暴力解法的一个主要实现的手段。

排列问题

回溯法解决排列问题(典型的树形问题)

java算法导图

 

组合问题

回溯法解决组合问题

在1,2,3,4个元素中选出两个元素所有组成的可能 C2 4,与排列问题不同的是组合问题不注重顺序[1,2]与[2,1]是一样的

java算法导图

 

二维平面的回溯法

二维平面的递归结构

java算法导图

 

二维平面深度优先的遍历

寻找多个岛屿,从(0,0)开始遍历,整个遍历与(0,0)相连接的岛屿下次遍历就不会重复。

第二次继续从与(0,0)相连的(0,2)继续遍历,如果已经标记过的则不再遍历(考虑结束退回上一个节点),如果没有标记则继续从新的节点开始继续执行遍历。

java算法导图

 

-动态规划算法

与递归的对比,递归是自上而下的解决问题,没有从最基本的问题考虑出发,假设基本的问题已经解决了

斐波那契数列通过递归定义得到递归函数

java算法导图

假设已经解出n-1与n-2的斐波那契数了,求第n个数就是把n-1个数与n-2个数加在一起

递归中会有多次的重复计算

java算法导图

 

动态规划自下而上的思考问题

java算法导图

先解决小数据量下的问题,然后层层递推对于更大的数据量的结果是什么

java算法导图

大多数动态规划本质就是递归的问题,递归的过程中会有重叠子问题

 

-贪心算法

贪心算法尝试将最大的值去满足最贪心的数据,每次尝试都优先使用当前剩下最大的值,最大程度的满足更多贪心的值的原则

java算法导图