
数据结构
文章平均质量分 55
Azadoo
这个作者很懒,什么都没留下…
展开
-
迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法介绍迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个结 点到其他结点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。算法过程设置出发顶点为v,顶点集合V{v,v2,v…}, v到V中各顶点的距离构成距离集合Dis,Dis{d1,d2,d…}, Dis集合记录着v到图中各顶点的距离(到自身可以看作0,v到vi距离对应为di)从Dis中选择值最小的di并移出Dis集合, 同时移出V集合中对应的顶点vi,此原创 2020-05-21 21:56:47 · 476 阅读 · 0 评论 -
克鲁斯卡尔算法(Kruskal)
克鲁斯卡尔算法介绍1)克鲁斯卡尔(Kruskal)算法, 是用来求加权连通图的最小生成树的算法。2)基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路3) 具体做法:首先构造一 个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止克鲁斯卡尔算法与普利姆算法都是求最小生成树而普利姆算法是任意顶点开始 选择权值最小的路径进行连通克鲁斯卡尔算法是优先连通权值最小的路径import java.util.Arra原创 2020-05-21 15:27:11 · 632 阅读 · 0 评论 -
普利姆算法 修路问题
最小生成树修路问题本质就是就是最小生成树问题,先介绍一下最小生成树(Minimum CostSpanning Tree),简称MST.给定一个带权的无向连通图,如何选取一 棵生成树,使树上所有边上权的总和为最小,这叫最小生成树N个顶点,一定有N-1条边包含全部项点N-1条边都在图中5)举例说明(如图:)6)求最小生成树的算法主要是普里姆算法和克鲁斯卡尔算法1) 有胜利乡有7个村庄(A,B,C,D,E,F,G),现在需要修路把7个村庄连通2)各个村庄的距离用边线表示(权),比如A-B距离原创 2020-05-19 23:09:32 · 413 阅读 · 0 评论 -
贪心算法(贪婪算法)
贪心算法介绍1)贪婪算法(贪心算法)是指在对问题进行求解时,在每-步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法2)贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果思路分析:使用贪婪算法,效率高:目前并没有算法可以快速计算得到准备的值,使用贪婪算法,则可以得到非常接近的解,并且效率高。选择策略上,因为需要覆盖全部地区的最小集合:1)遍历所有的广播电台,找到一个覆盖了最多未覆盖的地区的电台(此电台可能包含一些原创 2020-05-19 17:08:11 · 4197 阅读 · 0 评论 -
KMP算法与暴力匹配算法
应用场景 字符串匹配问题::有一个字符串str1=“BBC ABCDAB ABCDABCDABDE”,和一个子串str2=“ABCDABD”现在要判断str1 是否含有str2, 如果存在,就返回第一次出现的位置,如果没有,则返回-1暴力匹配算法如果用暴力匹配的思路,并假设现在str1匹配到i位置,子串str2匹配到 j 位置,则有1)如果当前字符匹配成功( 即str1[i]==str2[j]),则i++, j++, 继续匹配下一个字符2)如果失配(即str1[i]!=str2[j]) ,令i=原创 2020-05-19 15:43:37 · 365 阅读 · 0 评论 -
动态规划算法(背包问题与打家劫舍)
3)思路分析和图解算法的主要思想,利用动态规划来解决。每次遍历到的第i个物品,根据w[]和v[i]来确定是否需要将该物品放入背包中。即对于给定的n个物品,设val[i]、 w[i]分 别为第i个物品的价值和重量,C为背包的容量。再令v[i][i]表示在前i个物品中能够装入容量为j的背包中的最大价值。则我们有下面的结果:(1) v[i][0]=v[0][j]=0;//表示填入表第一行和第一列是0(2)当w[i]>j时: v[i][j]=V[i-1][j] //当准备加入新增的商品的容量大于当前背.原创 2020-05-18 23:28:44 · 344 阅读 · 0 评论 -
分治算法 与汉诺塔问题简易处理
分治算法介绍1)分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一-个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题…直到最后子问题可以简单的直接求解,原问题的解即子间题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换…2)分治算法可以求解的一些经典问题二分搜索大整数乘法棋盘覆盖合并排序快速排序线性时间选择最接近点对问题循环赛日程表汉诺塔分治算法的基本步骤分治法在每一层递归上都有三个步骤:原创 2020-05-18 23:22:46 · 291 阅读 · 0 评论 -
图的基本介绍与创建 dfs与bfs遍历
为什么要有图1)线性表局限于一个直接前驱和一个直接后继的关系2)树也只能有一个直接前驱也就是父节点3)当我们 需要表示多对多的关系时,这里我们就用到了图图的举例说明图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。结占也可以称为顶点。如图。图的常用概念1)顶点(vertex)2)边(edge)3) 路径4)无向图(右图)无向图:顶点之间的连接没有方向,比如A-B,即可以是A->B也可以B->A.路径:比如从D-> C的路径有D-原创 2020-05-17 17:37:58 · 320 阅读 · 0 评论 -
红黑树 基本介绍与创建
红黑树的性质(重点):1.每个结点不是红色就是黑色2.不可能有连在一起的红色结点3.根结点都是黑色root4.每个红色结点的两个子结点都是黑色。叶子节点都是黑色:出度为0满足了性质就可以近似的平衡了,不一定要红黑,可以为其他的...原创 2020-05-16 22:26:50 · 383 阅读 · 0 评论 -
多路查找树 B数 B+树 B*树 原理
常规二叉树问题1)二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(此如1亿),就存在如下问题2)问题1: 在构建二叉树时,需要多次进行/o操作海量数据存在数据库或文件中)节点海量,构建二叉树时,速度有影响3)问题2: 节点海量,也会造成二叉树的高度很大,会降低操作速度多叉树1)在二叉树中,每个节点有数据项,最多有两个子节点。如果允许每个节点可以有更多的数据项和更多的子节点,就是多叉树(multiwaytree )2)后面我们讲解的2-3树,2-3-4树就是多原创 2020-05-15 17:30:29 · 475 阅读 · 0 评论 -
平衡二叉树 AVL树 双旋转
问题 若数组{1,2,3,4,5,6}组成二叉排序树 整棵树左子节点全为空 则相当于链表 而在实际操作中如增删查 效率还会更低 为了避免这种情况发生 需要对二叉排序树旋转 使左右子树高度差不超过1基本介绍平衡二叉树也叫平衡二叉搜索树(Self balancing binarysearch tree) 又被称为AVL树,可以保证查询效率较高。具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、T原创 2020-05-15 15:12:34 · 347 阅读 · 0 评论 -
二叉排序树 与查询 添加 删除节点
二叉排序树BST: (Binary Sort(Search) Tree),对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点比如针对数据(7,3, 10,12.5,1,9) 。一个数组创建成对应的二叉排序树,并使用中序遍历二叉排序树,比如: 数组为Array(7,3, 10, 12,5,1, 9,5),创建成对应的二叉排序树为:删除二叉排序树的删除情况比较复杂,有下面三种情况需要考虑1原创 2020-05-14 16:30:58 · 212 阅读 · 0 评论 -
赫夫曼编码
赫夫曼编码的原理剖析基本介绍1)赫夫曼编码也翻译为哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式。属于一种程序算法2)赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。3)赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%~90%之间4)赫夫曼码是可变字长编码(VLC)的一种。Huffman于1952 年提出一种编码方法, 称之为最佳编码传输的字符串1)i like like like java do you like a java2) d:1y:1u:1j原创 2020-05-13 21:45:16 · 284 阅读 · 0 评论 -
赫夫曼树
●赫夫曼树基本介绍.1)给定n个权值作为n个吐子结点,构造一棵二叉树, 若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(HuffmanTree),还有的书翻译为霍夫曼树。2)赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。赫夫曼树几个重要概念和举例说明1)路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-12)结点的原创 2020-05-12 15:14:00 · 203 阅读 · 0 评论 -
堆排序
堆排序基本介绍1)堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为0(nlogn),它也是不稳定排序。2)堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆,注意:没有要求结点的左孩子的值和右孩子的值的大小关系。3) 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆4)大顶堆举例说明堆排序的基本思想是:(大顶堆升序为例)1)将待排序序列构造成一个大顶堆2) 此时,整个序列的最大值就是堆顶的根节点。原创 2020-05-11 21:05:26 · 139 阅读 · 0 评论 -
线索化二叉树与遍历(中序)
n个结点的二叉链表中含有n+1 [公式2n-(n-1)=n+1] 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索" )这种加上了 线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种一个结点的前一个结点,称为前驱结点一个结点的后一个结点,称为后继结点将下面的二叉树,进行中序线索二叉树。中序遍历的数.原创 2020-05-11 15:43:34 · 740 阅读 · 0 评论 -
顺序存储二叉树 (前序中序后序)遍历
➢顺序存储二叉树的特点:顺序二叉树通常只考虑完全二叉树2)第n个元素的左子节点为2*n+ 1第n个元素的右子节点为2*n+2第n个元素的父节点为(n-1)/ 2n:表示二叉树中的第几个元素(按0开始编号如图所示)`public class ArrBinaryTreeDemo {public static void main(String[] args) { int[] arr = {1,2,3,4,5,6,7}; ArrBinaryTree a = new ArrBinaryTr原创 2020-05-10 18:13:41 · 1409 阅读 · 1 评论 -
二叉树 前序中序后序遍历与查找与删除节点
//前序遍历//1先输出当前节点(初始的时候是root节点)//2如果左子节点不为空,则递归继续前序遍历//2如果右子节点不为空,则递归继续前序遍历 //中序遍历//1如果当前节点的左子节点不为空,则递归中序遍历,//2输出当前节点 如果当前节点的右子节点不为空,则递归中序遍历 //后序遍历//1如果当前节点的左子节点不为空,则递归后序遍历,//2如果当前节点的右子节点不为空,则递归后序遍历//3输出当前节点public class BinaryTreeDemo { publ.原创 2020-05-09 22:03:44 · 482 阅读 · 1 评论 -
二叉树 概念
为什么使用树结构数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动, 效率较低链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入-一个数值节点,只需要将插入节点,链接到链表中即可,删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历)树存储方式的分析能提高数据存储,读取的效率,比如利用 二叉排序树(Binary Sort Tre原创 2020-05-09 13:58:46 · 253 阅读 · 0 评论 -
哈希表demo
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…),当输入该员工的id时,要求查找到该员工的所有信息要求:1)不使用数据库…速度越快越好= >哈希表(散列)2)添加时,保证按照id 从低到高插入[课后思考: 如果id不是从低到原创 2020-05-08 22:52:29 · 211 阅读 · 0 评论 -
斐波那契查找算法
1)黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神奇的数字,会带来意向不大的效果。2)斐波那契数列{1,1,2,3,5, 8, 13, 21,34, 55}发现斐波那契数列的两个相邻数的比例,无限接近黄金分割值0.618斐波那契(黄金分割法)原理...原创 2020-05-07 21:47:23 · 229 阅读 · 0 评论 -
插值查找法
1)对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找,速度较快.2)关键字分布不均匀的情况下,该方法不一定比折半查找要好与二分查找差别只在于mid中间值的设定int mid = left + (right - left)*(finalVal - arr[left]) / (arr[right] - arr[left]);import java.util.ArrayList;...原创 2020-05-07 17:35:42 · 228 阅读 · 0 评论 -
二分查找法 递归与非递归算法 可找寻重复值
二分查找的思路分析1.首先确定该数组的中间的下标mid= (left +right)/ 22.然后让需要查找的数findVal和arr[mid]比较2. 1 findVal> arr[mid], 说明你要查找的数在mid的右边,因此需要递归的向右查找2.2 findVal < arr[mid],说明你要查找的数在mid的左边,因此需要递归的向左查找2.3 findVal==...原创 2020-05-07 15:48:43 · 204 阅读 · 0 评论 -
基数排序 (桶排序)(含负数)
基数排序(radixsort) 属于“分配式排序”(distributionsort) ,又称“桶子法”(bucket sort) 或binsort, 顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用2)基数排序法是属于稳定 性的排序,基数排序法的是效率高的稳定性排序法3)基数排序(Radix Sort)是桶排序的扩展4)基数排序是 1887年赫尔曼●...原创 2020-05-07 14:14:20 · 2173 阅读 · 5 评论 -
归并排序
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide and conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将 分的阶段得到的各答案"修补"在一起,即分而治之)。import java.util.Arrays;public class MergeSort { //800W 2s...原创 2020-05-06 21:20:42 · 137 阅读 · 0 评论 -
快速排序
快速排序(Quicksort) 是对冒泡排序的一种改进。基本思想是:通过一趟排序将 要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列import java.util.Arrays;public class QuickSort { //8W不到一秒 800...原创 2020-05-06 15:22:05 · 121 阅读 · 0 评论 -
希尔排序(缩小增量排序) 交换法与移动法
希尔排序法介绍希尔排序是希尔(DonaldShell) 于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。希尔排序法基本思想:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止import java.ut...原创 2020-05-05 17:07:08 · 508 阅读 · 1 评论 -
插入排序
插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的...原创 2020-05-05 13:01:24 · 172 阅读 · 0 评论 -
选择排序
选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第- -次从 arr[0]-arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]-arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]-arr[p-1]中选取最小值,与ar...原创 2020-05-04 20:44:20 · 177 阅读 · 0 评论 -
冒泡排序
冒泡排序(Bubble Sorting) 的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。impo...原创 2020-05-04 20:13:17 · 131 阅读 · 0 评论 -
算法的复杂度
1)常数阶0(1)2)对数阶O(log2n)3)线性阶O(n)4) 线性对数阶0(nlog2n)5) 平方阶0(n^2)6) 立方阶O(n^3)7) k次方阶0(n^k)8)指数阶0(2^n)1)常数阶0(1)无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是0(1)上述代码在执行的时候,它消耗的时候并不随着某个变量的增长而增长,那么无论这类代码有...原创 2020-05-03 22:45:08 · 861 阅读 · 0 评论 -
排序算法总结
排序算法的介绍排序也称排序算法(SortAlgorithm),排序是将一组数据, 依指定的顺序进行排列的过程。排序的分类:1)内部排序:指将需要处理的所有数据都加载到内部存储器(内存)中进行排序。2)外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储(文件等)进行排序。常见的排序算法分类(见右图): ....原创 2020-05-03 22:35:45 · 101 阅读 · 0 评论 -
八皇后问题
八皇后问题算法思路分析第一个皇后先放第一行第一列第二个皇后放在第二行第一列、然后判断是否0K, 如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适继续第三个皇后,还是第一列、第二列…直到第8个皇后也能放在一 个不冲突的位置,算是找到了一个正确解当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解,全部得到.然后回头继续第...原创 2020-05-03 13:27:07 · 124 阅读 · 0 评论 -
迷宫问题(回溯递归)
package com.recursion;public class MiGong { public static void main(String[] args) { //地图 int[][] map = new int[8][7]; for(int i = 0 ;i <7;i++) { map[0][i] = 1; map[7][i] = 1; } ...原创 2020-04-30 21:15:32 · 316 阅读 · 0 评论 -
逆波兰表达式(后缀表达式)计算器 简易整数版
完成对逆波兰表达式的运算1)从左至右扫描,将3和4压入堆栈;2)遇到+运算符,因此弹出4和3 (4为栈项元素,3为次项元素),计算出3+4的值,得7,再将7入楼;3)将5入栈;4)接下来是x运算符,因此弹出5和7,计算出7x5=35,将35入栈;5)将6入栈;6)最后是-运算符,计算出35-6的值,即29,由此得出最终结果中缀表达式转换为后缀表达式后缀表达式适合计算式进行运算,但是...原创 2020-04-30 21:14:50 · 224 阅读 · 0 评论 -
计算器 栈
使用栈完成表达式的计算思路1.通过一个index值(索引) ,来遍历我们的表达式2.如果我们发现是一个数字,就直接入数栈3.如果发现扫描到是一个符号, 就分如下情况3.1如果发现当前的符号栈为空,就直接入栈3.2如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作符,就需要从数栈中pop出两个数,在从符号栈中pop出-一个符号,进行运算,将得到结果,入数栈,...原创 2020-04-29 16:43:59 · 232 阅读 · 0 评论 -
数组模拟栈stack
1)栈的英文为(stack)2)栈是一个先入后出(FILO-First In Last Out)的有序列表。3)栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top), 另一端为固定的一端,称为栈底(Bottom)。4)根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最...原创 2020-04-28 17:14:18 · 167 阅读 · 0 评论 -
单向环形链表(约瑟夫问题)
Josephu 问题Josephu问题为:设编号为1,2, … n的n个人围坐一圈,约定编号为k (1<=k<=n) 的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生-一个出队编号的序列。提示用一个不带头结点的循环链表来处理Josephu问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计...原创 2020-04-28 14:56:48 · 181 阅读 · 0 评论 -
双向链表
单向链表的缺点分析:单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。单向链表不能自我删除,需要靠辅助节点,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到temp,temp是待删除节点的前一个节点.分析双向链表的遍历,添加,修改,删除的操作思路===》代码实现1)遍历方和单链表一样,只是可以向前,也可以向后查找2)添加(默认添加到双向链表...原创 2020-04-27 15:11:13 · 101 阅读 · 0 评论 -
单链表的增删改查 获取节点数 反转表 逆序打印
链表1)链表是以节点的方式来存储2)每个节点包含data域,next 域:指向下一个节点.3)如图:发现链表的各个节点不一定是连续存放4)链表分带头节点的和没有头节点的单链表(带头节点)的增删改查package com.linkedlist;public class SingleLinkedList { public static void main(String[] args...原创 2020-04-25 15:42:04 · 146 阅读 · 0 评论