数据结构与算法
文章平均质量分 63
重工黑大帅
希望我希望的都有希望
展开
-
快速排序
快速排序快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的中间数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序原创 2021-05-11 21:55:13 · 194 阅读 · 0 评论 -
合并排序
合并排序归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。例有8个数据需要排序:10 4 6 3 8 2 5 7归并排序主要分两大步:分解、合并。合并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二原创 2021-05-11 21:54:12 · 163 阅读 · 0 评论 -
二分搜索
二分搜索问题描述:给一个长度为n的单调递增的正整数序列,即序列中每一个数都比前一个数大。有m个询问,每次询问一个x,问序列中最后一个小于等于x的数是什么?输入:第一行两个整数n,m。接下来一行n个数,表示这个序列。接下来m行每行一个数,表示一个询问。输出:输出共m行,表示序列中最后一个小于等于x的数是什么。假如没有输出-1。样例输入:5 31 2 3 4 6513样例输出:413分析我们用Left表示询问区间的左边界,用Right表示询问区间的右边界,[Left,R原创 2021-05-11 21:52:31 · 211 阅读 · 0 评论 -
数据结构与算法之分治算法
数据结构与算法之分治算法基本概念在求解一个输入规模为n,而n的取值又很大的问题时,直接求解往往非常困难。这时,可以先分析问题本身所具有的某些特性,然后从这些特性出发,选择某些适当的设计策略来求解。这种方法,就是所谓的分治法。在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序)原创 2021-05-11 21:50:00 · 226 阅读 · 0 评论 -
乘船问题
乘船问题有n个人,第i个人重量wi,每艘船的载重量均为C,最多可乘2人。求用多少船装载所有人的方案。贪心策略:最轻的人与最重的人配对。题目有n个人,第i个人重量为wi,每艘船的最大载重量为C,且最多只能乘两个人。用最少的船装载所有人。题目保证有解。【样例输入1】65 84 85 80 84 8385【样例输出1】5【样例输入2】390 45 6090【样例输出2】3【样例输入3】550 50 90 40 60100【样例输出3】3分析从最轻的人i开始考虑:如果原创 2021-05-02 22:39:24 · 3341 阅读 · 0 评论 -
部分背包问题
部分背包问题**有n个物体,第i个物体的重量为wi,价值为vi,在总重量不超过C的情况下总价值尽量高,每个物体可以只去一部分,价值和重量按比例计算。贪心策略:先选性价比高的**题目有n个物体,第i个物体的重量为wi,价值为vi(wi, vi均为正整数)。在总重量不超过C的情况下让总价值尽量高。每一个物体都可以只取走一部分,价值和重量按比例计算。分析这里在选择物品i装入背包时,可以选择物品的一部分,而不一定要全部装入背包。一种直观的贪心策略是:引入“价重比”(价值/重量)这一概念,优先拿价重比原创 2021-05-02 22:38:21 · 584 阅读 · 0 评论 -
最优装箱问题
最优装箱问题给n个物体,第i个物体重量为wi,选择尽量多的物体,使得总量不超过C。贪心策略:先装最轻的。(不一定得到全局最优解)题目有n个物体,第i个物体的重量为wi(wi为正整数)。选择尽量多的物体,使得总重量不超过C。分析由于只关心选择的物品的最大数量(而不是最大重量,最大重量需要考虑DP),所以装重的物体没有装轻的物体划算。这里只需对n个物体按重量递增排序,依次选择每个物体直到装不下为止。这是一种典型的贪心算法,它只顾眼前,却能得到最优解。代码#include <iostrea原创 2021-05-02 22:36:57 · 1485 阅读 · 0 评论 -
数据结构与算法之贪心算法
数据结构与算法之贪心算法贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。贪心基本要素贪心选择贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。贪原创 2021-05-02 22:35:43 · 265 阅读 · 0 评论 -
哈密尔顿回路(旅行售货员问题)
哈密尔顿回路(旅行售货员问题)哈密顿图(哈密尔顿图)(英语:Hamiltonian path,或Traceable path)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其他节点且只经过一次。在图论中是指含有哈密顿回路的图,闭合的哈密顿路径称作哈密顿回路(Hamiltonian cycle),含有图中所有顶点的路径称作哈密顿路径。由来天文学家哈密顿(William Rowan Hamilton) 提出,在一个有多个城市的地图网络中,寻找一条从给定的起点到给定的终点沿原创 2021-04-22 20:03:40 · 1981 阅读 · 0 评论 -
数的划分问题
数的划分问题问题将整数n分成k份,且每份不能为空,任意两种分法不能相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同的。1,1,5; 1,5,1; 5,1,1;问有多少种不同的分法。【输入格式】n,k (6<n≤200,2≤k≤6)【输出格式】一个整数,即不同的分法。【输入样例】7 3【输出样例】4{ 4种分法为:1,1,5;1,2,4;1,3,3; 2,2,3 说明部分不必输出 }回溯法#include<cstdio原创 2021-04-22 20:01:42 · 428 阅读 · 0 评论 -
搜索与回溯算法之八皇后问题
搜索与回溯算法之八皇后问题问题要在国际象棋棋盘中放八个皇后,使任意两个皇后都不能互相吃。(提示:皇后能吃同一行、同一列、同一对角线的任意棋子。)放置第i个(行)皇后的算法为:int search(i); { int j; for (第i个皇后的位置j=1;j<=8;j++ ) //在本行的8列中去试 if (本行本列允许放置皇后) { 放置第i个皇后;对放置皇后的位置进行标记; if (i==8) 输出原创 2021-04-22 19:59:03 · 1502 阅读 · 0 评论 -
经典素数环问题
经典素数环问题问题素数环:从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。分析非常明显,这是一道回溯的题目。从1开始,每个空位有20种可能,只要填进去的数合法:与前面的数不相同;与左边相邻的数的和是一个素数。第20个数还要判断和第1个数的和是否素数。流程1、数据初始化;2、递归填数:判断第i个数填入是否合法;A、如果合法:填数;判断是否到达目标(20个已填完):是,打印结果;不是,递归填下一个;B、如果不合法:选择下一种可能;代码#include<cstdio&g原创 2021-04-22 19:57:33 · 877 阅读 · 0 评论 -
数据结构与算法之搜索与回溯算法
数据结构与算法之搜索与回溯算法搜索原理搜索算法实际上是根据初始条件和扩展规则构造一棵“解答树”并寻找符合目标状态的节点的过程。所有的搜索算法从最终的算法实现上来看,都可以划分成两个部分——控制结构(扩展节点的方式)和产生系统(扩展节点),而所有的算法优化和改进主要都是通过修改其控制结构来完成的。其实,在这样的思考过程中,我们已经不知不觉地将一个具体的问题抽象成了一个图论的模型——树,即搜索算法的使用第一步在于搜索树的建立。由图一可以知道,这样形成的一棵树叫搜索树。初始状态对应着根节点,目标状态对应着目原创 2021-04-22 19:55:14 · 1438 阅读 · 0 评论 -
数据结构与算法之递归算法
数据结构与算法之递归算法递归概念所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。我们可以把” 递归 “比喻成 “查字典 “,当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词。可惜,第二个词里仍然有不懂的词,于是查第三个词,这样查下去,直到有一个词的解释是你完全能看懂的,那么递归走到了尽头,然后你开始后退,逐个明白之前查过的每一个词,最终,你明白了最开始那个词的意思。(摘自知乎的一个回答)原创 2021-04-13 20:48:17 · 744 阅读 · 0 评论 -
数据结构与算法之倒推算法
数据结构与算法之倒推算法倒推算法概念所谓的倒推法(Inverted Recursion)是对某些特殊问题所采用的违反通常习惯的,从后向前推解问题的方法。在不知前提条件的情况下,经过从后向前递推,来求解问题的初始数据,即由结果倒过来推解它的前提条件。另外在对一些进行分析或建立数学模型时,从前向后分析问题感到比较棘手,而采用倒推法,则问题很容易理解和解决。回文日期问题:在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。牛牛习惯用8位数字表示一个日期,其中,前4位代表年份,接下来2原创 2021-04-11 20:12:22 · 2383 阅读 · 0 评论 -
数据结构与算法之递推算法
数据结构与算法之递推算法递推算法概念递推法是一种重要的数学方法,在数学的各个领域中都有广泛的运用,也是计算机用于数值计算的一个重要算法。这种算法特点是:一个问题的求解需一系列的计算,在已知条件和所求问题之间总存在着某种相互联系的关系,在计算时,如果可以找到前后过程之间的数量关系(即递推式),那么,从问题出发逐步推到已知条件,此种方法叫逆推。无论顺推还是逆推,其关键是要找到递推式。这种处理问题的方法能使复杂运算化为若干步重复的简单运算,充分发挥出计算机擅长于重复处理的特点。递推算法的首要问题是得到相邻的原创 2021-04-11 20:08:02 · 876 阅读 · 0 评论 -
数据结构与算法之迭代算法
数据结构与算法之迭代算法迭代算法的基本概念定义:迭代法(Iteration)也称为“碾转法”,是一种不断用变量的旧值递推出新值的解决问题的一种方法。迭代算法一般用于数值计算。迭代法应该是早已熟悉的算法策略。设计要点利用迭代算法策略求解问题,设计工作主要3步:1)确定迭代模型根据问题的描述,分析得出前一个(或几个)值与其下一个值的迭代关系数学模型。当然这样的迭代关系,最终会迭代出解的目标。2)建立迭代关系递推数学模型一般是带下标的字母,算法设计中要将其转化为“循环不变式”----迭代关系式,原创 2021-04-11 20:00:41 · 4696 阅读 · 0 评论 -
数据结构与算法之蛮力(穷举)算法
数据结构与算法之蛮力(穷举)算法蛮力法是基于计算机运算速度快这一特性,在解决问题时采用的一种“惰性”的策略。这种策略不经过(或者说是经过很少的)思考,把问题的所有情况或所有过程交给计算机去一一尝试,从中找出问题的解。蛮力算法的应用很广。枚举法(穷举法)是蛮力算法的一种,它对可能解的众多候选解按某种顺序逐一枚举和检验,并从中找出那些符合要求的候选解作为问题的解。这种方法简单易行,尤其是对于一时想不出更好的解法的问题,不失为一种补救的好方法。但是,这种方法只能解决变量个数有限,而且每个变量可取值个数也很有原创 2021-04-08 21:34:41 · 1364 阅读 · 0 评论 -
数据结构与算法之循环算法
数据结构与算法之循环算法循环算法基本概念我们借助计算机快速处理数据的功能,让计算机重复的加工计算,这就构成了循环算法,其关键在于构建循环条件和循环体。循环条件:每个循环有其循环的开始和结束的条件,否则死循环。循环体:每次循环执行的步骤、变量、代码形式一致,而变量内存的数据发生改变。基本的设计方法如下两种:“自顶向下”的循环算法设计方法自顶向下的设计方法是从全局走向局部、从策略走向详尽的设计方法。自顶向下是系统分解和细化的过程。首先,根据题意,总体规划设计算法的主要组成或步骤。其次,分别对各原创 2021-04-08 21:30:07 · 3765 阅读 · 0 评论 -
时空复杂度之珠心算测验
时空复杂度之珠心算测验问题珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练, 既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?最近老师出了一些测验题,请你帮忙求出答案。【输入】输入文件名为 count.in。输入共两行,第一行包含一个整数 n,表示测试题中给出的正整数个原创 2021-04-07 20:59:46 · 159 阅读 · 0 评论 -
时空复杂度简述
时空复杂度简述时间复杂度计算机的运行能力估计:做一个简单实验,让程序循环1亿次,10亿次看看需要多少时间。可以看出,一般电脑在1亿次可在1秒内完成,超过10亿次在1秒内难以完成。时间复杂度估算方法简单语句简单的赋值语句,读写语句,可以看作所用时间为常量记为O(1)。分支语句在分支语句中,以所耗费时间最多的那个分支来计算时间复杂度。循环语句在循环语句中,每循环1次记为O(1),循环n次时间复杂度为O(n)。嵌套循环在嵌套循环中,时间复杂度是多个循环的叠加,如下所示:n^2for(原创 2021-04-07 20:52:11 · 504 阅读 · 0 评论 -
时空复杂度之质数问题
时空复杂度之质数问题题目有m组数据,每组数据有n个小于1000的正整数,分别求每组数据中所有素数的和。其中1<=m<=10;1<=n<=1000;方法一:#include<stdio.h>#include <stdlib.h> int main(){ int m,n; scanf("%d",&m); for(int i=1;i<=m;i++){ int sum=0; scanf("%d",&n); fo原创 2021-04-07 20:56:21 · 271 阅读 · 0 评论