数据结构和算法
文章平均质量分 64
Gnomeshgh9
Special
展开
-
最小生成树的prim算法概述和实现
C++实现prim算法,求解最小生成树问题原创 2022-04-19 20:08:23 · 1092 阅读 · 0 评论 -
线段树再掌握(线段树的实现)
想学会手写线段树吗,这篇文章为你介绍线段树的C语言实现,并带你解决一个实际问题。原创 2022-03-01 19:51:48 · 308 阅读 · 0 评论 -
初识线段树(线段树的来源与基本结构)
想了解关于线段树的来源以及其基本知识吗,请看这篇文章吧,一定会对你有所帮助。原创 2022-02-28 22:39:09 · 199 阅读 · 0 评论 -
中缀表达式转后缀表达式并求值
想要自己手写一个计算器吗,快来看这篇博客吧,这篇博客会教你从0开始实现一个自己的简易计算器,当然了,你需要有一点点的计算机基础知识,比如对栈这个结构有一丝丝的印象。原创 2022-02-05 19:37:47 · 3555 阅读 · 1 评论 -
堆栈的实现和逆波兰表达式的求值
想了解堆栈使用C语言如何进行实现吗?想知道如何使用堆栈进行逆波兰表达式的求值吗?快来看这篇博客吧~~原创 2022-02-03 14:33:38 · 536 阅读 · 0 评论 -
基数排序超详细讲解
基数排序例子假设我们有如下一堆数字:我们先以个位的大小对其进行排序,得到的结果就是:再以十位的大小对其进行排序,得到的结果是:最后以百位的大小进行排序,得到的结果是:这样我们就得到了最后有序的数组原理基数排序可以分为高位基数排序和低位基数排序两种,我们这里举例为低位的基数排序实现这一操作必须保证的是:我们这个操作必须是稳定的,也就是说原来在前面的元素,如果两个值相等的话,原来在前的元素排序后依然在前面这样我们对个位排序过后,排序后的数字个位及以下的数字就是有原创 2021-10-11 11:11:51 · 224 阅读 · 0 评论 -
堆排序超详细讲解
堆排序完全二叉树 新节点的生成按照从左到右,从上到下的规则生成的二叉树叫做完全二叉树。如下图所示 这样的树有很好的特征可以让我们利用,我们从上到下,从左到有依次给节点编号后,有如下规律:i 号节点的左孩子 = 2 * i + 1 ,i 号节点的右孩子 = 2 * i + 2i 号节点的父亲 = (i-1)/2 知道了这些特点后,我们说一下堆堆 堆又可以分为大根堆和小根堆,这里我们以大跟堆为例 如上图所示,每一个父节点都比自己的两个孩子节点要大,这样形成的完全二叉树被称为一原创 2021-10-10 09:55:49 · 295 阅读 · 0 评论 -
二分查找算法
二分查找简介:在有序数组中查找出某个符合条件的值思路:指定一个区间,符合条件的值就在这个区间中,定义区间的左边界和右边界,求出左右边界的中间位置,判断中间位置是不是符合标准,无论是否符合标准,都将搜索的区间缩小一般,循环判断,这样就可以很快的找到我们需要的值。两种经典类型:查找某个指定的值判断这个数列中是不是存在某个值。对数组进行升序排列定义 left 和 right ,找到mid,判断mid是不是等于指定的值如果mid值等于目标值,直接返回mid如果mid值大于目标值,righ原创 2021-08-04 18:07:49 · 62 阅读 · 0 评论 -
Dijkstra算法介绍
Dijkstra算法介绍:需求:求某个点到图中各个点的最短路径。这里我自己画了一个图来方便学习。求A节点到其他各个节点要走的最短长度。为了方便描述,我将图抽象成这个样子。介绍:迪杰斯特拉算法用于求单源的最短路径问题迪杰斯特拉不适用于边的权值存在负数的图算法思路:将所有的节点分为两类,一类是已经确定了到目的地最短路径的节点,一类是没有确定的定义一个数组,用来保存所有点到目的节点的最短距离。每次遍历,从没有确定的节点中找到一个节点,放到已经确定的节点中,并在添加进去的时候,维护所有原创 2021-08-02 21:22:55 · 147 阅读 · 0 评论 -
生成二进制反射格雷码
递归生成二进制反射格雷码:需求: 我们使用递归的方式来生成二进制的反射格雷码。什么是格雷码? 典型的二进制格雷码(Binary Gray Code)简称格雷码,因1953年公开的弗兰克·格雷(Frank Gray,18870913-19690523)专利“Pulse Code Communication”而得名,当初是为了通信,现在则常用于模拟-数字转换和位置-数字转换中。法国电讯工程师波特(Jean-Maurice-Émile Baudot,18450911-19030328)在1880年曾用原创 2021-04-23 08:34:05 · 1356 阅读 · 0 评论 -
拓扑排序
拓扑排序:概述: 一个概念的诞生离不开实际问题的提出。大学有很多门课,其中一些课刚上大学就可以学,有一些需要一些先修课,我们要怎么安排上课的顺序来保证上课的效率。如何解决这个实际问题,就引出了拓扑排序。 拓扑排序是对有向无环图进行排序的一种算法。有向:显而易见,我们的先修关系是需要有方向的,所以图一定要是有向的。无环:如果两门课互为先修课,那么该问题就无解。所以要保证这个图的无环的。 具体如何对图进行排序,我们这里介绍两种方案:基于深度优先查找的一个简单应用:执行一次DFS遍历,并记住原创 2021-04-23 08:28:58 · 94 阅读 · 0 评论 -
深度优先搜索和广度优先搜索
深度优先搜索和广度优先搜索 在人工智能也运筹学的领域中求解与图相关的应用中,这两个算法被证明是非常有用的,而且,如需高效地研究图的基本性质,例如图的连通性以及图是否存在环,这些算法也是必不可少的。深度优先搜索 深度优先搜索可以从任意顶点开始访问图的顶点,然后把该顶点标记为已访问,在每次迭代中,该算法紧接着处理与当前顶点邻接的未访问的顶点。这个过程一直持续,直到遇到一个终点——该顶点的所有邻接点都已经被访问过。在该终点上,该算法沿着来路后退一条边,并试着继续从哪里访问未访问的顶点,在后退到起始顶原创 2021-04-23 08:24:39 · 199 阅读 · 0 评论 -
计算第n个斐波那契数
计算第n个斐波那契数斐波那契数列 又称为“兔子数列”,最初该数列是为了解决兔子繁殖问题而提出的。问题如下: 如果一对兔子每个月能剩一对兔子,而每对兔子在它出生后第三个月,又能开始生一对兔子。加入兔子没有死亡,由一对兔子开始,50个月之后会有多少对兔子。 抽象成数学表达式既为:解决方案 待选的解决方案有两种我们可以根据计算机的特性,通过递推表达式来简单粗暴地求出从2到n所有的斐波那契数。当然我们要承担这一过程所消耗的庞大的时间成本既然有递推表达式,我们可以求解这个带常系数的齐次二次线原创 2021-04-23 08:34:35 · 666 阅读 · 0 评论 -
汉诺塔详解
汉诺塔描述: 我们有n个不同大小的盘子和三根木桩,一开始所有的盘子都按照大小顺序套在第一个木桩上,最大的盘子在底部,最小的盘子在顶部。我们的目的就是把所有的盘子都移动到第三根木桩上,在必要的时候可以借助第二个木桩。我们每次只能移动一个盘子,但是不能把较大的盘子放在较小的盘子的上面思路: 这个题是大多数人接触到递归时的第一题,本身这个问题比较难解,非递归的实现很困难,但是我们可以根据计算机的特性,设计一种优雅而又巧妙的解题方案。 整个解题的过程其实只有三步,就像把大象放进冰箱一样一共n个盘原创 2021-04-22 19:07:37 · 354 阅读 · 0 评论 -
算法分析框架
分析框架时间复杂度:指出正在讨论的算法运行的有多快空间复杂度:关心算法需要的额外空间分析框架概要算法的时间效率和空间效率都用输入规模的函数进行度量我们用算法基本操作的执行次数来度量算法的时间效率。通过计算算法消耗的额外存储单元的数量来度量空间效率。在输入规模相同的情况下,有些算法的效率会有显著差异,对于这样的算法,我们需要区别最差效率,平均效率和最优效率。本框架关心一点:当算法输入规模趋近于无穷大时,它的运行时间函数的增长次数分析非递归算法效率的通用方案:决定用哪个参数原创 2021-04-22 19:03:15 · 401 阅读 · 0 评论 -
常见的数据结构
常见的数据结构1. 线性表概述: 常见的就是数组,我们只要指定数组的下标(index)就能访问它,大多数情况下,数组的下标都是整数,有时也可以使用非数字的下标,如在C语言中可以指定字符作为下标(在底层依然是数字)。 数组可以实现很多其他结构,如字符串,由0和1组成的字符串称为二进制串,或位串,字符串的操作不同于数组的操作,字符串的操作常见为求字符串的长度、按字典顺序进行排序、以及连接两个字符串构成一个新字符串、等等。2. 链表概述: 链表是0个或多个称为节点的元素构成的序列,每个节点包括原创 2021-04-22 18:56:47 · 884 阅读 · 0 评论 -
欧几里得算法
拓展欧几里得算法:1. 概述:不仅能求出两个正整数m和n的最大公因数d,还能求出两个整数x和y(不一定为正)使得mx+ny=d2. 分析:这个其实挺简单的步骤如下:我们假设m的d的a倍;n的d的b倍,而a和b我们是可以通过求最大公因数d来求出来的原式可以化为:ax+by=1;这就是一个简单的一次方程了,我们可以得到方程的无穷多种解;对于给定的x,y=(1-ax)/ b。这种情况给出的是一般解,我们要给出整个方程的通解这个一个非齐次方程,通解等于对应齐次方程的通解+自身的一个特解最后原创 2021-04-22 18:46:54 · 182 阅读 · 0 评论 -
欧几里得游戏
欧几里得游戏1. 简介: 一开始,板上写有两个不相等的整整数,两个玩家交替写数字,每一次,当前玩家都必须在板上写出任意两个板上的数字的差,而且这个数字必须是新的,也就是说,不能与板上任何一个已有的数字相同,当玩家再也写不出来新的数字时,他就输了,请问,你是选择先行动还是后行动2. 分析:这个游戏考察了欧几里得算法,我们容易得知:当两个数都是偶数时,此时能填的所有数字都是偶数填的第一个数字总是两个数字的差填的数字总是这两个数字的最大公因数的倍数,且这个数字不会大于这两个数字中任意的一个思路原创 2021-04-22 18:43:48 · 1490 阅读 · 0 评论 -
埃拉托色尼筛法求不大于n的质数序列
埃拉托色尼筛法求不大于n的质数序列主要思想:从2开始,将待选序列中2的倍数全部剔除,在此基础上,将3的倍数全部剔除,同时循环这个过程,到最后,得到的序列就是我们所要求的所有序列Java代码实现:public int[] findExponentNotGreaterThanN(int n){ /** * 定义一个数组存储数字,并给数字都赋值 * */ int [] a=new int[n+1]; for (int i = 0; i <= n; i++)原创 2021-04-22 18:35:52 · 274 阅读 · 0 评论 -
求解最大公因数的欧几里得算法
求解最大公因数的欧几里得算法求解最大公因数和最小公倍数的时候,可以根据最简单的暴力思想来遍历,但是古人也有更好的智慧。暴力解法就不多说了,很简单,但是也很慢。欧几里得算法:辗转相除法:将求解最大公因数转换为求解余数表示为gcd(max,min)=gcd(min,max mod min);这个可以使用递归实现,也可以使用非递归的方式。递归Java实现:public int reFindGCD(int a,int b){ int min=Math.min(a,b); int ma原创 2021-04-22 18:33:27 · 199 阅读 · 0 评论 -
中缀表达式转后缀表达式步骤
中缀表达式转后缀表达式步骤遍历原式子,如果遇到数字,直接进入待测区如果遇到右括号,我们在栈中找左括号,把之前的全都进入待测区如果是加减号,先判断是不是空栈,如果是空栈就直接放入栈中,如果不是空栈,开始判断其优先级是否大于栈顶元素的优先级如果栈顶元素优先级高就将目前栈顶的元素压入待测区如果栈顶元素优先级小就将加减放入栈中。注意,这里的栈保存的字符的优先级的一定是非递减的,(也就是说不存在+ -同时在栈中)如果是乘除号,处理方法和加减相同,只是这里判断优先级的时候更简单点。比* /优原创 2021-04-22 11:17:45 · 293 阅读 · 0 评论