![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法和数据结构
Beat_IT_W
这个作者很懒,什么都没留下…
展开
-
最小生成树算法之Kruskal算法和Prim算法
关于最小生成树与Kruskal算法、Prim算法的概念这位算法导论--最小生成树(Kruskal和Prim算法)已经写得很好了,这里我直接转载过来,就不赘述了。关于图的几个概念定义:连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图。强连通图:在有向图中,若任意两个顶点vi与vj都有路径相通,则称该有向图为强连通图。连通网:在连通图中,若图的边具有一转载 2018-01-30 12:05:46 · 291 阅读 · 0 评论 -
插入排序
复杂度O(N^2) ,是稳定的排序方法!插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据。public class InsertSort { public int[] insertSort(int[] array){ //我自己的方法// for (int i = 1; i < array.length; i++) {/...原创 2019-04-09 22:12:55 · 70 阅读 · 0 评论 -
归并排序
时间复杂度 O(nlogn)!过程:利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大的有序序列。public class MergeSort { public static void mergeSort(int[] arr){ if(arr == null || arr.length < 2 ){ //检...原创 2019-04-09 22:14:38 · 336 阅读 · 0 评论 -
利用归并排序解决小和问题
小和问题: Q1、什么是小和? A:在一个数列中,任意元素p左边所有比p小的数之和,即为小和。 Q2:什么是小和问题? A: 数列中所有元素的小和之和就是小和问题。暴力破解的话复杂度很明显是O(N^2),这里采用归并排序的思想,即递归和分治的思想解决。过程:以(1,2,3,4,5,6,7)为例 ...原创 2019-04-09 22:18:37 · 272 阅读 · 1 评论 -
树的基本概念以及java实现二叉树
转自https://blog.csdn.net/qingtian_1993/article/details/806379171. 树1.1 什么是树树是具有n个结点的有限集合当n=0时,有且仅存在一个结点,该结点称为根结点 当n>0时,其余结点分为m个互斥的有限集合T1,T2,T3,每个集合分别称为子树由此可知,树的定义是一个递归的定义,即树的定义中又用到了树的概念。...转载 2019-06-25 16:53:10 · 781 阅读 · 0 评论 -
哈希表的构建Java版本
JAVA哈希表的构建(拉链法)下面补充一点关于哈希表的一些概念和定义:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关...转载 2019-07-01 21:06:17 · 284 阅读 · 0 评论 -
给定范围0-60的整型数组,利用不比较的排序方法对该数组进行排序
针对上述题目,其中一个可以解决的方法是(桶排序):定义一个长度为61的数组,初始化数组每个元素为0,该数组起到一个词频记录的作用。然后遍历原数组,对于原数组元素对应的词频数组位置加一,比如原数组元素是2,则对词频数组的位置2元素加一。待得遍历完原数组后,将词频数组按元素的值输出其频数即可,达到了不进行比较就能排序的效果!时间复杂度为O(n)。额外空间复杂度O(N)...原创 2019-06-23 15:24:44 · 226 阅读 · 0 评论 -
非基于比较的排序算法例题
题目:给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。例:[3,1,6,2,7]排序后得到[1,2,3,6,7],并且相邻两数的最大差值是3(元素3和元素6的差值)。解决思路: 利用到桶的思想,数组有n个数,定义n+1个桶,遍历数组找到最小值和最大值,放在桶的前后两端。然后min-max范围之间的数,分成n+1份,...原创 2019-06-23 16:37:24 · 820 阅读 · 0 评论 -
用数组结构实现大小固定的队列和栈
首先说明一点,java本身有实现stack,即集合类型Stack。java中虽然有Queue接口,单java并没有给出具体的队列实现类,而Java中让LinkedList类实现了Queue接口,所以使用队列的时候,一般采用LinkedList。因为LinkedList是双向链表,可以很方便的实现队列的所有功能。数组实现栈: 栈的特点是先进后出,所以只需要给数组设置一个index...原创 2019-06-24 16:00:59 · 105 阅读 · 0 评论 -
先序、中序、后序的方式递归遍历二叉树
package com.gxu.dawnlab_algorithm3;/** * 先序、中序、后序的方式递归遍历二叉树 * @author junbin * * 2019年6月27日 */public class PrintBinaryTree { public static class Node{ public int data; public Node left; ...原创 2019-06-27 20:22:03 · 85 阅读 · 0 评论 -
图的存储方式
转自---数据结构】图(邻接矩阵、邻接表)的JAVA代码实现首先介绍一下图的概念:图是不同于树的另一种非线性数据结构。在树结构中,数据元素之间存在着一种层次结构的关系,每一层上的数据元素可以和下一层的多个数据元素相关,但只能和上一层的单个数据元素相关。也就是说,树结构的数据元素之间是一种一对多的关系;在图结构中,数据元素之间的关系则是多对多的关系。即图中的每个数据元素可以和图中任意别的数据...转载 2019-07-13 16:34:11 · 175 阅读 · 0 评论 -
Java实现Bitmap
bitmap是很有用的结构。所谓的bitmap就是用一个bit位来标记某个元素,而数组下标是该元素。bitmap经常用在大数据的题中,比如10亿个int类型的数,如果用int数组存储的话,那么需要大约4G内存,浪费内存。如果用bitmap解决,就比较方便。bitmap可以用int来模拟,也可以用byte来模拟,它只是逻辑上的概念,在java语言中写不出来,我们同时采用int和byte模拟。采用...转载 2019-07-05 16:29:59 · 6761 阅读 · 1 评论 -
哈夫曼树及其Java实现
转载自:图文详解JAVA实现哈夫曼树概念:给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。它的构建方法很简单,依次选取权值最小的结点放在树的底部,将最小的两个连接构成一个新结点,需要注意的是构成的新结点的权值应该等于这两个结点的权值...转载 2019-07-11 16:31:50 · 1045 阅读 · 0 评论 -
哈夫曼树及其实现
首先了解一下什么是哈夫曼树:给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,即权值较大的结点离根较近。哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结...转载 2019-08-08 11:48:32 · 389 阅读 · 0 评论 -
选择排序
选择排序 复杂度O(N^2) ,是不稳定的排序方法!过程:1. 第一次从下标为0的的这个数开始与后面的n-1个进行比较;找出最小或者最大的放在下标为0的这个位置;2. 第二次从下标为1的开始比较;查询剩下的最大或者最小值;放在下标为1的位置;3. 以此类推;直到排序完成。public class SelectionSort { public int[] selectSort(i...原创 2019-04-09 22:11:20 · 84 阅读 · 0 评论 -
冒泡排序
时间复杂度O(N^2) ,是不稳定的排序方法!但是可以实现成稳定的!过程:1. 依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。2. 在第二趟:仍从第一个数开始比较(因为可能由于第2个...原创 2019-04-09 22:08:29 · 71 阅读 · 0 评论 -
分治算法
一、基本概念在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题原创 2018-02-03 17:02:28 · 190 阅读 · 0 评论 -
巧妙理解动态规划算法
我们先来看一个题目:有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。很显然可以使用暴力破解求出所有的排列组合,但是时间复杂度是指数级的。这里很显然使用动态规划是最合适的!那到底什么是动态规划呢?动态规划的英文名是Dynamic Programming,是一种分阶段求解决策问题的数学思想。它不仅用于编程领域,也应用于管转载 2020-04-10 12:01:17 · 2562 阅读 · 3 评论 -
欧几里得算法求两个正整数的最大公约数
此题可以使用暴力破解法解决,但是效率不高。欧几里德算法又称辗转相除法,其计算原理依赖于下面的定理:gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0) (证明网上一大堆)此题只要令r = a mod b展开循环即可。贴上Java实现代码/** * 欧几里得算法求最大公约数 * @author Beat I原创 2018-01-29 10:14:03 · 3160 阅读 · 0 评论 -
贪心算法
贪心法是一种稳扎稳打的算法,它从问题的某一个初始解出发,在每一个阶段都根据贪心策略来做出当前最优的决策,逐步逼近给定的目标,尽可能快地求出更好的解。当达到算法中的某一步不能再继续前进时,算法终止。贪心法可以理解为以逐步的局部最优,达到最终的全局最优。举个容易理解的问题来解释一下:现在你有一个能装4斤苹果的袋子,苹果有两种,一种3斤一个,一种2斤一个,怎么装才能得到最多苹果?当然我们人考虑的话当然是...原创 2018-02-10 10:40:21 · 420 阅读 · 0 评论 -
图的遍历——深度优先搜索算法
类似广度优先搜索,深度优先搜索算法的定义:首先访问图G任意顶点v,并将其标记为已访问过,然后依次从v出发搜索v的每个邻接点(子节点)w。若w未曾访问过,则以w为新的出发点继续深度优先遍历,直至图中所有和源点v有路径相通的顶点均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止。其实理解了广度优先搜素算法,理解这个也是顺带的原创 2018-01-30 11:33:18 · 4982 阅读 · 0 评论 -
图的遍历——广度优先搜索算法
设图G的初始状态是所有顶点均未访问过。以G中任一顶点v为起点,则广度(宽度)优先搜索定义如下: 首先访问出发点v,接着依次访问v的所有邻接点w1,w2,......,wi,然后再依次访问与w1,w2,......,wi邻接的所有未曾访问过的顶点。以此类推,直至图中所有和起点v有路径想通的顶点都已访问过。此时从v开始的搜索过程结束。若G是连通图,则从任意顶点开始就能搜索完所有结点;否则,原创 2018-01-30 09:54:13 · 1157 阅读 · 0 评论 -
贪心算法之Dijkstra单源最短路径问题
Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年构思并于 1959 年发表。其解决的问题是:给定图 G 和源顶点 v,找到从 v 至图中所有顶点的最短路径。Dijkstra 算法采用贪心算法(Greedy Algorithm)范式进行设计。Dijk...原创 2018-02-10 11:50:03 · 1169 阅读 · 0 评论 -
回溯算法
回溯(backtracking)是一种系统地搜索问题解答的方法,也叫试探法。为了实现回溯,首先需要为问题定义一个解空间(solution space),这个空间必须至少包含问题的一个解(可能是最优的)。下一步是组织解空间以便它能被容易地搜索。典型的组织方法是图(迷宫问题)或树(N皇后问题)。一旦定义了解空间的组织方法,这个空间即可按深度优先的方法从开始节点进行搜索。回溯算法的基本思想是:从一条路往...原创 2018-02-12 10:56:27 · 458 阅读 · 0 评论 -
动态规划算法之0-1背包问题
我们首先来看一下问题:一个旅行者有一个容量为C的背包,现在有n种物品,每件的重量分别是W1、W2、……、Wn,每件物品的价值分别为V1、V2、……、Vn, 需要将物品放入背包中,要怎么样放才能保证背包中物品的总价值最大?具体数据如下表,其中n=4,C=8。 前面已经对动态规划的基原创 2018-02-07 11:31:39 · 791 阅读 · 0 评论 -
荷兰国旗问题
荷兰国旗问题:现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球、白球、蓝球。这个问题之所以叫荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列后正好组成荷兰国旗。给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。过程:设置三个下标less,...原创 2019-04-10 14:55:17 · 317 阅读 · 0 评论 -
快速排序
基本思想: 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。利用递归实现改进思想: 可以利用荷兰国旗问题的思想来解决,首先任意选取一个数据作为关键数据,然后将所有比它小的数都放在左边,等于的数放在中间,大于的数都放在右...原创 2019-04-10 22:04:17 · 85 阅读 · 0 评论 -
堆排序
首先知道什么是完全二叉树: 如果一棵具有n个结点的深度为k的二叉树,它的每一个结点都与深度为k的满二叉树中编号为1~n的结点一一对应,这棵二叉树称为完全二叉树。这个其实很好理解!一个数组对应的完全二叉树,即父结点为i位置的话,左孩子的结点位置为2*i+1,右孩子的结点位置为2*i+2。然后知道什么是大根堆和小根堆: 堆是一种特殊的树形数据结构,其每个结点都有一个值...原创 2019-04-11 21:56:03 · 77 阅读 · 0 评论 -
排序算法的稳定性及其汇总
排序算法稳定性所谓稳定性是指待排序的序列中有两元素相等,排序之后它们的先后顺序不变.假如为A1,A2.它们的索引分别为1,2.则排序之后A1,A2的索引仍然是1和2.稳定也可以理解为一切皆在掌握中,元素的位置处在你在控制中.而不稳定算法有时就有点碰运气,随机的成分.当两元素相等时它们的位置在排序后可能仍然相同.但也可能不同.是未可知的.另外要注意的是:算法思想的本身是独立于编程语言的,...转载 2019-04-12 17:15:00 · 3463 阅读 · 0 评论 -
中缀表达式与前、后缀表达式转化简单的技巧
35,15,+,80,70,-,*,20,/ //后缀表达方式 (((35+15)*(80-70))/20)=25 //中缀表达方式 /,*,+,35,15,-,80,70, 20 //前缀表达方式人的思维方式很容易固定~~!正如习惯拉10进制。就对2,3,4,...转载 2019-08-09 17:49:22 · 355 阅读 · 0 评论