DATASTRUCTUREANDALGORITHM
数据结构与算法
少年啦飞啦
这个作者很懒,什么都没留下…
展开
-
算法——最小生成树与最短路径相关算法
最小生成树算法普利姆算法代码参考:https://blog.csdn.net/tingting256/article/details/50471033具体如何判断是否构成回路,举例说明:克鲁斯卡尔算法代码参考:https://blog.csdn.net/luoshixian099/article/details/51908175最短路径算...原创 2020-02-27 17:36:07 · 317 阅读 · 0 评论 -
算法——贪心算法
1什么是贪心算法?贪心算法,又称贪婪算法(Greedy Algorithm),是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优解出发来考虑,它所做出的仅是在某种意义上的局部最优解。贪婪算法是一种分阶段的工作,在每一个阶段,可以认为所做决定是最好的,而不考虑将来的后果。这种“眼下能够拿到的就拿”的策略是这类算法名称的来源。贪心算法没有固定的算法框架,算法设计的关...转载 2020-02-27 16:05:43 · 621 阅读 · 0 评论 -
算法——KMP算法
暴力匹配假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢?如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有:如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符; 如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0。相当于每次...原创 2020-02-27 15:40:10 · 296 阅读 · 0 评论 -
算法——动态规划算法
动态规划的核心思路动态规划的解题核心主要分为两步:第一步:定义问题有的问题过于抽象,或者过于啰嗦干扰我们解题的思路,我们要做的就是将题干中的问题转化成一系列同类问题的某个解的情况,比如说:题目:求一个数列中最大连续子序列的和。我们要将这个原问题转化为:定义问题:Fk是第k项前的最大序列和,求F1~FN中最大值。通过换一种表述方式,我们清晰的发现了解决问题的思...转载 2020-02-27 14:28:38 · 332 阅读 · 0 评论 -
算法——分治算法
一、基本概念在计算机科学中,分治法是一种很重要的算法。分治算法,字面上的解释是“分而治之”,分治算法主要是三点:将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题----“分” 将最后子问题可以简单的直接求解----“治” 将所有子问题的解合并起来就是原问题打得解----“合”这三点是分治算法的主要特点,只要是符合这三个特点的问题都可以使用分治算法进行解决...转载 2020-02-27 13:49:51 · 1345 阅读 · 0 评论 -
算法——图的深度优先遍历和广度优先遍历
更多参考:深度优先遍历:深度优先遍历是图论中的经典算法。其利用了深度优先搜索算法可以产生目标图的相应拓扑排序表,采用拓扑排序表可以解决很多相关的图论问题,如最大路径问题等等。根据深度优先遍历的特点我们利用Java集合类的栈Stack先进后出的特点来实现。我用二叉树来进行深度优先搜索。深度优先搜索的步骤为:(1)首先节点 1 进栈,节点1在栈顶;(2)然后节点1出...转载 2020-02-27 11:42:13 · 1239 阅读 · 0 评论 -
数据结构——图
图的创建有两个比较关键的点:1、添加节点 2、添加边,完成这两步,一个最基本的图就创建出来了代码实现参考:https://blog.csdn.net/picway/article/details/68151479...原创 2020-02-27 10:59:23 · 132 阅读 · 0 评论 -
数据结构——树
为什么需要树这种数据结构?举例说明(树的查找很快,而且添加和删除也很灵活)二叉树的概念完全二叉树的理解参考:https://blog.csdn.net/maqingbin8888/article/details/81984187二叉树的前序、中序和后序遍历不管是哪种形式的遍历,都肯定是从根节点开始的。过程有些类似递归回溯的思想。实现参考:https:...原创 2020-02-26 22:08:16 · 131 阅读 · 0 评论 -
数据结构——哈希表
基本信息可参考查看《常见数据结构》哈希表的实现思路哈希表通常由数组 +链表或者数组 + 二叉树来构造。此处以数组 +链表实现:代码参考:https://www.cnblogs.com/xiaoxiongcanguan/p/10190861.html代码如下:雇员类链表类(含对链表基本的增删改查操作,此处只写出增加操作)哈希表(含对哈希表的增删改查等...原创 2020-02-25 16:41:03 · 164 阅读 · 0 评论 -
算法——常见查找算法
线性查找这一查找很简单,就是遍历对比,然后返回下标,如果要查找所有的,就把下标放到一个集合里再返回即可。二分查找需要注意这里的关键词“有序”,如果一个数组是无序的,需要先进行排序然后才能用二分查找。代码实现如下:插值查找插值查找是对二分查找的一种优化举例说明这种处理可以使得定位范围更精准。斐波那契查找辅助理解:https://...原创 2020-02-25 11:49:19 · 143 阅读 · 0 评论 -
算法——常见排序算法
基本介绍举例说明代码如下package day0515;public class demo_sort { public static void main(String[] args) { //冒泡排序算法 int[] numbers=new int[]{3, 9, -1, 10, 20}; int i,j; ...原创 2020-02-21 11:51:23 · 202 阅读 · 0 评论 -
排序算法概述与算法时间复杂度
时间频度算法的时间复杂度常见的时间复杂度注意,时间复杂度怎么理解呢?如果一段程序不会因为变量的规模而使得执行次数发生变化,那么时间复杂度就是O(1),比如下面这个代码就不会因为i = 200000就会使得代码的执行次数变多。平均时间复杂度和最坏时间复杂度空间复杂度注:本文内容来自《韩顺平_java数据结构与...原创 2020-02-21 10:52:39 · 175 阅读 · 0 评论 -
数据结构与算法——递归回溯
简单来说,递归就是方法自己调用自己。有点类似于从底层开始一步一步地往上归纳。每次调用时必须传入不同的变量,用该变量来判断作为最后退出的条件,否则递归将无限执行下去直到栈内存溢出。两个简单的小例子打印问题举例:递归的常用场景递归的使用规则我的理解:其实在逻辑上就是调用的方法里还有方法,然后方法里还有方法……只不过,当每一层里的方法都是自己时,就称之为递归。...原创 2020-02-20 18:08:31 · 311 阅读 · 1 评论 -
递归与回溯的理解
递归程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模 较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。通常来说,为了描述问题的某一状态,必须用到该状态的上一个状...转载 2020-02-20 16:41:19 · 651 阅读 · 0 评论 -
数据结构——栈
栈的应用场景数组模拟栈的思路分析代码截图如下:其他的实现参考:https://blog.csdn.net/weixin_42220532/article/details/101314493栈实现综合计算器1、使用栈来实现综合计算器 2、思路分析(示意图)要注意的一点是,一旦处理完了符号的优先级,则剩下的数据已经没有优先级的问题了,先算后...原创 2020-02-20 12:19:31 · 198 阅读 · 0 评论 -
数组和链表的区别
我们知道遍历数组和链表的时间复杂度都是O(n),但是在实际中确实数组的速度要比链表快,这是为什么呢?1、首先,数组是具有相同的数据类型且按一定次序排列的一组变量的集合体,构成一个数组的这些变量称为数组元素。数组在内存中的地址是连续相邻的,而链表在内存的地址是散列的,不连续的。2、CPU缓存会把一片连续的内存空间读入,因为数组结构是连续的内存地址,所以数组全部或者部分元素被连续存在CPU缓存...转载 2020-02-19 15:50:18 · 206 阅读 · 0 评论 -
数据结构——链表
单链表单链表的创建和遍历在学习链表之前,我还一直在想,数组在内存中是连续的,但是链表不连续,怎么去实现呢?我们难道还能像创建一个数组一样去创建一个叫做“链表”的数据结构?原来链表是通过创建节点对象来实现的,在节点对象中存放目标数据和下一个对象的内存地址。相当于在队列中需要有一个数组来存放数据一样。...原创 2020-02-20 10:51:10 · 280 阅读 · 0 评论 -
数据结构——队列
创建队列、塞值和拿值当我们创建一个LinkedList的时候,就可以用来模拟队列,因为该集合里有大量操作首尾元素的方法,之后就可以在该队列里进行数据的添加和获取。但是当我们使用数组来实现时,如何创建一个队列呢?最大值怎么确定?首尾初始值怎么确定?这一步骤中我就有了一些疑惑,如果我把创建队列、添加队列数据和删除队列数据分别用三个方法来表示,那么队列的首尾值该怎么跟随着队列呢?难道...原创 2020-02-18 15:52:37 · 194 阅读 · 0 评论 -
数组-稀疏数组
当一个二维数组中的无效数据远远大于有效数据时,可以将这个二维数组转换成一个新的数组,达到压缩内存的目的,而这个新的数组就叫做稀疏数组。说明:这里的无效数据通常是指0或者其它许多相同的数据,是稳定的、默认的。比如: 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0...转载 2020-02-17 10:19:51 · 131 阅读 · 0 评论 -
常见数据结构
注:本文内容整理自韩顺平《java数据结构与算法》先激励激励自己数据结构是指组织数据的方式,它是算法的基础。线性结构和非线性结构线性结构:是一个有序数据元素的集合。它应该满足下面的特征:集合中必存在唯一的一个“第一个元素” 集合中必存在唯一的一个“最后的元素” 除最后一元素之外,其它数据元素均有唯一的“后继 除第一个元素之外,其它数据元素均有唯一的“前驱”非线性...转载 2020-02-13 22:53:30 · 702 阅读 · 0 评论