算法学习笔记
文章平均质量分 90
设立本专栏的初衷在于,我意识到我学习过的很多算法,一段时间不使用就会被我遗忘,于是决定把学习这些算法的过程记录下来,也同时分享给其他有需要的人。
烟雨平生9527
没有谁的生活会一直完美,但无论什么时候,都要看着远方,满怀希望就会所向披靡
展开
-
ACM程序设计课内实验(6)高精度
你的任务是:给定两个加数,统计进位的次数,从而帮助老师评估加法的难度。0时,输出No carry operation. 1时,输出1 carry operation. 大于1时,输出N carry operations.,注意:operations.和operation.f(0)=1,f(1)=1, f(n)=f(n-1)+f(n-2);对输入文件(最后一行除外)每一行的两个加数,计算它们进行加法运算时进位的次数并输出。输入的N小于10000,可以输入,用INT型的大数就行,用数值型的高精度!原创 2024-01-22 14:52:28 · 524 阅读 · 0 评论 -
ACM程序设计课内实验(5)递归
定义:自己调用自己(需要调用栈来执行)两个基本要素:边界条件(何时结束)和 递归模式(大问题如何转化为小问题)关键:根据递推关系式写程序(用数学归纳法证明)注意:递归算法在数据量特别大的时候会出现段错误(例如:递归运算100000000!时)原创 2023-12-14 00:43:40 · 993 阅读 · 0 评论 -
ACM程序设计课内实验(4)查找
upper_bound()与lower_bound()使用方法•都是二分函数,头文件<algorithm>• upper_bound返回第一个大于的元素的下标;• lower_bound返回第一个大于等于元素的下标;原创 2023-12-06 23:44:19 · 953 阅读 · 0 评论 -
ACM程序设计课内实验(3) 循环节问题
我们知道斐波那契数列的递推公式是f(n)=f(n-1)+f(n-2);如果有一个序列f(n)=a*f(n-1)+b*f(n-2),f(0)=0,f(1)=1。我们知道斐波那契数列的递推公式为f(n)=f(n-1)+f(n-2) n>=2 f(0)=0 f(1)=1;还有另一种斐波那契数:F(0)=7,F(1)=11,F(n)=F(n-1)+F(n-2)(n>=2)。对于每组输入数据,输出一行,是一个最小的整数m,使得f(n)%P=f(n+m)%P对每一个n成立。输入由一系列行组成,每行包含一个整数n。原创 2023-12-03 15:30:09 · 1064 阅读 · 0 评论 -
ACM程序设计课内实验(2) 排序问题
sort函数C++中的sort函数是库中的一个函数,用于对容器中的元素进行排序。qsort函数C++中的qsort函数是一个通用的排序函数,它位于头文件中。qsort函数接受一个数组、数组的大小以及一个比较函数作为参数。比较函数用于确定数组中元素的顺序。原创 2023-11-30 22:55:17 · 1079 阅读 · 0 评论 -
ACM程序设计课内实验(1)数学问题
Julius Caesar生活在一个危险而又充斥着阴谋的时代。Caesar面对的最难的情况关系着他的存亡。为了让自己生存,他决心去创造第一种加密方法之一。这个加密方法听起来是这样的令人难以置信,没有一个人可以指出它(的原文)除非知道它怎样工作。你是Caesar军队的一个分队长。你的工作是破译Caesar送来的信息并汇报给你的上级。密码很简单,每一个字母对应着一个明文,你将明文向右五步来得到安全的信息。原创 2023-11-28 23:21:08 · 868 阅读 · 1 评论 -
NEFU离散数学实验PBL
由于今年是2018年,所以BD对2018这个数字深有研究,最近又开始研究2018的因子,她想知道2018的因子和是多少,可是她觉得这个问题太简单了,没有什么挑战性,她想让你求2018^n 的因子和是多少,可是由于结果太大了,所以要求对499取模。你若有本事,一筋斗打出我这右手掌中,算你赢,再不用动刀兵苦争战,就请玉帝到西方居住,把天宫让你;输入只包括一行5个整数x,y,m,n,L,其中x≠y < 2000000000,0 < m、n < 2000000000,0 < L < 2100000000。原创 2023-11-26 21:58:50 · 1224 阅读 · 0 评论 -
NEFU离散数学实验特别篇1-树和图
10. 一颗有n个顶点的有根树,每个顶点都有度数,度数为0的顶点称为叶子顶点,度数不为0的顶点称为内部顶点,如果叶子顶点的数量为m,那么内部顶点的数量为n-m。5. 一棵有n个顶点的完全二叉树,深度为h,共有2^h个结点,其中叶子结点数为2^(h-1)或2^h。4. 一棵有n个顶点的满二叉树,深度为h,共有2^(h+1)-1个结点,其中叶子结点数为2^h。7. 一棵n个结点的树,最多h=n-1,最小为1,树的高度即为树的深度。6. 一棵二叉树的深度为h,最多有2^h-1个结点,最少有h个结点。原创 2023-11-01 21:31:36 · 643 阅读 · 0 评论 -
NEFU离散数学实验4-数论
3.欧几里得算法(Euclidean algorithm):一种求最大公约数的算法,它基于这样一个事实:对于任意两个正整数a和b,有GCD(a,b) = GCD(b,a mod b)(其中mod表示取模运算),而且GCD(a, 0) = a。11.欧拉降幂定理(Euler's reduced power theorem):如果a和n是正整数且互质,则对于任意的整数b,有a^b ≡ a^(b mod φ(n) + φ(n)) (mod n)。求关于 x的同余方程 ax≡c(mod b) 的最小正整数解。原创 2023-10-31 22:39:36 · 572 阅读 · 0 评论 -
NEFU离散数学实验3-递推方程
例如,斐波那契数列的递推关系式为f(n) = f(n-1) + f(n-2)。递推方程是指一种递归定义,它将问题拆分成更小的子问题,并使用这些子问题的解来计算原问题的解。1. 递推公式:递推公式是指将一个问题拆分成更小的子问题,并使用这些子问题的解来计算原问题的解的公式。4. 通项公式:通项公式是指将递推公式表示为一个包含n的表达式,直接计算第n项的值。输入数据有多组,每组有1个正整数n(1<=n<=10),代表方格的个数。输入数据有多组,每组有1个正整数n(1<=n<=10),代表编码的长度。原创 2023-10-27 10:39:29 · 602 阅读 · 0 评论 -
NEFU离散数学实验2-容斥原理
所以,将这两种情况相加,并乘以(n-1),即可得到n个元素的错位排列个数。利用容斥原理,我们可以将问题转化为求解有多少种情况满足至少有一个新郎找错的情况,然后再减去有两个新郎找错的情况,再加上有三个新郎找错的情况,依此类推,直到加上有M个新郎找错的情况。其中,|A|表示集合A的元素个数,|A∪B∪C|表示集合A、B和C的并集的元素个数,|A∩B|表示集合A和B的交集的元素个数,以此类推。其中,|A|表示集合A的元素个数,|A∪B|表示集合A和B的并集的元素个数,|A∩B|表示集合A和B的交集的元素个数。原创 2023-10-18 22:18:44 · 512 阅读 · 0 评论 -
NEFU离散数学实验1-排列组合
相关概念在离散数学中,组合数是一种用于计算从n个不同元素中选取m个元素的方式。以下是一些与组合数相关的概念:排列:从n个不同元素中选取m个元素进行排列,排列数用P(n, m)表示,计算公式为P(n, m) = n!/ (n - m)!组合:从n个不同元素中选取m个元素进行组合,组合数用C(n, m)表示,计算公式为C(n, m) = n!/ (m!* (n - m)!二项式系数:组合数也称为二项式系数,表示为C(n, m)。原创 2023-10-11 22:48:38 · 485 阅读 · 0 评论 -
算法设计与分析期末总结
基本是为了我自己看的一些我容易忘记的东西,为考试作准备把,主要使后半部分的知识,前半部分请看。原创 2023-05-24 10:31:41 · 1226 阅读 · 1 评论 -
算法小课堂(十)随机化算法
随机化算法概述是一个关于随机化算法的简单介绍。随机化算法是一种在算法中使用了随机函数的算法,随机函数的返回值会影响算法的执行流程或结果1。根据算法的性质,随机化算法可以分为数值随机算法、舍伍德算法、拉斯维加斯算法和蒙特卡罗算法。原创 2023-05-19 19:43:11 · 2886 阅读 · 1 评论 -
算法小课堂(九)分支限界法
分支限界法是一种求解最优化问题的算法,常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。其基本思想是把问题的可行解展开,再由各个分支寻找最佳解。在分支限界法中,分支是使用广度优先策略,依次生成扩展结点的所有分支。限界是在结点扩展过程中,计算结点的上界,搜索的同时剪掉某些分支。原创 2023-05-19 16:54:03 · 13297 阅读 · 3 评论 -
NEFU-2023-算法设计与分析实验四 回溯算法设计
如要系统学习可看我的另一篇博客。原创 2023-04-24 18:14:15 · 328 阅读 · 0 评论 -
NEFU-2023-算法设计与分析实验三 贪心算法设计
平均等待时间是n 个顾客等待服务时间的总和除以n。k+1个整数:表示第k个加油站与第k-1个加油站之间的距离。第一行是正整数n,表示有n 个顾客。接下来的1行中,有n个正整数,表示n个顾客需要的服务时间。接下来的n行中,每行有2 个整数,分别表示闭区间的2个端点。去掉尽可能少的闭区间,使剩下的闭区间都不相交。对于给定的n个顾客需要的服务时间,编程计算最优服务次序。算法设计:对于给定的n和k个加油站位置,计算最少加油次数。给定n 个闭区间,编程计算去掉的最少闭区间数。计算出的去掉的最少闭区间数。原创 2023-04-24 16:20:44 · 492 阅读 · 0 评论 -
NEFU-2023-算法设计与分析实验二动态规划算法设计
因此,他把对每件物品的渴望程度,分为5等级:用整数1->5表示,第5等表示最想要。他希望在不超过N元(可能等于N元)的情况下,将每件商品的价格与效益度的乘积的总和最大化.问题描述:给定两个序列X={x1,x2,...,xm}和Y={y1,y2,...,yn},找出X和Y的最长公共子序列。设第j件物品的价格为p[j],重要度为w[j],其选中的k件商品,编号依次为j1,j2,……对应的子问题为: f(i+1,j) 和 f(i+1,j+1)第2行:第1个子序列的各个元素(序列下标从1开始)原创 2023-04-23 23:43:11 · 629 阅读 · 0 评论 -
NEFU-2023-算法设计与分析实验一递归与分治算法设计
大底包含了算法硬性规定的作业代码,并非最优解,仅供参考并会持续更新。勿要无脑copy,对自己负责。如果代码有误或者优化建议,直接相应博客下方评论或者qq找我如果对代码有理解不了的或者疑惑可以询问我,但是请确保你已经自己思考过或者查过搜索引擎(如果我原模原样搜到了资料的话我会锤你的hh)。一些语法和库的资料查询网站受个人风格影响,部分题目解题方式可能没按照教学要求,如有必要请自己按教学要求做一遍。如果可以的话,麻烦借鉴完以后给我博客来个三连啥的,这可能对我以后找工作或者其他博客的推广什么的有些帮助,感谢原创 2023-03-27 10:56:21 · 455 阅读 · 0 评论 -
算法设计与分析阶段考总结
基本是为了我自己看的一些我容易忘记的东西,为考试作准备把。原创 2023-04-15 16:45:29 · 718 阅读 · 0 评论 -
算法小课堂(七)字符串
0C++中有两种字符串表示形式:C风格字符串和string类类型。C风格字符串是而string类处理起字符串来会方便很多,完全可以代替C语言中的字符数组或字符串指针。使用string类需要文件包含: #include原创 2023-05-11 00:02:45 · 521 阅读 · 0 评论 -
算法小课堂(六)回溯算法
回溯算法是一种系统地搜索问题的解的方法。某个问题的所有可能解的称为问题的解空间,若解空间是有限的,则可将解空间映射成树结构。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。回溯是递归的副产品,只要有递归就会有回溯。回溯法就是暴力搜索,并不是什么高效的算法,最多在剪枝一下。原创 2023-04-22 23:50:37 · 999 阅读 · 3 评论 -
算法小课堂(五)贪心算法
贪心算法是一种常见的算法思想,用于解决优化问题。其基本思想是在每一步选择中都采取当前状态下最优的选择,从而希望能够获得全局最优解。然而,贪心算法并不总是能够得到全局最优解,因为其仅考虑当前局部最优解,并没有考虑到未来可能出现的情况。因此,在使用贪心算法时需要仔细思考问题本身的性质,并根据具体问题来选择合适的贪心策略。原创 2023-04-10 22:22:39 · 1676 阅读 · 2 评论 -
算法小课堂(四)动态规划
线性DP(Dynamic Programming)是指一种使用动态规划的方法解决问题的过程。通常来说,线性DP可以分为两种,即基于序列的线性DP和基于区间的线性DP。基于序列的线性DP通常解决的是序列上的问题,如最长上升子序列(LIS)、最长公共子序列(LCS)等。这类问题的主要思路是定义状态,设计状态转移方程,以及求解最终结果。在设计状态转移方程时,需要考虑当前状态和之前状态之间的关系,以及如何根据之前的状态计算当前状态。在实现上,通常需要使用一维或二维数组来保存状态值。原创 2023-04-05 01:01:23 · 1298 阅读 · 4 评论 -
算法小课堂(三)数论gcd和ex_gcd
最大公约数(Greatest Common Divisor,简称GCD)指的是两个或多个整数共有约数中最大的一个。比如,6和15的最大公约数为3,而12和18的最大公约数为6。最大公约数在数论、代数和计算机科学中都有广泛的应用。原创 2023-03-26 18:10:18 · 1294 阅读 · 0 评论 -
算法小课堂(二)递归与分治
算法设计与分析是计算机科学的一个重要领域,其目的是设计高效的算法并评估其性能。递归与分治是算法设计与分析中两个基本的概念。递归是一种解决问题的方法,其中问题被逐步分解为更小的子问题,直到问题的规模变得足够小,可以直接解决。递归算法通常包括一个递归函数,该函数调用自身来解决更小的子问题,直到达到基本情况,然后返回结果。递归算法在许多领域都有应用,如排序、搜索、树和图等数据结构的操作。分治是一种算法设计策略,其中问题被分成相互独立的子问题,这些子问题分别求解,然后将它们的解合并起来以得到原始问题的解。原创 2023-03-19 23:50:05 · 1091 阅读 · 1 评论 -
算法小课堂(一)暴力枚举
暴力枚举是一种简单朴素的算法思想,也称为穷举算法。其基本思想是对问题的所有可能情况进行逐一尝试,并从中找到符合条件的解决方案。暴力枚举算法通常通过循环或递归实现,其时间复杂度与问题规模成指数级关系,因此对于较大规模的问题不适用,但对于一些小规模问题,暴力枚举算法往往是可行的。在实现上,暴力枚举算法通常采用循环或递归的方式来实现。循环实现通常是嵌套多层循环,逐个枚举每个可能的情况,并在内层循环中对每种情况进行检查;递归实现则是将问题分解为更小的子问题,逐层递归求解,直到找到符合条件的解。原创 2023-03-19 00:09:08 · 2134 阅读 · 3 评论