
数据结构
Healist
积极向上的小年轻,努力提高的小码农
展开
-
java实现单链表操作
之前上课学的都是用C++,在这里用java把常用的数据结构实现一遍,直接上代码:public class LinkedList { private Node first; private Node last; class Node { int data; String names; Node next; public原创 2016-11-30 16:26:03 · 364 阅读 · 0 评论 -
冒泡排序(java)
对数组进行遍历,从头依次相邻的俩俩比较,根据比较结果按照自己的排序意愿进行调换,每次遍历都会将最大或者最小的元素排序到其排序后应该在的位置。最差的情况时间复杂度为O(n2),最好的情况为O(n),所以冒泡排序适合数据量小且部分数据已经经过排序了的情况。public class Bubbling { public static void main(String[] args) {原创 2017-01-22 01:50:25 · 310 阅读 · 0 评论 -
选择排序(java)
假如按照从小到大的顺序排列,先拿第一个元素a,然后将其与其它的元素一一对比如果之后的元素比a大,那么就将俩个元素的值对调,每次遍历出一个元素在其对应的位置。所以时间复杂度固定为O(n2)。public class Bubbling { public static void main(String[] args) { int data[] = {6, 5, 9, 7, 2, 8原创 2017-01-22 02:09:32 · 352 阅读 · 0 评论 -
字符串模式匹配算法(字符串搜索)
暴力求解(朴素算法)假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢?如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有: 如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符; 如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0转载 2017-02-23 11:49:53 · 840 阅读 · 0 评论 -
最大连续子序列和:动态规划经典题目
【题目】给定k个整数的序列{N1,N2,…,Nk },其任意连续子序列可表示为{ Ni, Ni+1, …, Nj },其中 1 <= i <= j <= k。最大连续子序列是所有连续子序中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{11,-4,13},最大连续子序列和即为20。【注】:为方便起见,如果所有整数均为负数,则最大子序列和为0。解转载 2017-02-23 14:42:18 · 503 阅读 · 0 评论 -
字符串的排列与组合
字符串排列根据输入的字符数组打印出该字符串中字符的所有排列,例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有abc,acb,bac,bca,cab和cba的可能排列。 结果请按字母顺序输出。 public class AllSort { public void permutation(char[] buf, int start, int end) { if (转载 2017-02-23 18:05:47 · 459 阅读 · 0 评论 -
Top k问题的讨论(三种java实现)
在很多的笔试和面试中,喜欢考察Top K.下面从自身的经验给出三种实现方式及实用范围。合并法这种方法适用于几个数组有序的情况,来求Top k。时间复杂度为O(k*m)。(m:为数组的个数).具体实现如下:/*** 已知几个递减有序的m个数组,求这几个数据前k大的数*适合采用Merge的方法,时间复杂度(O(k*m);*/import java.util.List;import java.u转载 2017-02-24 22:28:50 · 1120 阅读 · 0 评论 -
快速排序(java)
快排又被称为分割交换排序法,好像总会在面试或者笔试中做为考察点来考察,快排也是目前常见的一些排序算法中很不错的排序方法了(均衡考量平均时间运行较快,所以我想说最佳排序来着,不过怕被打脸)。快速排序关键步骤(从左往右由小到大): 1. 取一个键值K做为参照 2. 从左到右依次查找,找到一个Ki使得Ki>K 3. 从右到左依次查找,找到一个Kj使得Kjpublic class Quic原创 2017-02-06 23:19:43 · 453 阅读 · 0 评论 -
二叉树中找到俩个节点的最低公共祖先
方法一下面是一个简单的复杂度为 O(n) 的算法,解决LCA问题 1) 找到从根到n1的路径,并存储在一个向量或数组中。 2)找到从根到n2的路径,并存储在一个向量或数组中。 3) 遍历这两条路径,直到遇到一个不同的节点,则前面的那个即为最低公共祖先.方法二 (不利用额外空间,一次遍历)从root开始遍历,如果n1和n2中的任一个和root匹配,那么root就是LCA。 如果都不匹配,则分别递原创 2017-03-22 16:13:36 · 616 阅读 · 0 评论 -
求二叉树中俩个节点的的距离
二叉树中俩点距离就是俩个点的边的条数。分析假设给定的节点为node1, node2,可以分为下面两种情况:1) node1是node2的祖先节点或孩子节点,可以理解为两个节点在一条线上。 例如:Dist(2,4), Dist(6,1)2) node1 和 node2 没有直接或间接的父子关系。 例如,Dist(4,3), 他们需要一个共同的祖先节点1 连接起来。这里涉及两个节点的最低公共祖先(LCA原创 2017-03-22 16:31:57 · 1214 阅读 · 0 评论 -
最小堆JAVA(Top K问题)
Top k问题很多情况下比较常用的解决方法就是最小堆,最小堆的建立一般基于数组来模仿树的结构,左右子树和父节点都可以根据数学关系式来呈现,代码如下:public class MinHeap{ // 堆的存储结构 - 数组 private int[] data; // 将一个数组传入构造方法,并转换成一个小根堆 public MinHeap(int[] data)原创 2017-10-20 11:24:27 · 1315 阅读 · 0 评论 -
01背包——JAVA实现
简单的动态规划输入一个n,表示有n道题,接下来的n个表示每道题的分数,再接下来的n个表示每道题的花费时间,最后输入考试总时间长度。(每道题都能做上)输出:该场考试能获得的最高分数public class Score { public static void main(String[] args) { Scanner sc = new Scanner(Syst原创 2017-09-26 21:07:23 · 789 阅读 · 0 评论 -
八皇后问题——堆栈的应用
八皇后问题也是堆栈的典型应用场景,里面也涉及递归的使用,简单来说就是皇后棋子可以吃掉横竖方向和对角斜方向的其它皇后棋子,棋盘是8X8大小且下八个棋子的就是八皇后(以此类推)解题思路就是可以每一行(或每一列)依次放一个棋子,之后在下一行(或下一列)再放棋子的时候需要比较之前已经放了的棋子是否会有冲突(被其他皇后攻击),依次放棋子直至完成八个棋子的存放就是一种解决方案。上代码,我这里是按照行的顺序依次放原创 2017-01-21 22:48:09 · 1221 阅读 · 0 评论 -
深度优先遍历DFS 与 广度优先遍历BFS(java实现)
图的遍历方式有俩种: 深度优先遍历(DFS) 广度优先遍历(BFS) (1)深度优先遍历(利用栈和递归来实现) 思路:先以一个点为起点,这里假如是点A,那么就将A相邻的点放入堆栈,然后在栈中再取出栈顶的顶点元素(假如是点B),再将B相邻的且没有访问过的点放入栈中,不断这样重复操作直至栈中元素清空。这个时候你每次从栈中取出的元素就是你依次访问的点,以此实现遍历。class Nod原创 2017-01-21 19:40:02 · 5518 阅读 · 0 评论 -
平衡二叉树的变形——红黑树(JAVA)
上一个博客中平衡二叉树(AVL)对平衡度要求还是蛮高的,而红黑树就是相对来说放弃了高标准的平衡退而求其次的大致平衡,所以复杂度与AVL差不多,不过效率更高了一些。优秀参考博客: 红黑树-JAVA实现 红黑树深入剖析及Java实现 浅谈算法和数据结构: 九 平衡查找树之红黑树下面是一个相对干练的一种实现,实现put 和 search操作public class RedBlackTreePract转载 2017-02-10 22:11:11 · 555 阅读 · 0 评论 -
java实现双向链表操作
跟单向一个路子,没啥可说的,直接上代码:public class DoubleLink { public Node first; public Node last; class Node { int data; Node lnext; Node rnext; public Node(int data) {原创 2016-11-30 22:12:48 · 404 阅读 · 0 评论 -
java实现堆栈
堆栈就是先进后出的容器,好比一个杯子一样,下面用java来实现出来:(其实用数组也可以模拟栈的实现,一个初始大小的数组,push和pop操作完全可以按照你的逻辑控制来进行压栈和弹栈,用一个int类型的变量做栈顶的索引值就好了,数组中所谓的弹栈其实就是索引值减小一个,然后不管被弹出的那个数组元素了)数组来模仿实现,有个弊端就是初始有个大小限制,并不能动态增大或减小容量,所以我们来看一下链表的堆栈实现:原创 2016-11-30 22:52:40 · 1857 阅读 · 0 评论 -
汉诺塔问题
经典的递归解决方案,汉诺塔问题请自行百度查询,这里不做叙述,直接上代码:public class Hanoi { public static void hanoi(int n, int p1, int p2, int p3) { if(n == 1){ System.out.println("盘子从 "+ p1 + " 移到" + p3);原创 2016-12-01 16:15:02 · 282 阅读 · 0 评论 -
java简单的迷宫问题——堆栈的应用
这里说一下简单的迷宫问题,老鼠如何在迷宫中起点走到终点,一个二位数组MAZE[][]表示迷宫,MAZE[i][j]=1表示此处有墙,MAZE[i][j]=0表示无墙(可以通过),老鼠走过的路线就将其对应值设置为2,这里提供了一个起点(1,1)和终点(8,10),数组内容如下: 上代码!(这里其实没什么智能性,就像是无头苍蝇一样一直撞到出口)记录老鼠走过的路径public class TraceRe原创 2016-12-02 21:27:29 · 1285 阅读 · 0 评论 -
常见的查找算法(顺序、二分、插值、斐波那契查找,哈希查找)
顺序查找、二分查找(非递归)、二分查找(递归)、插值查找:public class Search { int SequenceSearch(int[] arr, int value) { for(int i=0; i<arr.length; i++) { if(arr[i] == value) { return i;转载 2017-02-07 23:05:07 · 1017 阅读 · 0 评论 -
算术表达式求解——堆栈的应用
算术表达式的求值也是栈的典型应用场景,通常求值方法分为以下三种: 中序法 (eg:2+3) 前序法 (eg:+23) 后序法 (eg:23+) 下面分别介绍一下如何运用栈来实现这三种求值中序求值:(1)在读取表达式的时候建立俩个栈分别存放运算符和操作数(2)在读取过程中若读取到运算符,必须与运算符栈顶的运算符比较优先级,若栈顶的优先级更高,则先计算堆栈的运算符的值。(3原创 2017-01-20 16:48:57 · 899 阅读 · 0 评论 -
平衡二叉查找树(JAVA)
之前我分享过二叉查找树(也叫二叉排序树)的BST博客二叉排序树 与 平衡二叉排序树俩者官方定义二叉排序树定义就是(1)任何节点的左节点值都比当前根节点值小。(2)所有右节点值都比当前根节点值大。 (3)且所有子树也都是二叉排序树。平衡二叉排序树定义(1)首先整体为二叉查找树。(2)左子树与右子树的深度之差的绝对值小于或等于1。 (3),左右子树也是平衡二叉查找树。我们有了二叉排序树为什么我们还需要原创 2017-02-10 16:51:26 · 1093 阅读 · 0 评论 -
二叉树的遍历(java)
二叉树的遍历分为中序,前序,后序;就是利用函数递归来实现的遍历,没啥好说的,直接上代码:class TreeNode { int value; TreeNode left_node; TreeNode right_node; public TreeNode(int value) { this.value = value; this.le原创 2017-01-20 18:05:55 · 359 阅读 · 0 评论 -
二叉排序树(java)
上一篇的二叉树遍历中代码其实我就是二叉排序树的写法,所谓二叉排序树基于树根为准,小于树根则置于左子树,大于树根置于右子树依次递归到结束。class TreeNode { int value; TreeNode left_node; TreeNode right_node; public TreeNode(int value) { this.value原创 2017-01-20 19:39:24 · 524 阅读 · 0 评论 -
二叉搜索树(java)
二叉搜索树可以算是基于二叉排序树的,差别在于其中有个查找(其实也就是递归遍历),所以可以说跟二叉排序是基本一致的。上代码:class TreeNode { int value; TreeNode left_node; TreeNode right_node; public TreeNode(int value) { this.value = value原创 2017-01-20 20:10:05 · 264 阅读 · 0 评论 -
图的表示(java)
图的表示常见到的有: 相邻矩阵法 相邻表法 (1)相邻矩阵法 有多少个顶点(n)就用多少长度的二维数组(arr[n][n])来表示图,某个点arr[x][y]值为1则表示对应顶点有边存在,为0则表示对应顶点无边存在。 一个简单的例子展示:public class NeighburArr { public static void main(String[] args)原创 2017-01-21 00:12:45 · 2899 阅读 · 1 评论 -
(很大长度字符串)判断是否有公共子串
判断是否有公共子串是很简单的问题,暴力遍历应该可以解决的,但是在OJ上大长度的字符串会超出题目的时间效率限制。这里简单记录一下判断公共字串的一种相对巧妙的方式,利用二维数组存储所有字母的邻接可能(这里假设都是小写字母) public boolean isCommonStr(String a, String b) { boolean[][] mark = new b...原创 2018-03-17 11:55:57 · 624 阅读 · 0 评论