轻松学算法
文章平均质量分 64
三名狂客
success without applause,diligence without reward!Becoming、Cognifying、Flowing、Screening、Accessing、Sharing、Filtering、Remixing、Interacting、Tracking、Questioning、Beginning.
展开
-
汉诺塔的递归实现
递归实现汉诺塔问题:package com.threetop.www;/** * 递归解汉诺塔问题 * @author wjgs * */public class HanoiTest { public static void hanoi(int n,char A,char B,char C) { if(n==1) { m原创 2017-04-14 16:54:24 · 428 阅读 · 0 评论 -
链表
链表是一种物理上非连续、非顺序的存储结构,数据元素之间的顺序是通过每个元素的指针关联的。 链表有一系列节点组成,每个节点一般至少会包含两部分的信息:(1)元素数据 (2)指向下一个元素的指针 链表分类: (1)单向链表和双向链表 (2)静态链表(数组实现) 、动态链表(指针) 链表的操作: 创建、插入、删除、输出 链表的特点原创 2017-04-14 16:21:17 · 6568 阅读 · 4 评论 -
查找---分块查找
分块查找要求把一个数据分为若干块,每一块里面的元素可以是无序的,但是块与块之间的元素需要是有序的。(对于一个非递减的数列来说,第i块中的每个元素一定比第i-1块中的任意元素大) 分块查找的实现代码如下:package com.threeTop.www;import java.util.ArrayList;/*** * 分块查找的实现 * @author wjgs *原创 2017-04-18 18:44:33 · 5630 阅读 · 2 评论 -
队列
队列就是一个队伍,由一段连续的存储空间组成,是满足先进先出的数据结构。 队列是一种受限的数据结构,插入操作只能从一端操作,这一端叫做对尾;而移除操作也只能从另一端操作,这一端叫做队头。 队列的实现方式: (1)数组: 顺序队列、循环队列 (2)链表 队列的适用场景: 缓冲器、解耦 队列原创 2017-04-14 10:06:45 · 313 阅读 · 0 评论 -
查找---行列递增的矩阵查找
有一个m行n列的矩阵,在程序中我们可以使用二维数组来表示,而这个矩阵的每一行是递增的,每一列也是递增的,这种行和列分别递增的结构叫作杨氏矩阵。 举个例子如下: 直接定位查找法: 通过杨氏矩阵查询代码如下:package com.threeTop.www;/** * 通过杨氏矩阵查找元素 * @author wjgs * */public clas原创 2017-04-18 12:09:40 · 682 阅读 · 0 评论 -
栈
栈(堆栈)是一种先进后出的线性数据结构,一般使用一段连续的空间进行存储,通常预先分配一个长度,可以简单地使用数组去实现。 栈的适用场景: (1)逆序输出 (2)语法检查,符号成对出现 (3)数制转换 栈的 java 实现:package com.threetop.www;import java.util.A原创 2017-04-13 20:50:25 · 338 阅读 · 0 评论 -
数组、集合和散列表
数组:把有限个数据类型一样的元素按顺序放在一起,用一个变量命名,然后通过编号可以按顺序访问指定位置的元素的一个有序集合。 集合:(动态数组) 可变长度的列表。 (1) 列表: 有序的的集合, 链表、队列、栈等 (2) 集: 一般无序,不重复的数据 (3)多重集: 一原创 2017-04-13 15:34:32 · 435 阅读 · 0 评论 -
查找--二分查找
二分查找(折半查找)要求:(1)数列有序 (2)数列使用顺序存储结构(比如数组) 二分查找的递归和非递归的实现:package com.threeTop.www;import java.util.Arrays;/** * 递归和非递归实现的二分查找 * @author wjgs *原创 2017-04-17 22:22:51 · 315 阅读 · 0 评论 -
排序算法---快速排序
快速排序是对冒泡排序的改进,通过一趟排序将要排序的数据分割成独立的两个部分,其中一部分的所有数据比另一个部分的所有数据要小,再按照这种方法递归进行,使得整个数据变成有序序列。 快速排序有一个比较简单的解法--递归,具体的实现代码如下:package com.threeTop.www;/** * 快速排序的递归实现 * @author wjgs *原创 2017-04-15 22:01:24 · 430 阅读 · 0 评论 -
判断字符串包含的问题
有两个字符串str1和str2,假设str1比str2长,求str2中的所有字符是否被字符串str1包含,即str2是否是str1的真子集。 (1)用散列表进行实现 即把str1中的所有字符放入散列表中,然后依次判断str2中的每个字符是否在散列表中存在,其时间复杂度为O(n+m)。其实现的代码如下:package com.threeTop.www;import原创 2017-05-02 09:32:11 · 573 阅读 · 0 评论 -
堆
堆是一种特殊的数据结构,是一种特殊形式的完全二叉树。 堆分为:(1)大顶堆,大顶堆中每个节点的值都不大于其父节点的值 (2)小顶堆,小顶堆中每个节点的值都不小于其父节点的值 堆分为二项式堆、斐波那契堆、二叉堆(完全二叉堆)。 堆本身就是完全二叉树,可以使用一个一维数组,0位置用来存储元素的个数,1-n用来存储元素。原创 2017-04-21 15:35:51 · 363 阅读 · 0 评论 -
堆排序
堆排序就是对数组进行初始化堆、依次插入元素和删除元素的操作。堆排序很适合对大量的数据进行排序,总的时间复杂度为O(nlogn). 堆排序的实现代码如下: /** * 堆排序的实现 * */ public void sort() { if(isEmpty()) { throw new Run原创 2017-04-21 15:58:08 · 299 阅读 · 0 评论 -
哈夫曼树
哈夫曼树的构建步骤: (1)将每个数据作为一棵只有树根的树,组成一个森林。 (2)将树的带权路径的长度进行从小到大排序。 (3)选择权值最小的两棵树进行合并,新生成的节点为两棵树的权值之和。 (4)重复第2,3步,直到最终的森林中只有一棵树为止。 哈夫曼树的具体应用: 哈夫曼编码.原创 2017-04-21 13:51:49 · 563 阅读 · 0 评论 -
B-树、B+树、B*树
一棵m阶B-树(B树)是一棵平衡的m-路查找树,它或者是一棵空树,或者满足如下条件: (1)根节点至少有两个子节点(除非这棵树只有自己一个根节点) (2)除根节点和叶子节点外,所有节点至少有m/2个子节点 (3)所有叶节点都在同一层。 如果m等于2,则它是一棵满二叉树。翻译 2017-04-21 09:57:01 · 659 阅读 · 0 评论 -
求最大子矩阵的和
求最大子矩阵的和:实现代码如下package com.threeTop.www;public class MaxSumMatrix { /** * 获取矩阵的最大和子矩阵 * @param matrix * @return */ public static int maxSumSubMatrix(int [][]matrix) { int[][]total原创 2017-05-03 15:59:25 · 650 阅读 · 0 评论 -
找出连加值最大的子数组
数组中连续的一部分称为原数组的子数组。比如3、-6、1、2、3、-1、2、-5、1、2,这个数组的的最大子数组就是1、2、3、-1、2。 实现代码如下:package com.threeTop.www;/** * 动态规划法 * @author wjgs * */public class MaxSumSubArray { /** * 动态规划求最大子数组 *原创 2017-05-03 15:30:10 · 549 阅读 · 0 评论 -
平衡二叉树
平衡二叉树(AVL树):可以是一棵空树(1)左右子树都是高度平衡的二叉树(2)左右子树的高度之差的绝对值不大于1平衡二叉树查找的平均情况和最坏情况都是O(logn),其插入和删除操作的时间复杂度也是O(logn),并且在插入、删除之后高度仍然保持相对平衡。原创 2017-04-21 09:08:39 · 427 阅读 · 0 评论 -
二叉查找树
二叉查找树或者是棵空树,或者满足下面的特性: (1)如果它的左子树不为空,那么它的左子树上的任意节点的值都小于根节点的值。 (2)如果它的右子树不为空,那么它的右子树上任意节点的值都大于根节点的值。 (3)同样,它的左子树和右子树也都是二叉查找树。 二叉查找树的代码实现如下:package com.threetop.www;/**原创 2017-04-20 23:05:51 · 366 阅读 · 0 评论 -
树
树的种类很多,有二叉树、平衡二叉树、B树、B+树、哈夫曼树、B-树,B*树、红黑树、trie树等。原创 2017-04-20 20:45:40 · 320 阅读 · 0 评论 -
数组的更多应用
从数组中找出其和为指定值得两个数:比如输入的数组为1、3、5、7、9、15,寻找的结果为10,那么输出下标0、4,或者1、3都可以。 (1)最直接的办法,遍历每一个元素,对于任意a[k],只需要遍历寻找是否存在值为sum-a[k]的数组元素。 (2)运用散列表,加快查找的时间 (3)运用排序两边查找。 实现代码如下:package原创 2017-05-03 10:20:04 · 417 阅读 · 0 评论 -
排序算法---简单选择排序
简单选择排序:在序列中依次选择最大(最小)的数,并将其放到待排序的数列的起始位置。 简单选择排序的代码实现:package com.threeTop.www;/** * 简单选择排序的实现 * @author wjgs * */public class SelectSort { private int[]array; //构造函数进行初始化 publ原创 2017-04-16 11:39:03 · 374 阅读 · 0 评论 -
排序算法---希尔排序
希尔排序的基本思想(划分):把待排序的数列按照一定的增量分割成多个子数列,这些子数列不是连续的,然后对每个子数列进行插入排序。接着增量逐渐减小,在减小到1后直接使用插入排序处理数列。原创 2017-04-16 11:20:27 · 375 阅读 · 0 评论 -
排序算法---插入排序
插入排序:(1)直接插入排序 (2)二分插入排序 插入排序:往数列里面插入数据元素即往一个已经排好序的待排序的数列中插入一个数,使得插入这个数之后,数列仍然有序。 插入排序的实现代码如下:package com.threeTop.www;/** * 插入排序的实现 * @author wjgs * */public class InsertS原创 2017-04-16 10:46:00 · 1064 阅读 · 0 评论 -
KMP字符串模式匹配详解
KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。一.简单匹配算法先来看一个简单匹配算法的函数:int Index_BF ( char S [ ], char T [ ], int pos ){/* 若串 S 中从第pos(S 的下标0≤pos<StrLe翻译 2017-05-02 10:15:08 · 564 阅读 · 0 评论 -
查找---顺序查找
顺序查找:从头开始一个一个地往后逐个比较,知道找到与给定的关键字相同的数。 顺序查找的实现代码如下:package com.threeTop.www;/*** * 顺序查找的实现 * @author wjgs * */public class SequentialSearch { private int []array; //构造函数实现初始原创 2017-04-17 21:33:44 · 483 阅读 · 0 评论