![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 73
柠砸
这个作者很懒,什么都没留下…
展开
-
马踏棋盘算法
一,马踏棋盘算法介绍和游戏演示:1) 马踏棋盘算法也被称为骑士周游问题2) 将马随机放在国际象棋的 8×8 棋盘 Board[0~7][0~7]的某个方格中,马按走棋规则(马走日字)进行移动。要求 每个方格只进入一次,走遍棋盘上全部 64 个方格3) 游戏演示: http://www.4399.com/flash/146267_2.htm二,马踏棋盘游戏代码实现:1) 马踏棋盘问题(骑士周游问题)实际上是图的深度优先搜索(DFS)的应用。2) 如果使用回溯(就是深度优先搜索)来解原创 2022-02-23 23:00:49 · 2187 阅读 · 0 评论 -
弗洛伊德算法
一,弗洛伊德算法的介绍:1) 和 Dijkstra 算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法 名称以创始人之一、1978 年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名2) 弗洛伊德算法(Floyd)计算图中各个顶点之间的最短路径3) 迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径。4) 弗洛伊德算法 VS 迪杰斯特拉算法:迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点 的最短路径;弗洛伊德算法原创 2022-02-23 22:53:25 · 2429 阅读 · 0 评论 -
迪杰斯特拉算法
一,迪杰斯特拉算法介绍:迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个结点到其他结点的最短路径。它的主要特点是以 起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。迪杰斯特拉算法的步骤:1) 设置出发顶点为 v,顶点集合 V{v1,v2,vi...},v 到 V 中各顶点的距离构成距离集合 Dis,Dis{d1,d2,di...},Dis 集合记录着 v 到图中各顶点的距离(到自身可以看作 0,v 到 vi 距离对应为 di) 2) 从 Dis 中选择值最小的原创 2022-02-23 22:47:52 · 5065 阅读 · 0 评论 -
克鲁斯卡尔算法
一,克鲁斯卡尔算法的介绍:1) 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。2) 基本思想:按照权值从小到大的顺序选择 n-1 条边,并保证这 n-1 条边不构成回路3) 具体做法:首先构造一个只含 n 个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森 林中不产生回路,直至森林变成一棵树为止二,克鲁斯卡尔算法的应用实例:▲公交站问题:图解思路分析:算法分析:如何判断是否构成回路:具体代码...原创 2022-02-23 22:22:17 · 788 阅读 · 0 评论 -
普利姆算法
一,普利姆算法的介绍普利姆(Prim)算法求最小生成树,也就是在包含 n 个顶点的连通图中,找出只有(n-1)条边包含所有 n 个顶点的 连通子图,也就是所谓的极小连通子图 普利姆的算法如下:1) 设 G=(V,E)是连通网,T=(U,D)是最小生成树,V,U 是顶点集合,E,D 是边的集合2) 若从顶点 u 开始构造最小生成树,则从集合 V 中取出顶点 u 放入集合 U 中,标记顶点 v 的 visited[u]=13) 若集合 U 中顶点 ui 与集合 V-U 中的顶点 vj 之间存在边原创 2022-02-23 21:53:40 · 1656 阅读 · 0 评论 -
贪心算法分析
一,贪心算法介绍:1) 贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而 希望能够导致结果是最好或者最优的算法2) 贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果二,贪心算法的应用实例:▲集合覆盖问题:思路分析:使用贪婪算法,效率高:1) 目前并没有算法可以快速计算得到准备的值, 使用贪婪算法,则可以得到非常接近的解,并且效率高。选择 策略上,因为需要覆盖全部地区的最小集合:原创 2022-02-23 21:45:23 · 724 阅读 · 1 评论 -
KMP算法
一,KMP算法的介绍:1) KMP 是一个解决模式串在文本串是否出现过,如果出现过,最早出现的位置的经典算法2) Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP 算法”,常用于在一个文本串 S 内查找一个模式串 P 的 出现位置,这个算法由 Donald Knuth、Vaughan Pratt、James H. Morris 三人于 1977 年联合发表,故取这 3 人的 姓氏命名此算法.3) KMP 方法算法就利用之前判断过信息,通过一个 next 数组,保存模式串中前原创 2022-02-23 21:26:04 · 91 阅读 · 0 评论 -
动态规划算法
一,动态规划算法介绍:1) 动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解 的处理算法2) 动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这 些子问题的解得到原问题的解。3) 与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。 ( 即下一个子 阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解 )4) 动态规划可以通过填表的方式来逐原创 2022-02-23 21:05:05 · 526 阅读 · 0 评论 -
分治算法分析
一,分治算法的介绍:1) 分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或 相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题 的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变 换)……2) 分治算法可以求解的一些经典问题二,分治算法的基本步骤★分治法在每一层递归上都有三个步骤:1) 分解:将原问题分解为若干个规模较小,相互独立,与原问题形原创 2022-02-23 17:46:20 · 234 阅读 · 0 评论 -
二分查找算法
一,二分查找算法介绍:1)二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找2)) 二分查找法的运行时间为对数时间 O(㏒₂n) ,即查找到需要的目标位置最多只需要㏒₂n 步,假设从[0,99]的 队列(100 个数,即 n=100)中寻到目标数 30,则需要查找步数为㏒₂100 , 即最多需要查找 7 次( 2^6 < 100 < 2^7)二,二分查找(非递归)代码实现: //非递归查找 public static int bi原创 2022-02-23 17:25:05 · 1706 阅读 · 0 评论 -
一,HTML&CSS
▲一个网页是由三部分组成,分别是:结构:对应的是 HTML 语言 表现:对应的是 CSS 语言 行为:对应的是 JavaScript 语言1.HTML1)文件结构:①文件类型说明:HTML文件中第一行的内容,用来告诉浏览器当前HTML文档的基本信息,其中最重要的就是当前HTML文档遵循的语法标准。HTML5版本的文档类型声明是:<!DOCTYPE html>②结构标签:③注解:HTML注释的写法是: <!-- 注释内容 -->..原创 2022-02-05 16:09:13 · 207 阅读 · 0 评论 -
数据结构与算法汇总(Java实现)
名称 笔记地址 一,队列(Queue)的实现及分析 (94条消息) 队列(Queue)的实现及分析_柠砸的博客-CSDN博客 二,栈(stack)的实现及分析 (94条消息) 栈(stack)的实现及分析_柠砸的博客-CSDN博客 三,递归的实现及分析 (94条消息) 递归的实现及分析_柠砸的博客-CSDN博客 四,算法的时间复杂度 (94条消息) 算法的时间复杂度_柠砸的博客-CSDN博客原创 2022-02-05 15:45:09 · 489 阅读 · 0 评论 -
图的实现与分析
一,图的基本介绍:1.为什么要有图:1) 前面我们学了线性表和树2) 线性表局限于一个直接前驱和一个直接后继的关系3) 树也只能有一个直接前驱也就是父节点 4) 当我们需要表示多对多的关系时, 这里我们就用到了图。2.图的举例说明:图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为 顶点。如图:3.图的常用概念:1) 顶点(vertex)2) 边(edge)3) 路径4) 无向图(右图)5) 有向图原创 2022-02-03 22:42:08 · 320 阅读 · 0 评论 -
树结构的实现与复习
一,树结构的基础介绍:1.为什么需要树这种数据结构::a)数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低示意图:b)链式存储方式的分析:优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历)示意图:c原创 2022-02-03 22:21:08 · 182 阅读 · 0 评论 -
赫夫曼编码的实现与分析
一.赫夫曼编码的基本实现1) 赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法2) 赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。3) 赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在 20%~90%之间4) 赫夫曼码是可变字长编码(VLC)的一种。Huffman 于 1952 年提出一种编码方法,称之为最佳编码★原理剖析:①通信领域中信息的处理方式 1-定长编码②通信领域中信息的处理方式 2-变长编码原创 2022-02-03 17:23:49 · 682 阅读 · 0 评论 -
哈希表的是实现与分析
一,哈希表的基本介绍:▲散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通 过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组 叫做散列表。●数组的特点是:寻址容易,插入和删除困难;●而链表的特点是:寻址困难,插入和删除容易。那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表,哈希表有多种不同...原创 2022-02-01 13:54:48 · 136 阅读 · 0 评论 -
查找算法的分析与实现
▲查找的介绍:查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。本文简单概括性的介绍了常见的七种查找算法,说是七种,其实二分查找、插值查找以及斐波那契查找都可以归为一类——插值查找。插值查找和斐波那契查找是在二分查找的基础上的优化查找算法。树表查找和哈希查找会在后续的博文中进行详细介绍。查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。查找算法分类:1)静态查找和动态查找; 注:静态或者原创 2022-01-26 16:33:14 · 716 阅读 · 0 评论 -
排序算法的分析与实现
一,排序算法的介绍:★排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。1.排序的分类:1) 内部排序: 指将需要处理的所有数据都加载到内部存储器(内存)中进行排序。2) 外部排序法: 数据量过大,无法全部加载到内存中,需要借助外部存储(文件等)进行排序。3) 常见的排序算法分类(见右图):...原创 2022-01-24 20:15:05 · 1365 阅读 · 0 评论 -
算法的时间复杂度
一,度量一个程序(算法)执行时间的两种方法:1) 事后统计的方法 这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序;二是所 得时间的统计量依赖于计算机的硬件、软件等环境因素, 这种方式,要在同一台计算机的相同状态下运行,才能比较那个算法速度更快。2) 事前估算的方法 通过分析某个算法的时间复杂度来判断哪个算法更优二,时间频度:▲基本介绍 时间频度:一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间 就多。一个算原创 2022-01-24 16:10:11 · 6476 阅读 · 0 评论 -
递归的实现及分析
一,递归的概念:★简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时 可以让代码变得简洁。▲构成递归需具备的条件:1) 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)2) 方法的局部变量是独立的,不会相互影响, 比如 n 变量3) 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.4) 递归必须向退出递归的条件逼近,否则就是无限递归,出现 StackOverflowError,死龟了:...原创 2022-01-23 12:49:57 · 1753 阅读 · 0 评论 -
栈(stack)的实现及分析
1) 栈是一个先入后出(FILO-First In Last Out)的有序列表。2) 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的 一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。3) 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元 素最先删除,最先放入的元素最后删除★图解方式说明出栈(pop)和入栈(push)的概念1.顺序栈的设计与实现原创 2022-01-18 20:43:34 · 859 阅读 · 0 评论 -
队列(Queue)的实现及分析
1.队列的介绍:1) 队列是一个有序列表,可以用数组或是链表来实现。2) 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出。3) 我们把向队列中插入元素的过程称为入队(Enqueue),删除元素的过程称为出队(Dequeue)并把允许入队的一端称为队尾,允许出的的一端称为队头,没有任何元素的队列则称为空队。其一般结构如下:2.常用关于队列的操作:package com.zejian.structures.Queue;/*** Created by zeji原创 2022-01-16 19:46:17 · 2781 阅读 · 0 评论