算法分析经典算法题

合集下载

算法与分析试题及答案

算法与分析试题及答案

1、对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或))(()(n g n f Ω=或))(()(n g n f θ=,并简述理由。

(12分)(1) ;5log )(;log )(2+==n n g n n f(2) ;100)(;2)(2n n g n f n ==(3) ;3)(;2)(n n n g n f ==2、试用分治法实现有重复元素的排列问题:设),...,,{21n r r r R =是要进行排列的n 个元素,其中元素n r r r ,...,,21可能相同,试计算R 的所有不同排列。

(13分)3、试用分治法对一个有序表实现二分搜索算法。

(12分)4、试用动态规划算法实现0-1闭包问题。

(15分)5、试用贪心算法求解下列问题:将正整数n 分解为若干个互不相同的自然数之和,使这些自然数的乘积最大。

(15分)6、试用动态规划算法实现最大子矩阵和问题:求n m ⨯矩阵A 的一个子矩阵,使其各元素之各为最大。

(15分)7、试用回溯法解决下列整数变换问题:关于整数i 的变换f 和g 定义如下:⎣⎦2/)(;3)(i i g i i f ==。

对于给定的两个整数n 和m ,要求用最少的变换f 和g 变换次数将n 变为m 。

(18分)1、(1) 证明:O(f)+O(g)=O(f+g) (7分)(2) 求下列函数的渐近表达式:(6分)3n 2+10n; 21+1/n;2、对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或))(()(n g n f Ω=或))(()(n g n f θ=,并简述理由。

(15分)(1) ;5log )(;log )(2+==n n g n n f (2) ;)(;log )(2n n g n n f ==(3) ;log )(;)(2n n g n n f ==3、试用分治法对数组A[n]实现快速排序。

(13分)4、试用动态规划算法实现最长公共子序列问题。

算法分析试题.doc

算法分析试题.doc

1-1什么叫数据?什么叫数据元素?什么叫数据项?1-2什么叫数据的物理结构?什么叫数据的存储结构?什么叫数据的操作?1-3数据结构课程主要讨论哪三个方面的问题?1-4分别画岀线性结构、树结构和图结构的逻辑示意图。

1-5什么叫类型?什么叫数据类型?什么叫抽象数据类型?1-6怎样利用抽象数据类型设计大型软件?1-7什么叫算法?算法的5个性质是什么?1-8根据算法的性质解释算法和程序的区别?1-9评判算法的优劣有哪几种方法?1-10什么叫算法的时间复杂度?怎样表示算法的时间复杂度?1-11设n为已在算法前边定义的整数类型,并已知n为正整数,分析下列各算法中加下划线语句的执行次数,并给出各算法的吋间复杂度T(n)o(1)int i = 1, k = 0;while (i < n-1){k = k+ 10* i:i 二i + 1;}(2)int i = 1, k = 0;do{k 二k + l()*i:i 二i + 1;} while (i != n);(3)inti= 1J = 1;while (i <= n && j <= n){i= i+ l;j=j+ 1;}(4)int x = n; /* n > 1 */int y = 0;while(x >= (y+l)*(y+l))y++;(5)int i, j, k, x = 0;for (i = 0; i < n; i++)for(j = 0;j<i;j++)for (k = 0; k < j; k++)x = x + 2;1-12设求解同一个问题有三种算法,三种算法各白的时间复杂度分别为0(/丿,0(2”丿和0(Mg n),哪种算法最可取?为什么?1-13按增长率从小到大的顺序排列下列各纽函数:(1)2," , (3/2) “, (2/3) \ (4/3) “(2)n, n?Z2> n2Z?, n!, n"(3)lb n, nxlb n, n2-1什么叫线性表?2-2什么叫顺序存储结构?什么叫链式存储结构?2-3给出线性表的抽象数据类型定义。

C语言经典算法100例

C语言经典算法100例

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?__________________________________________________________________程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....___________________________________________________________________程序源代码:m a i n(){l o n g f1,f2;i n t i;f1=f2=1;f o r(i=1;i<=20;i++){p r i n t f("%12l d%12l d",f1,f2);i f(i%2==0)p r i n t f("\n");/*控制输出,每行四个*/f1=f1+f2;/*前两个月加起来赋值给第三个月*/f2=f1+f2;/*前两个月加起来赋值给第三个月*/}}上题还可用一维数组处理,y o u t r y!题目:判断101-200之间有多少个素数,并输出所有素数。

__________________________________________________________________程序分析:判断素数的方法:用一个数分别去除2到s q r t(这个数),如果能被整除,则表明此数不是素数,反之是素数。

___________________________________________________________________程序源代码:#i n c l u d e"m a t h.h"m a i n(){i n t m,i,k,h=0,l e a p=1;p r i n t f("\n");f o r(m=101;m<=200;m++){k=s q r t(m+1);f o r(i=2;i<=k;i++)i f(m%i==0){l e a p=0;b r e a k;}i f(l e a p){p r i n t f("%-4d",m);h++;i f(h%10==0)p r i n t f("\n");}l e a p=1;}p r i n t f("\n T h e t o t a l i s%d",h);}题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。

算法设计与分析课后习题

算法设计与分析课后习题

第一章1. 算法分析题算法分析题1-1 求下列函数的渐进表达式(1). 3n^2 + 10n < 3n^2 + 10n^2 = 13n^2 = O(n^2)(2). n^2 / 10 + 2^n当n>5是,n^2 〈2 ^n所以,当n >= 1时,n^2/10 〈2 ^n故:n^2/10 + 2^n < 2 ^n + 2^n = 2*2^n = O(2^n)(3). 21 + 1/n < 21 + 1 = 22 = O(1)(4). log(n^3)=3log(n)=O(log(n))(5). 10log(3^n)= (10log3)n = O(n)算法分析题1—6(1)因为:f(n)=log(n^2) = 2log(n); g(n) = log(n) + 5所以:f(n)=Θ(log(n)+5)=Θ(g(n))(2)因为:log(n) 〈√n ; f(n)= 2log(n);g(n)=√n所以:f(n)= O(g(n))(3)因为:log(n)< n;f(n) = n;g(n) = log(n^2) = 2log(n)所以;f(n)= Ω(g(n))(4)因为:f(n) = nlogn +n; g(n) = logn所以:f(n) =Ω(g(n))(5)因为: f(n)= 10;g(n) = log(10)所以:f(n)=Θ(g(n))(6)因为: f(n)=log^2(n);g(n)= log(n)所以:f(n) ==Ω(g(n))(7)因为: f(n) = 2^n < 100*2^n; g(n)=100n^2; 2^n > n ^2所以:f(n)= Ω(g(n))(8)因为:f(n)= 2^n; g(n)= 3 ^n;2 ^n 〈3 ^n所以:f(n)= O(g(n))习题1-9 证明:如果一个算法在平均情况下的计算时间复杂性为Θ(f(n)),该算法在最坏情况下所需的计算时间为Ω(f(n)).分析与解答:因此,Tmax(N) = Ω(Tavg(N)) = Ω(Θ(f(n)))=Ω(f(n))。

算法分析与设计试题及答案

算法分析与设计试题及答案

算法分析与设计试题及答案一、选择题1. 下列哪个是属于分治算法的例子?A. 冒泡排序B. 归并排序C. 顺序查找D. 选择排序答案:B2. 在排序算法中,时间复杂度最优的是:A. 冒泡排序B. 插入排序C. 归并排序D. 快速排序答案:C3. 哪个不是动态规划的特点?A. 具有重叠子问题B. 通过递归求解C. 需要保存子问题的解D. 具有最优子结构答案:B4. 在图的广度优先搜索算法中,使用的数据结构是:A. 栈B. 队列C. 数组D. 堆栈答案:B5. 在最小生成树算法中,下列哪个不属于贪心策略?A. Kruskal算法B. Prim算法C. Dijkstra算法D. Prim-Kruskal混合算法答案:C二、简答题1. 请简述分治算法的思想和应用场景。

答案:分治算法的思想是将原问题分解成若干个规模较小且类似的子问题,然后解决子问题,最后将子问题的解合并得到原问题的解。

其应用场景包括排序算法(如归并排序、快速排序)、搜索算法(如二分查找)等。

2. 什么是动态规划算法?请给出一个动态规划算法的示例。

答案:动态规划算法是一种通过将问题分解成子问题并解决子问题来解决复杂问题的方法。

它的特点是具有重叠子问题和最优子结构性质。

以斐波那契数列为例,可以使用动态规划算法求解每一项的值,而不需要重复计算。

3. 图的深度优先搜索和广度优先搜索有什么区别?答案:图的深度优先搜索(Depth First Search,DFS)是一种先访问子节点再访问兄弟节点的遍历算法,通常使用递归或者栈实现。

而广度优先搜索(Breadth First Search,BFS)则是以层次遍历的方式展开搜索,使用队列来实现。

DFS更适合用于搜索路径,BFS则适用于寻找最短路径等。

4. 请简述贪心算法的特点及其应用场景。

答案:贪心算法的特点是每一步都采取当前状态下最优的选择,以期望得到全局最优解。

然而,贪心算法并不一定能求解所有问题的最优解,但对于一些特定问题,贪心算法往往能得到近似最优解。

算法分析与设计试题

算法分析与设计试题

一、选择题(20分)1.最长公共子序列算法利用的算法是(B )。

A、分支界限法B、动态规划法C、贪心法D、回溯法2.实现棋盘覆盖算法利用的算法是(A )。

A、分治法B、动态规划法C、贪心法D、回溯法3.下面是贪心算法的基本要素的是(C )。

A、重叠子问题B、构造最优解C、贪心选择性质D、定义最优解4.回溯法的效率不依赖于下列哪些因素( D )A.满足显约束的值的个数B. 计算约束函数的时间C. 计算限界函数的时间D. 确定解空间的时间5.下面哪种函数是回溯法中为避免无效搜索采取的策略(B )A.递归函数 B.剪枝函数C。

随机数函数 D.搜索函数6.采用最大效益优先搜索方式的算法是(A )。

A、分支界限法B、动态规划法C、贪心法D、回溯法7.贪心算法与动态规划算法的主要区别是(B )。

A、最优子结构B、贪心选择性质C、构造最优解D、定义最优解8. 实现最大子段和利用的算法是(B )。

A、分治策略B、动态规划法C、贪心法D、回溯法9.优先队列式分支限界法选取扩展结点的原则是(C )。

A、先进先出B、后进先出C、结点的优先级D、随机10.下列算法中通常以广度优先方式系统搜索问题解的是(A)。

A、分支限界法B、动态规划法C、贪心法D、回溯法二、填空题(22分每空2分)1.算法是由若干条指令组成的有穷序列,且要满足输入、输出、确定性和有限性四条性质。

2、大整数乘积算法是用分治法来设计的。

3、以广度优先或以最小耗费方式搜索问题解的算法称为分支限界法。

4、舍伍德算法总能求得问题的一个解。

5、贪心选择性质是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。

6.快速排序template<class Type>void QuickSort (Type a[], int p, int r){if (p<r) {int q=Partition(a,p,r);QuickSort (a,p,q-1); 哈密顿环问题的算法可由回溯法设计实现。

算法分析复习题目及答案16-12-10

算法分析复习题目及答案16-12-10

一。

选择题1、二分搜索算法是利用( A )实现的算法。

A、分治策略B、动态规划法C、贪心法D、回溯法2、下列不是动态规划算法基本步骤的是( D )。

A、找出最优解的性质B、构造最优解C、算出最优解D、定义最优解3、最大效益优先是( A )的一搜索方式。

A、分支界限法B、动态规划法C、贪心法D、回溯法5. 回溯法解旅行售货员问题时的解空间树是()。

A、子集树B、排列树C、深度优先生成树D、广度优先生成树6.下列算法中通常以自底向上的方式求解最优解的是( B )。

A、备忘录法B、动态规划法C、贪心法D、回溯法注意:动态规划采用的是自底向上的方式求解,而贪心算法采用的是自顶向下的方式来求解问题。

7、衡量一个算法好坏的标准是(C )。

A 运行速度快B 占用空间少C 时间复杂度低D 代码短8、以下不可以使用分治法求解的是(D )。

A 棋盘覆盖问题B 选择问题C 归并排序D 0/1背包问题9. 实现循环赛日程表利用的算法是( A )。

A、分治策略B、动态规划法C、贪心法D、回溯法11.下面不是分支界限法搜索方式的是( D )。

A、广度优先B、最小耗费优先C、最大效益优先D、深度优先12.下列算法中通常以深度优先方式系统搜索问题解的是( D )。

A、备忘录法B、动态规划法C、贪心法D、回溯法13.备忘录方法是那种算法的变形。

( B )A、分治法B、动态规划法C、贪心法D、回溯法注意:备忘录是动态规划方法的一个步骤。

14.哈弗曼编码的贪心算法所需的计算时间为( B )。

A、O(n2n)B、O(nlogn)C、O(2n)D、O(n)15.分支限界法解最大团问题时,活结点表的组织形式是( B )。

A、最小堆B、最大堆C、栈D、数组16.最长公共子序列算法利用的算法是( B )。

A、分支界限法B、动态规划法C、贪心法D、回溯法17.实现棋盘覆盖算法利用的算法是( A )。

A、分治法B、动态规划法C、贪心法D、回溯法18.下面是贪心算法的基本要素的是( C )。

算法经典必刷题

算法经典必刷题

算法经典必刷题
以下是一些经典的算法必刷题目,供您参考:
1. 两数之和(LeetCode 1):给定一个整数数组 nums 和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。

2. 三数之和(LeetCode 498):给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有
满足条件且不重复的三元组。

3. 最长回文子串(LeetCode 5):给定一个字符串 s,找到 s 中最长的回
文子串。

你可以假设 s 的最大长度为 1000。

4. 二分查找(LeetCode 7):给定一个排序数组和一个目标值,在数组中
查找目标值,并返回其索引。

如果目标值不存在于数组中,则返回 -1。

5. 盛最多水的容器(LeetCode 11):给定 n 个非负整数 a1,a2,...,an,每个数代表一个坐标点 (i, ai)。

在坐标内画 n 条垂直线,使得 i 垂直线的两
个端点分别为 (i, ai) 和 (i, 0)。

找出其中的一条线,使得该条线落在这 n 条
垂直线构成的区域内时,它到 x 轴的垂线段区域内的水最多。

6. 合并两个有序链表(LeetCode 20):将两个升序链表合并为一个新的升序链表并返回。

新链表是通过拼接给定的两个链表的所有节点组成的。

这些题目都是经典的算法问题,对于提高算法和数据结构方面的能力非常有帮助。

当然,还有很多其他的经典算法必刷题目,您可以根据自己的实际情况选择题目进行练习。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法分析经典算法题第一章1.计算A+B的值:#includeint main(){ int a,b;cin>>a>>b;cout<<a+b<<endl;}< p="">2.输入n个整数,找最大值:第一行为整数n,表示n个数。

第二行输入n个整数。

输出最大值import java.util.Scanner;public class Main{ public static void main(String[] args) throws Exception {Scanner input = new Scanner(System.in);int n = input.nextInt();int arr[]=new int[n];for(int i = 0;i<n;i++){< p="">arr[i]=input.nextInt();}int max = arr[0];for(int i = 1;i<n;i++){< p="">if(arr[i]>max){max = arr[i];}}System.out.println(max);}}第二章1.士兵站队问题在一个划分成网格的操场上,n个士兵散乱地站在网格点上。

网格点由整数坐标(x,y)表示。

士兵们可以沿网格边上、下、左、右移动一步,但在同一时刻任一网格点上只能有一名士兵。

按照军官的命令,士兵们要整齐地列成一个水平队列,即排列成(x,y),(x+1,y),…,(x+n-1,y)。

如何选择x 和y的值才能使士兵们以最少的总移动步数排成一列。

计算使所有士兵排成一行需要的最少移动步数。

输入:第1 行是士兵数n,1?n?10000。

接下来n 行是士兵的初始位置,每行2 个整数x 和y,-10000《=x,y《=10000。

输出:第1 行中的数是士兵排成一行需要的最少移动步数。

#include#include#includeusing namespace std;int main(){ int n;int x[10000],y[10000],z[10000];while(cin>>n){ for(int i=0;i<n;i++)< p="">cin>>x[i]>>y[i];sort(x,x+n);sort(y,y+n);int midy=y[(n+1)/2-1];for(int i=0;isort(x,x+n);int midx=x[(n+1)/2-1];int total=0;for(int i=0;i<n;i++)< p="">total+=abs(x[i]-midx)+abs(y[i]-midy);cout<<total<<endl;}< p="">return 0; }2.中位数:设X[0:n-1]和Y[0:n-1]为两个数组,每个数组中含有n 个已排好序的数。

试设计一个O (logn)时间算法,找出X和Y的2n 个数的中位数。

输入:第一行:n,为x和y数组的元素个数第二行:x数组的n个数,用空格分隔第三行:y数组的n个数,用空格分隔输出:中位数两个,用空格分隔import java.util.Scanner;public class Main{public static void main(String[] args)throws Exception{ Scanner input = new Scanner(System.in);int n = input.nextInt();int arr1[] = new int[n];int arr2[] = new int[n];for(int i=0;i<n;i++){< p="">arr1[i]=input.nextInt();}for(int i=0;i<n;i++){< p="">arr2[i]=input.nextInt();}int arr3[] = new int[2*n];int t1 = 0;int t2 = 0;for(int i = 0;i < 2*n;i++){if(arr1[t1]<=arr2[t2]){arr3[i] = arr1[t1];t1++; }else{arr3[i] = arr2[t2];t2++; }if(t1==n){for(int j =0;j<(2*n-t1-t2);j++){arr3[t1+t2+j]=arr2[t2+j];}break;}if(t2==n){for(int j =0;j<(2*n-t1-t2);j++){arr3[t1+t2+j]=arr1[t1+j];}break;} }System.out.print(arr3[n-1]+" "+arr3[n]);}}第三章1.数字三角形问题:给定一个由n行数字组成的数字三角形如下图所示。

试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。

7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径经过的数字和的最大值。

输入:第 1 行是数字三角形的行数n,1≤n≤100。

接下来n行是数字三角形各行中的数字。

所有数字在0..99之间。

输出最大值#includeusing namespace std;const int M=100;int n;int a[M][M];int func(){int i,j;for(i=n-1;i>=1;i--)for(j=1;j<=i;j++){if(a[i+1][j]>a[i+1][j+1]) a[i][j]+=a[i+1][j];else a[i][j]+=a[i+1][j+1]; }return a[1][1];}int main(){ int i,j,max;cin>>n;for(i=1;i<=n;i++)for(j=1;j<=i;j++)cin>>a[i][j];max=func();cout<<max<<endl;< p="">return 0;}2.单调递增最长子序列:设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。

输入:第一行:n,代表要输入的数列的个数第二行:n个数,数字之间用空格格开输出:最长单调递增子序列的长度。

#include#define SIZE 1010int main(){ int i, j, n, top, temp;int s[SIZE];scanf("%d",&n);top = 0;s[0]=-1;for (i = 0; i < n; i++){scanf("%d",&temp);if (temp >s[top])s[++top] = temp;else{ int low = 1, high = top;int mid;while(low <= high){ mid = (low + high)>>1;if (temp>s[mid])low = mid + 1;elsehigh = mid - 1; }s[low] = temp; } }printf("%d\n",top);return 0; }第四章1.会场安排问题:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。

设计一个有效的贪心算法进行安排。

(这个问题实际上是著名的图着色问题。

若将每一个活动作为图的一个顶点,不相容活动间用边相连。

使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。

)对于给定的k个待安排的活动,计算使用最少会场的时间表。

输入:第一行有1 个正整数k,表示有k个待安排的活动。

接下来的k行中,每行有2个正整数,分别表示k个待安排的活动开始时间和结束时间。

时间以0点开始的分钟计。

输出最少会场数。

#include#includeusing namespace std;int a[10001],b[10001];int main(){int n,i,j=0;int count=0;cin>>n;for(i=0;i<n;++i)< p="">cin>>a[i]>>b[i];sort(a,a+n);sort(b,b+n);for(i=0;i<n;i++)< p="">{if(a[i]<b[j])< p="">count++;elsej++;}cout<<count<<endl;< p="">return 0;}2.汽车加油问题:一辆汽车加满油后可行驶n公里。

旅途中有若干个加油站。

设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。

并证明算法能产生一个最优解。

对于给定的n和k 个加油站位置,计算最少加油次数。

输入:第一行有2 个正整数n和k,表示汽车加满油后可行驶n公里,且旅途中有k个加油站。

接下来的1 行中,有k+1个整数,表示第k个加油站与第k-1个加油站之间的距离。

第0个加油站表示出发地,汽车已加满油。

第k+1个加油站表示目的地。

输出:最少加油次数。

如果无法到达目的地,则输出“No Solution!”#includeint main(){ int n,i,k;int j,flag;int a[10001];int sum,p;while(scanf("%d%d",&n,&k)==2){ for(i=0;i<=k;i++)scanf("%d",&a[i]);sum = 0 ;p = n;flag = 1;for (j =0;j<=k;j++){ if (p<a[j])< p="">{ flag = 0;break; }p -= a[j];if (j<=k && p<a[j+1])< p="">{ p = n ;sum++; } }if (flag==1)printf ("%d\n" , sum);else printf ("No Solution!\n"); }return 0; }第五章1.工作分配问题:设有n件工作分配给n个人。

相关文档
最新文档