数据结构与算法
江河里的鱼
穷且益坚,不坠青云之志,虚心学习,虚心请教!
展开
-
leetcode:101. 对称二叉树Java实现版
给定一个二叉树,检查它是否是镜像对称的。例如,二叉树[1,2,2,3,4,4,3]是对称的。 1 / \ 2 2 / \ / \3 4 4 3但是下面这个[1,2,2,null,3,null,3]则不是镜像对称的: 1 / \ 2 2 \ \ 3 3/***本题开始的思路是找出对称的树,故采用...原创 2019-05-15 19:02:18 · 243 阅读 · 0 评论 -
DFS与BFS代码实现
利用如图用DFS与BFS来遍历package leetcode;import java.util.LinkedList;import java.util.Queue;import java.util.Stack;/** * @author 江河 * @date 2019-09-11 15:15 */public class Graph { private in...原创 2019-09-11 22:26:09 · 141 阅读 · 0 评论 -
KMP算法分析--java
应用场景-字符串匹配问题:字符串匹配问题:: 有一个字符串 str1= ""WWE QWERQW QWERQWERQWRT"",和一个子串 str2="QWERQWR" 现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1。暴力匹配算法:如果用暴力匹配的思路,并假设现在str1匹配到 i 位置,子串str2匹配到 j 位置,则有: 如...原创 2019-06-29 21:05:29 · 88 阅读 · 0 评论 -
0-1背包问题(动态规划)--Java版
动态规划算法介绍:动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法 动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。 ( 即下一个子阶段的求解是建立在...翻译 2019-06-24 17:15:53 · 432 阅读 · 0 评论 -
分治算法
分治算法介绍:分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……分治算法可以求解的一些经典问题:二分搜索 大整数乘法 棋盘覆盖 合并...翻译 2019-06-24 14:24:18 · 167 阅读 · 0 评论 -
算法时间复杂度的计算及分析
算法的时间复杂度:度量一个程序(算法)执行时间的两种方法事后统计的方法 这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素, 这种方式,要在同一台计算机的相同状态下运行,才能比较那个算法速度更快。 事前估算的方法 通过分析某个算法的时间复杂度来判断哪个算法更优。举例说明-忽略常数项: ...翻译 2019-06-24 10:48:18 · 499 阅读 · 0 评论 -
快速排序--java版本
快速排序法介绍: 快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----...原创 2019-06-24 08:51:12 · 141 阅读 · 0 评论 -
希尔排序--java版本
简单插入排序存在的问题 我们看简单的插入排序可能存在的问题.数组 arr = {2,3,4,5,6,1} 这时需要插入的数 1(最小),这样的过程是: {2,3,4,5,6,6} {2,3,4,5,5,6} {2,3,4,4,5,6} ...原创 2019-06-23 16:40:03 · 94 阅读 · 0 评论 -
2-路归并排序--java版本
1.基本思想:归并排序(Merge-Sort)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer) 策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修 补"在一起,即分而治之)。总的时间复杂度为O(nlogn),归并排序是一种比较占内存,但却效率高且稳定的算法。2.代码实现步骤;1)申...翻译 2019-06-18 15:42:49 · 249 阅读 · 0 评论 -
冒泡排序--java
冒泡排序整个过程就像气泡一样往上升,假设从小到大排序,对于给定的n个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换位置,进行一轮比较后,第n位上就是整个记录中最大的数,然后在对前n-1个记录进行第二轮比较,重复该过程直到进行比较的记录只剩下一个为止。/** * @author 江河 * @date 2019-06-18 8:26 */pu...原创 2019-06-18 08:31:27 · 121 阅读 · 0 评论 -
直接插入排序--Java版
原理:简单,给定的一组记录,将其分为两个序列组,一个为有序序列(按照顺序从小到大或者从大到小),一个为无序序列,初始时,将记录中的第一个数当成有序序列组中的一个数据,剩下其他所有数都当做是无序序列组中的数据。然后从无序序列组中的数据中(也就是从记录中的第二个数据开始)依次与有序序列中的记录进行比较,然后插入到有序序列组中合适的位置,直到无序序列组中的最后一个数据插入到有序序列组中为止。 ...原创 2019-06-16 22:12:45 · 62 阅读 · 0 评论 -
选择排序--java
原理图如下所示:先将第一个位值上的数跟之后所有位置上的数依次进行比较,如果第一个位置上的数比第二个位置上的数大,则进行互换,然后继续将第一个位置上的数与第三个位置上的数进行比较,经过一轮的比较后,第一个位值上的数就是所有数中最小的一个,接着将第二个位置上的数与之后所有位置上的数进行比较,同样的规则,第二轮比较结束后,第二位放的就是所有数中第二小的数,依次往下比,直到最后一个位置结束。按照这种方法进...转载 2019-06-16 20:08:27 · 64 阅读 · 0 评论 -
哈夫曼树(最优二叉树)Huffman的原理建立及遍历Java实现
哈夫曼树(Huffman)又称最优树,是一类带权路径长度最短的树。树的带权路径长度为树中所有叶子结点的带权路径长度之和,记为WPL。其中WPL最小的树称最优二叉树或是哈夫曼树。例子:有4个权值(1,3,5,7),利用这4个权值作为叶子结点构造二叉树。在图示的三个二叉树中:wp1 = 12+32+52+72 = 32wp2 = 13+33+52+71 = 29wp3 = 12+33+53...原创 2019-05-13 15:13:42 · 806 阅读 · 0 评论 -
算法之并查集实现代码--java版本
并查集定义就不解释了两个用途: 找有多少个集合,常用于是否有关联 找无向图是否有环 找集合的代码:package leetcode;/** * @author 江河 * @date 2019-09-13 14:51 * 是否压缩路径?? *//** * 班上有N名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B的朋友...原创 2019-09-14 21:13:41 · 85 阅读 · 0 评论