
数据结构java实现
ppp11
在校大学生 在湖南工业大学
展开
-
0-1背包,完全背包,多重背包问题
今天看到背包问题。特记录下整理下自己的理解。方便以后查阅自己算法的理解。 看背包问题,主要是它是用到动态规划,动态规划是能把问题划分为子问题。也就是状态转移方程。更多了动态规划,查看其他的博客或者文档。 问题描述:一个背包的总容量为V,现在有N类物品,第i类物品的重量为weight[i],价值为value[i]那么往该背包里装东西,怎样装才能使得最终包内物品的总价值...原创 2019-11-01 15:19:13 · 240 阅读 · 0 评论 -
算法-并查集
算法: 并查集是一种树型的数据结构,用于处理一些不交集的合并及查询问题。解决动态联通性一类问题的一种算法。 有makeSet方法 : 设置单元素集合 Find: 确定元素属于哪一个子集。这个方法是不断的向上查找父亲节点,直到根节点为止。 Union: 将两个子集合并成同一个集合。Union下图Find(D)返回A,Find(F)返回A...原创 2019-10-12 18:44:20 · 236 阅读 · 0 评论 -
求滑动窗口中最大的值
题目:给定一个数组nums,有一个滑动大小为k的窗口从左往右滑动。每一次走一步,求窗口中最大的值。分享三种思路:1.是暴力解法 每次滑动窗口,遍历窗口中k个数的最大值。public int[] maxSlidingWindow(int[] nums, int k) { if (nums == null || nums.length == 0) { ret...原创 2019-10-05 19:31:35 · 201 阅读 · 0 评论 -
图的结构,java实现
//结点,按照有向图完整定义public class Node{ public int value; public int in; //入度 public int out; //出度 public ArrayList<Node> nexts; public ArrayList<Edge> edges; public...原创 2019-09-29 11:08:39 · 172 阅读 · 0 评论 -
图的深度优先遍历和广度优先遍历
图在数据结构中是很重要的一部分。通过不同的遍历方法,得到不同的遍历结果。图的遍历可以分为两种,深度优先遍历和广度优先遍历。图的表示可是链表也可以是矩阵。链表:是结点和边的组合矩阵是二维数组:a[i][j]表示i结点到j结点是否连通图可分为有向图和无向连通图。今天介绍无向连通图的两种遍历方法(java实现):图的定义://结点,按照有向图完整定义pu...原创 2019-09-29 11:07:42 · 505 阅读 · 0 评论 -
二叉树之完全二叉树
1.完全二叉树定义:除了空树外,树的高度差不超过1,如果叶子节点不全,则都在左边。如下图:图1是完全二叉树,图2,3不是完全二叉树public booelan isCBT(Node head){ if(head == null){ return true; } Queue<Node> q = new LinkedList&...原创 2019-09-26 08:39:38 · 199 阅读 · 0 评论 -
二叉树之搜索二叉树
1,搜索二叉树 定义:当前节点大于左子树节点和小于右子树节点的二叉树是搜索二叉树。 优势就是,查找的时间复杂度是log(n)根据二叉搜索树的性质,它的中序遍历,得到的值应该是有序的。2.代码实现判断二叉树是否是搜索二叉树 中序遍历实现public class Node { public int value; public Node left; ...原创 2019-09-25 13:40:59 · 125 阅读 · 0 评论 -
二叉树介绍和前序,中序,后序的递归和非递归遍历
什么是二叉树: 二叉树是每个结点最多有两个结点的树结构。如下就是一颗树结构。二叉树可以做什么: 用的最多的是二叉平衡树,有种特殊的二叉平衡树就是红黑树,Java集合中的TreeSet和TreeMap,C++STL中的set,map以及LInux虚拟内存的管理,都是通过红黑树去实现的,还有哈弗曼树编码方面的应用,以及B-Tree,B+-Tree在文件系统中的应用。当然二叉...原创 2019-09-24 10:16:04 · 298 阅读 · 0 评论 -
之字形打印矩阵
给一个矩阵之字形打印输出:如下矩阵{ { 1, 2, 3, 4 },{ 5, 6, 7, 8 },{ 9, 10, 11, 12 } };输出的顺序是:自己编程实现:private static void printZigZagMatrix(int[][] matrix) {//x1,y1,是矩阵中数字的坐标。 int x1 = 0; int y1 = ...原创 2019-09-17 09:48:50 · 139 阅读 · 0 评论 -
求top N算法
求topN在大数据中很常见,主要思路有三种: 1.先排序,在遍历出最大或最小的N个 2.通过大小堆,维持一个N个大小的堆,每次和堆顶元素比较,在堆化 3.中位数的中位数算法BFPRT,第一种,先排序,排序算法有很多,冒泡排序,快速排序等。时间复杂度是 O(n*log n),这里不详讲。第二种,用大小堆,维持一个大小堆,元素个...原创 2019-09-10 15:17:26 · 1785 阅读 · 0 评论 -
求回文字符串
回文字符串是正反读都一样。本文是求字符串最长回文字符串我有两种思路: 1.从当前字符开始,两个索引一个向后,一个向前,比较字符。这有分为两种情况,一个是回文字符串长度为偶数,一个是回文字符串长度为奇数。比如 "abba","aba",偶数个时中心在字符bb中间,奇数个时在b位置。因此需要考虑两种情况。遍历时,那种情况的回文字符串长度大就返回那个回文字符串。 2.通过...原创 2019-09-10 13:24:26 · 243 阅读 · 0 评论 -
KMP算法,求二叉树是否是子树
KMP算法是高效的字符串比较算法, 二叉树是有左右两个子节点的特殊结构,像树的叶子一样。 问题是给定两个二叉树,求二叉树是否是另一个二叉树的子树。 一种可行的思路是: 把二叉树序列化为字符串,在比较两个字符串,如果字符串在另一个字符串中匹配了,那么说明这个二叉树是另一个二叉树的子树。两个字符串比较用的kmp算法...原创 2019-09-10 10:38:44 · 252 阅读 · 0 评论 -
字符串匹配之KMP算法
给定一个字符串和一个文本,在文本中找出这个字符串的位置。最直接的解法是暴力遍历字符串。时间复杂度是o(n*m)暴力解法: 字符串,文本从头开始一个一个字符串匹配,当字符串中和文本中字符不匹配,开始回溯到文本这一个开始比较位置的下一个字符和字符串开始字符串比较。知道遍历完文本,或者找出匹配的位置。暴力解法时间复杂度高。下面介绍字符串匹配KMP算法。 KMP...原创 2019-09-09 16:45:03 · 128 阅读 · 0 评论 -
八皇后的递归回溯求一个解和全解
什么是八皇后问题? 八皇后问题是一个古老的问题,于1848年由一位国际象棋棋手提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。在计算机程序上用递归回溯求解: 递归回溯本质上是一种枚举法,这种方法从棋盘的第一行开始尝试摆放皇后,如果摆放成功,就换下一行,如果当前位置摆放不成功,就向后移动一格能否摆放。如此反复,直到棋牌的八行...原创 2018-02-26 22:19:21 · 516 阅读 · 0 评论 -
求最大子序列的乘积
最大子序列的乘积,两种方法:1.方法一的时间复杂度为O(n^2),这个方法是通过循环遍历所有的子序列。public static int maxSubMulti(int[] a){ int maxsub = 0; int minsub = 0; for(int i = 0 ; i < a.length ; i++){ int te原创 2017-09-18 23:21:54 · 799 阅读 · 0 评论 -
生成前N个整数的一个随机置换java实现
这个问题数据结构与算法分析java语言描述版,第二章的2.8课后习题的。下面我的三种不同的实现:随机数生成函数 public static int randInt(int i, int j) { int temp = (int) (Math.random() * j + i); return temp; }1.时间复杂度为O(n^2) public原创 2017-09-15 16:48:44 · 720 阅读 · 0 评论 -
求最小正序列的和java实现
1.时间复杂度是O(n^2)public static int minPosSubSum(int[] a) { int thissum = 0; int minsum = 0; for(int i = 0 ; i < a.length ; i++){ if(a[i] > 0){ minsum =原创 2017-09-15 16:36:23 · 385 阅读 · 1 评论 -
求两个数的公因数的两种方法java实现
1.方法一是,循环取余计算 public static int gcd(int a,int b){ while(b != 0){ int temp = a % b; a = b; b = temp; } return a; }2.方法二,递归实现。 public s原创 2017-09-15 16:05:32 · 5065 阅读 · 1 评论 -
最大子序列和的四种不同复杂度实现
1.最差的时间复杂度实现O(n^3)public static int worst(int [] a){ int maxSum = 0; for(int i = 0 ; i < a.length ; i++){ for(int j = i ; j < a.length ; j++){ int thissum = 0;原创 2017-09-15 15:59:43 · 388 阅读 · 0 评论