算法分析考试题

算法分析考试题
算法分析考试题

1. )(n T 给定数组a[0:n-1],试设计一个算法,在最坏情况下用n+[logn]-2次比较找出

a[0:n-1] 中的元素的最大值和次大值. (算法分析与设计习题 2.16 ) (分治法)

a 、 算法思想

用分治法求最大值和次大值首先将问题划分,即将划分成长度相等的两个序列,递归求出左边的最大值次大值,再求出右边的的最大值次大值,比较左右两边,最后得出问题的解。 b 、复杂度分析:

把问题划分为左右两种的情况,需要分别递归求解,时间复杂度可如下计算:

有递推公式为:

T(n)=1 n=1

T(n)= 2T(n/2)+1 n>1 所以,分治算法的时间复杂度是n+[logn]-2,当n 为奇数时,logn 取上线,当n 为偶数时,logn 取下线。//不知道为什么会-2!

C 、代码实现:

#include

int a[100];

void maxcmax(int i,int j,int &max,int &cmax)

{

int lmax,lcmax,rmax,rcmax;

int mid;

if (i==j)

{

max=a[i];

cmax=a[i];

}

else if (i==j-1)

if (a[i]

{

max=a[j];

cmax=a[i];

}

else

{

max=a[i];

cmax=a[j];

}

else

{

mid=(i+j)/2;

maxcmax(i,mid,lmax,lcmax);

maxcmax(mid+1,j,rmax,rcmax);

if(lmax>rmax)

if(lcmax>rmax)

{

max=lmax;

cmax=lcmax;

}

else

{

max=lmax;

cmax=rmax;

}

else

if(rcmax>lmax)

{

if(rmax==rcmax)

{

max=rmax;

cmax=lmax;

}

else

{

max=rmax;

cmax=rcmax;

}

}

else

{

max=rmax;

cmax=lmax;

}

}

}

int main()

{

int n;

int max,cmax;

printf("输入数组长度");

scanf("%d",&n);

printf("输入数组:\n");

for(int i=0;i

{scanf("%d",&a[i]);}

maxcmax(0,n-1,max,cmax);

printf("最大数为%d\n",max);

printf("次大数为%d\n",cmax);

return 0;

}

C、运行结果为

2.求数列的最大子段和(要求时间复杂为nlogn) (算法设计与分析吕国英清华大学出版社

135页4..3.3 二分法变异) (分治法)(也可用动态规划算法参看递归王晓东计算机算法设计与分析第三版p61页)

a、基本思想:

用分治法求最大子段和首先将问题划分,即将一直序列划分成长度相等的两个序列,

这时会出现3种情况,即①最大子段和在第一个序列,②最大子段和在第二个序列和③最大子段和在第一个序列与第二个序列之间。然后,将3种情况的最大子段和合并,取三者之中的最大值为问题的解。

b、复杂度分析:

对应划分得到的情况①和②,需要分别递归求解,对应情况③,两个并列的for循环的时间复杂度是O(n),所以有递推公式为:

T(n)=1 n=1

T(n)= 2T(n/2)+n-1 n>1

所以,分治算法的时间复杂度是O(nlogn)

c、代码实现

#include

#define m 10

int MaxSubSum(int a[],int left,int right)

{

int sum=0;

if(left==right) sum=a[left]>0?a[left]:0;

else

{

int i=(left+right)/2;

int max1=MaxSubSum(a,left,i);

int max2=MaxSubSum(a,i+1,right);

int sum1=0,sum2=0;

for(int j=i;j>=left;j--)

{

sum1=sum1+a[j];

if(sum1>sum2)

sum2=sum1;

}

int sum3=0,sum4=0;

for(j=i+1;j<=right;j++)

{

sum3=sum3+a[j];

if(sum3>sum4)

sum4=sum3;

}

sum=sum2+sum4;

if(sum

sum=max1;

if(sum

sum=max2;

return sum;

}

}

void main()

{

int a[m],d;

cout<<"请输入元素个数"<

cin>>d;

cout<<"请输入元素"<

for(int i=0;i

cin>>a[i];

cout<<"最大子段和为:"<

运行结果为:

3. 设X[0:n-1] 和 Y[0:n-1]为两个数组,每个数组中含有n 个已排好序的数。试设计一

个)(log n O 时间算法,找出X 和Y 的2n 个数的中位数。(分治法) a 、基本思想:

解决问题的核心:找出将大问题分割成较小规模的相同问题的切割点,并递归定义大问题与子问题之间的关系。

确定切割点:对于两个数组,我们可以从他们中分别选取出一个中位数,称为x,y ,并将两个数组的左右边界称之为aLeft,aRight,bLeft,bRight 。对比两个中位数,如果X 数组中的中位数大于Y 数组中的中位数,且X 数组中的元素个数为偶数个,则X 数组被切割为X[aLeft,x-1],Y 被切割为Y[y,bRight],如果X 数组的元素个数不为偶数个的话,则直接将X 切割为X[aLeft,x]。如果X 数组的中位数小于Y 数组的中位数,取值情况刚好相反。

递归关系:根据上面所述,对于原问题X[aLeft , aRight], Y[bLeft, bRight]。假设切割后的子问题为X[aLeft, x-1],Y[y,bRight]。则求解X[aLeft , aRight], Y[bLeft, bRight]问题的中位数,归结于求解子问题X[aLeft, x-1],Y[y,bRight]的中位数。

递归结束条件:当切割后得到的子问题的两个数组的长度都为1位时,整个递归结束。 b 、复杂度分析:

因为数组比较的范围每次缩小一半,所以有递推公式为:

T(n)=1 n=1

T(n)= T(n/2)+1 n>1

易算出时间复杂度为 )(log n O

c 、代码实现

#include

using namespace::std;

#define d 10

int median(int x[],int y[],int xLeft,int xRight,int yLeft,int yRight){

if(xLeft==xRight)

{

return (x[xLeft]+y[yLeft])/2;

}

int xm=(xLeft+xRight)/2;

int ym=(yLeft+yRight)/2;

if((xLeft+xRight)%2==0)

{//为奇数

if(x[xm]

{

median(x,y,xm,xRight,yLeft,ym);

}

else

{

median(x,y,xLeft,xm,ym,yRight);

}

}

else

{//为偶数

if(x[xm]

{

median(x,y,xm+1,xRight,yLeft,ym);

}

else

{

median(x,y,xLeft,xm,ym+1,yRight);

}

}

}

int main()

{

int m;int a[d],b[d];

cout<<"Enter dimension m:"<

cin>>m;

cout<<"Enter array a:"<

for(int i=0;i

cin>>a[i];

cout<<"Enter array b:"<

for(int j=0;j

cin>>b[j];

int mid=median(a,b,0,m-1,0,m-1);

cout<<"The median is:"<

return 0;

}

运行结果为:

4.设计一个O(n*n)时间的算法,找出由n个数组成的序列最长单调递增子序列. P87页(参考

P56页) (动态规划算法)

a、算法思路:

序列X按非递减顺序排列,形成新序列Y,问题就转变成求解X和Y的LCS。

b、时间复杂度:

使用快速排序,则排序过程的时间复杂度为O(nlgn),而求两个序列的LCS的时间复杂度为O(n^2)(因为X、Y长度相等),综合可知该解法的时间复杂度为O(n^2)。

c、代码实现

#include

#define m 10

//快速排序

void QuickSort(int R[],int s,int t)

{

int i=s,j=t;

int tmp;

if(s

{

tmp=R[s];

while(i!=j)

{

while(j>i&&R[j]>=tmp)

j--;

R[i]=R[j];

while(i

i++;

R[j]=R[i];

}

R[i]=tmp;

QuickSort(R,s,i-1);

QuickSort(R,i+1,t);

}

}

//找出最长公共子序列

void LCSLength(int x[],int y[],int n,int c[m][m],int b[m][m]) {

int i,j;

for(i=0;i

{

c[0][i]=0;

c[i][0]=0;

}

for(i=0;i

for(j=0;j

{

if(x[i]==y[j])

{

c[i][j]=c[i-1][j-1]+1;

b[i][j]=1;

}

else if(c[i-1][j]>=c[i][j-1])

{

c[i][j]=c[i-1][j];

b[i][j]=2;

}

else

{

c[i][j]=c[i][j-1];

b[i][j]=3;

}

}

}

void LCS(int i,int j,int *x,int b[m][m])

{

if(i<0||j<0)

return;

if(b[i][j]==1)

{

LCS(i-1,j-1,x,b);

cout<

}

else if(b[i][j]==2)

LCS(i-1,j,x,b);

else

LCS(i,j-1,x,b);

}

void main()

{

int x[m],y[m],d;

cout<<"请输入元素个数"<

cin>>d;

cout<<"请输入元素"<

for(int i=0;i

{

cin>>x[i];

y[i]=x[i];

}

int c[m][m]={0},b[m][m]={0};

QuickSort(x,0,d-1);

LCSLength(x,y,d,c,b);

cout<<"最长单调递增子序列为:"<

LCS(d-1,d-1,x,b);

}

结果为:

7.礼物分配问题. 两兄弟Alan 和Bob, 共同分配n 个礼物. 每个礼物只能分给其中的一个人,且不能分成两个.每个礼物i 的价值为vi, 为正整数.设 a 和 b 分别表示Alan 和 Bob 所收到的礼物的总价值, V=b a V

n i i +=∑=1, 为所有礼物的总价值. 为使两兄弟高兴,我们希望尽

可能地均分这些礼物, 即 |a-b| 打到最小

试设计-O(n*V)时间的动态规划算法,使得|a-b| 达到最小, 并求出礼物的分割集合 (P77页)(动态规划算法)

8.(4.7)多处最优服务问题 P131页 (贪婪算法) (与十人打水的问题一样)

a 、算法思想:

贪心策略如下:首先对所有服务先按服务时间从小到大进行排序,然后按照排序结果,选出

最小的服务站点时间,依次安排服务。

b、时间复杂度:

程序主要是花费在对各顾客所需服务时间的排序和贪心算法,即计算平均服务时间上面。其中,贪心算法部分只有一重循环影响时间复杂度,其时间复杂度为O(n):而排序算法的时间复杂度为O(nlogn)。因此,综合来看算法的时间复杂度为O(nlogn)。

c、代码实现:

#include

#include

#include

using namespace std;

using std::vector;

double greedy(vectorx,int s)

{

int minx;

vectorb(s+1,0);

int n=x.size();

sort(x.begin(),x.end());

int i,j,k;

for(i=0;i

{

minx=0x7fffffff;

k=0;

for(j=0;j

{

if(minx>b[j])

{

minx=b[j];

k=j;

}

}

b[k]+=x[i];

x[i]=b[k];

}

double t=0;

for(i=0;i

t/=n;

return t;

}

void main()

{

int n;//等待服务的顾客人数

int s;//服务点的个数

int i;

int a;

int t;//平均服务时间

vectorx;

cout<<"输入等待服务的人数:"<

cin>>n;

cout<<"输入服务站点数:"<

cin>>s;

cout<<"输入每个顾客需要等待的时间:"<

for(i=1;i<=n;i++)

{

cin>>a;

x.push_back(a);

}

t=greedy(x, s);

cout<<"最少平均等待时间是:"<

}

运行结果为:

9. 键盘输入一个高精度的正整数N, 去掉其中任意S个数字后剩下的数字按左右次序将组成一个新的正整数.编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小. (P133页贪婪算法)

10.最佳调度问题。假设有n个任务由k个并行的机器完成。完成任务i个需要的时间为i t。

试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。(回溯法)

11.用回溯法做第6题( 时间复杂度为n2,请详细分析时间复杂度)

12.八皇后问题选做

13.最多约数问题

问题描述:

正整数x的约数是能整除x的正整数。正整数x 的约数个数记为div(x)。例如,1,2,5,10 都是正整数10 的约数,且div(10)=4。设a 和b 是2 个正整数,a≤b,找出a和b之间约数个数最多的数x。

a、算法思想:数据规模到1000000000,较大,最一般做法会超时。可以利用n的因子数公式,如果n的素因子分解公式为:n = p1^r1 * p2^r2 * p3^r3 * …* pn^rn,那么n的因子数公式即为Div(n) = (r1+1)*(r2+1)*……*(rn+1)。所以,先打印素数表,用公式求即可。

b、时间复杂度分析

筛选法打印素数表的时间复杂度一定小于MAXsqr(MAX),求数m的因子个数的时间复杂度小于sqr(m)

c、代码实现

#include

#include

#include

#define MAX 100000

int prime[MAX];

bool a[MAX];

int cnt;

//筛选法打印素数表

void Initprime(){

int i, j;

cnt = 0;

for( i=2; i

if( a[i] == 0 ){

prime[cnt++] = i;

for( j=2*i; j

a[j] = 1;

}

}

}

//求数m的因子个数

int Div( int m ){

int tmp,ret=1;

if( m<100000 && a[m]==0 )

return 2;

for( int i=0; prime[i]*prime[i]<=m && i

tmp = 0;

while( m % prime[i] == 0 ){

tmp ++;

m /= prime[i];

}

ret = ret * ( tmp+1 );

}

}

if( m != 1 )

ret = ret * 2;

return ret;

}

int main( ){

int m, n;

int max, ret;

Initprime( );

while( scanf( "%d%d", &m, &n ) != EOF ){

max = 1;

for( int i=m; i<=n; i++ ){

ret = Div( i );

if( ret > max )

max = ret;

}

printf( "a和b之间约数个数最多的数为:%d\n", max );

}

return 0;

}

运行结果为

算法经典面试题

算法经典面试题 世界上第一位程序员是英国著名诗人拜伦的女儿AdaLovelace曾设计了巴贝奇分析机上解伯努利方程的一个程序。她甚至还建立了循环和子程序的概念。下面就由X为大家介绍一下程序员面试算法题的文章。 程序员面试算法题篇1 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。 思路一:当我们到达某一个节点准备调整以该节点为根节点的子数时,先调整其左子树将左子树转换成一个排好序的左子链表,再调整其右子树转换成右子链表。最近链接左子链表的最右节点、当前节点和右子链表的最左节点。从树的根节点开始递归调整所有节点。

思路二:我们可以中序遍历整个树。按照这个方式遍历树,比较小的节点优先访问。如果我们每访问一个节点,假设之前访问过的节点已经调整为一个排序的双向链表,我们再把调整当前节点的指针链接到链表的末尾。当所有的节点都访问过之后,整棵树也就转换成一个排序的双向链表了。 参考代码: 二元查找树的节点数据结构: structBSTreeNode{ int value; BSTreeNode *m_left; BSTreeNode *m_right; } 思路二对应的代码: void ConvertNode(BSTreeNode* pNode, BSTreeNode*& pLastNodeInList) { if(pNode == NULL) return; BSTreeNode *pCurrent = pNode; // Convert the left sub-tree if (pCurrent->m_pLeft != NULL) ConvertNode(pCurrent->m_pLeft, pLastNodeInList);

算法分析复习题1

《算法设计与分析》复习题1 一、填空: 1.算法是指解决问题的方法或过程,算法所描述的指令序列必须满足下列性质○1、○2、○3、○4、○5。 2.程序是算法用某种程序设计语言的具体实现,程序可以不满足算法的○1性质。所以像操作系统这样的软件○2(是/不是)算法。 3.抽象数据类型是算法设计的重要概念。严格地讲,它是算法的一个○1同定义在该模型上并作为○2的一组运算。 4.算法的复杂性是算法运行所需要的计算机资源的量。这个量集中反映算法的效率,通常用C=F(N、I、A)表示,其中C、N、I、A所代表的含义是什么? 5.设f(N)和g(N)是定义在正数集上的正函数,当N充分大时, f(N)=O(g(N))表示g(N)是f(N)的一个○1; f(N)=Ω(g(N))表示g(N)是f(N)的一个○2; f(N)=θ(g(N))表示g(N)是f(N)③。 6.直接或间接地调用自身的算法称为○1 的计算公式外,还必须提供○2初始值。 7.动态规划算法与分治法的基本思想都是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。它们的主要区别是分治法求解时,对有些子问题会○1,而动态规划法采用○2避免子问题重复计算。 8.贪心算法与动态规划算法都要求问题具有最优子结构性质,这是两类算法的一个共同点。但是否具有最优子结构的问题,用贪心算法和动态规划算法都可以得到最优解?举例说明。 9.下面的说法错误的是________。 a.算法原地工作的含义是指不需要任何额外的辅助空间; b.在相同的规模n下,时间复杂度为O(n)的算法在时间上总是优于时 间复杂度为O(2n)的算法。 c.所谓时间复杂度是指最坏情况下,估算算法执行时间的一个上界; d.同一算法,实现语言的级别越高,执行效率越低。 10.回朔法的求解目标是找出解空间中满足约束条件的○1 的求解目标则是找出满足约束条件的○2或在某种意义下的最优解。 11.回朔法以○1优先的方式搜索解空间树,而分支限界法则以○2优先或以○3优先的方式搜索解空间树。 12.按从活结点表中选择下一扩展结点的不同方式,可将分支限界法分为○1分支限界法和○2分支限界法。 13.○1假设某算法在输入规模为n时的计算时间为T(n)=3×2n,在某台计算机上实现并完成该算法的时间为t秒,现另有一台计算机,其运行速度 为第一台的64倍,那么在这台新机器上用同一算法在t秒内能输入规 模多大的问题? ○2若上述算法的计算时间改进为T(n)=n2,其余条件不变,则在新机器 上用t秒时间能解输入规模多大的问题? ○3在上述算法的计算时间进一步改进为T(n)=8,其余条件不变,那么在 新机器上用t秒时间能解输入规模多大的问题?

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

算法设计与分析考试题 及答案 Company number:【WTUT-WT88Y-W8BBGB-BWYTT-19998】

一、填空题(20分) 1.一个算法就是一个有穷规则的集合,其中之规则规定了解决某一特殊类型问题的一系列运算,此外,算法还应具有以下五个重要特性:确定性 有穷性 可行性 0个或多个输入 一个或多个输出 2.算法的复杂性有时间复杂性 空间复杂性之分,衡量一个算法好坏的标准是 时间复杂度高低 3.某一问题可用动态规划算法求解的显着特征是 该问题具有最优子结构性质 4.若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},请给出序列X 和Y 的一个最长公共子序列{BABCD}或{CABCD}或{CADCD } 5.用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含一个(最优)解 6.动态规划算法的基本思想是将待求解问题分解成若干_子问题 ,先求解_子问题 ,然后从这些子问题 的解得到原问题的解。 7.以深度优先方式系统搜索问题解的算法称为回溯法 背包问题的回溯算法所需的计算时间为o(n*2n ) ,用动态规划算法所需的计算时间为o(min{nc,2n }) 9.动态规划算法的两个基本要素是最优子结构 _和重叠子问题 10.二分搜索算法是利用动态规划法实现的算法。 二、综合题(50分) 1.写出设计动态规划算法的主要步骤。 ①问题具有最优子结构性质;②构造最优值的递归关系表达式; ③最优值的算法描述;④构造最优解; 2. 流水作业调度问题的johnson 算法的思想。 ①令N 1={i|a i =b i };②将N 1中作业按a i 的非减序排序得到N 1’,将N 2中作业按b i 的非增序排序得到N 2’;③N 1’中作业接N 2’中作业就构成了满足Johnson 法则的最优调度。 3. 若n=4,在机器M1和M2上加工作业i 所需的时间分别为a i 和b i ,且 (a 1,a 2,a 3,a 4)=(4,5,12,10),(b 1,b 2,b 3,b 4)=(8,2,15,9)求4个作业的最优调度方案,并计算最优值。 步骤为:N1={1,3},N2={2,4}; N 1’={1,3}, N 2’={4,2}; 最优值为:38 4. 使用回溯法解0/1背包问题:n=3,C=9,V={6,10,3},W={3,4,4},其解空间有长度为3的0-1向量组成,要求用一棵完全二叉树表示其解空间(从根出发,左1右0),并画出其解空间树,计算其最优值及最优解。 解空间为{(0,0,0),(0,1,0),(0,0,1),(1,0,0),(0,1,1),(1,0,1), (1,1,0),(1,1,1)}。 解空间树为: 该问题的最优值为:16 最优解为:(1,1,0) 5. 设S={X 1,X 2,···,X n }是严格递增的有序集,利用二叉树的结点来存储S 中的元素,在表示S 的二叉搜索树中搜索一个元素X ,返回的结果有两种情形,(1)在二叉搜索树的内结点中找到X=X i ,其概率为b i 。(2)在二叉搜索树的叶结点中确定X ∈(X i ,X i+1),其概率为a i 。在表示S 的二叉搜索树T 中,设存储元素X i 的结点深度为C i ;叶结点(X i ,X i+1)的结点深度为d i ,则二叉搜索树T 的平均路长p 为多少假设二叉搜索树T[i][j]={X i ,X i+1,···,X j }最优值为m[i][j],W[i][j]= a i-1+b i +···+b j +a j ,则m[i][j](1<=i<=j<=n)递归关系表达式为什么 .二叉树T 的平均路长P=∑=+n i 1 Ci)(1*bi +∑=n j 0 dj *aj

算法分析与设计试卷

《算法分析与设计》试卷(A) (时间90分钟满分100分) 一、填空题(30分,每题2分)。 1.最长公共子序列算法利用的算法是( B )。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法2.在对问题的解空间树进行搜索的方法中,一个活结点最多有一次机会成为活结点的是( B ). A.回溯法 B.分支限界法 C.回溯法和分支限界法 D.回溯法求解子集树问题 3.实现最大子段和利用的算法是( B )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法4..广度优先是( A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法5.衡量一个算法好坏的标准是( C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 6.Strassen矩阵乘法是利用( A)实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 7. 使用分治法求解不需要满足的条件是( A )。 A 子问题必须是一样的 B 子问题不能够重复 C 子问题的解可以合并 D 原问题和子问题使用相同的方法解 8.用动态规划算法解决最大字段和问题,其时间复杂性为( B ). A.logn B.n C.n2 D.nlogn 9.解决活动安排问题,最好用( B )算法 A.分治 B.贪心 C.动态规划 D.穷举 10.下面哪种函数是回溯法中为避免无效搜索采取的策略( B ) A.递归函数 B.剪枝函数C。随机数函数 D.搜索函数11. 从活结点表中选择下一个扩展结点的不同方式将导致不同的分支限界法,以下除( C )之外都是最常见的方式. A.队列式分支限界法 B.优先队列式分支限界法 C.栈式分支限界法 D.FIFO分支限界法 12. .回溯算法和分支限界法的问题的解空间树不会是( D ). A.有序树 B.子集树 C.排列树 D.无序树 13.优先队列式分支限界法选取扩展结点的原则是( C )。 A、先进先出 B、后进先出 C、结点的优先级 D、随机14.下面是贪心算法的基本要素的是( C )。 A、重叠子问题 B、构造最优解 C、贪心选择性质 D、定义最优解15.回溯法在解空间树T上的搜索方式是( A ). A.深度优先 B.广度优先 C.最小耗费优先 D.活结点优先 二、填空题(20分,每空1分)。 1.算法由若干条指令组成的又穷序列,且满足输入、输出、 确定性和有限性四个特性。 2.分支限界法的两种搜索方式有队列式(FIFO)分支限界法、优先队列式分支限界法,用一个队列来存储结点的表叫活节点表。

经典算法面试题及标准答案

1.时针分针重合几次 表面上有60个小格,每小格代表一分钟, 时针每分钟走1/12小格,分针每分钟走1小格,从第一次重合到第二次重合分针比时针多走一圈即60小格,所以 60/(1-1/12)=720/11 每隔720/11分才重合一次(而并不是每小时重合一次) 1440里有22个720/11,如果说算上0点和24点,那也是重合23次而已,但我觉得0点应该算到前一天的24点头上,所以每一天循环下来重合22次啊 2.找出字符串的最长不重复子串,输出长度 建一个256个单元的数组,每一个单元代表一个字符,数组中保存上次该字符上次出现的位置; 依次读入字符串,同时维护数组的值; 如果遇到冲突了,就返回冲突字符中保存的位置,继续第二步。也可以用hashm ap保存已经出现的字符和字符的位置 3. 说是有一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前十个词。 先用哈希,统计每个词出现的次数,然后在用在N个数中找出前K大个数的方法找出出现 次数最多的前10个词。

4. 如题3,但是车次文件特别大,没有办法一次读入内存。 1)直接排序,写文件时,同时写入字符串及其出现 次数。 2)可以用哈希,比如先根据字符串的第一个字符将字符串换分为多个区域,每个区域的字符串写到一个文件内,然后再用哈希+堆统计每个区域内前10个频率最高的字符串,最后求出所有字符串中前10个频率最高的字符串。 5.有一个整数n,将n分解成若干个整数之和,问如何分解能使这些数的乘积最大,输出这个乘积m。例如:n=12 (1)分解为1+1+1+…+1,12个1, m=1*1*1……*1=1 (2)分解为2+2+…+2,6个2,m=64 (3)分解为3+3+3+3,4个3, m=81 (4)大于等于4时分解时只能分解为2和3,且2最多两个 f(n) =3*f(n-3)n>4 f(4)=2*2 f(3) = 3 f(2) = 2分解为4+4+4,3个4,m=64 6. 求数组n中出现次数超过一半的数 把数组分成[n/2]组,则至少有一组包含重复的数,因为如果无重复数,则最多只有出现次数等于一半的数。算法如下:

1算法分析复习题目及答案

一。选择题 1、二分搜索算法是利用(A)实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是( A )。 A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解 3、最大效益优先是( A )的一搜索方式。 A、分支界限法B、动态规划法C、贪心法 D、回溯法 4、在下列算法中有时找不到问题解的是( B )。 A、蒙特卡罗算法B、拉斯维加斯算法C、舍伍德算法D、数值概率算法 5. 回溯法解旅行售货员问题时的解空间树是(B)。 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、回溯法 10、下列随机算法中运行时有时候成功有时候失败的是(C )?A 数值概率算法 B 舍伍德算法 C 拉斯维加斯算法 D 蒙特卡罗算法 11.下面不是分支界限法搜索方式的是( D )。 A、广度优先?B、最小耗费优先 C、最大效益优先?D、深度优先 12.下列算法中通常以深度优先方式系统搜索问题解的是(D)。 A、备忘录法??B、动态规划法??C、贪心法????D、回溯法 13.备忘录方法是那种算法的变形。( B )

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

1.一个算法就是一个有穷规则的集合,其中之规则规定了解决某一特殊类型问题的一系列运算,此外,算法还应具有以下五个重要特性:_________,________,________,__________,__________。 2.算法的复杂性有_____________和___________之分,衡量一个算法 好坏的标准是______________________。 3.某一问题可用动态规划算法求解的显著特征是 ____________________________________。 4.若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},请给出序列X 和Y的一个最长公共子序列_____________________________。 5.用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含___________。 6.动态规划算法的基本思想是将待求解问题分解成若干____________,先求解___________,然后从这些____________的解得到原问题的解。 7.以深度优先方式系统搜索问题解的算法称为_____________。 8.0-1背包问题的回溯算法所需的计算时间为_____________,用动态规划算法所需的计算时间为____________。 9.动态规划算法的两个基本要素是___________和___________。 10.二分搜索算法是利用_______________实现的算法。 二、综合题(50分) 1.写出设计动态规划算法的主要步骤。 2.流水作业调度问题的johnson算法的思想。

算法设计与分析试卷A及答案

考试课程: 班级: 姓名: 学号: ------------------------------------------------- 密 ---------------------------------- 封 ----------------------------- 线 ---------------------------------------------------------

考试课程: 班级: 姓名: 学号: ------------------------------------------------- 密 ---------------------------------- 封 ----------------------------- 线 ---------------------------------------------------------

参考答案 一、填空 1、空间复杂度 时间复杂度 2、回溯法 3、递归算法 4、渐进确界或紧致界 5、原问题的较小模式 递归技术 6、问题的计算复杂性分析有一个共同的客观尺度 7、②③④① 8、问题的最优解包含其子问题的最优解 9、局部最优 10、正确的 三、简答题 1、高级语言更接近算法语言,易学、易掌握,一般工程技术人员只需要几周时间的培训就可以胜任程序员的工作; 高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高; 高级语言不依赖于机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可植性好、重用率高; 把繁杂琐碎的事务交给编译程序,所以自动化程度高,开发周期短,程序员可以集中时间和精力从事更重要的创造性劳动,提高程序质量。 2、 ①不能保证最后求得的解是最佳的;即多半是近似解。(少数问题除外) ②策略容易发现(关键:提取清楚问题中的维度), 而且运用简单,被广泛运用。 ③策略多样,结果也多样。 ④算法实现过程中,通常用到辅助算法:排序 3、解:① 因为:;01 -10n n )1-10n n (lim 22 2=+-+→∞n n 由渐近表达式的定义易知: 1-10n n 2 2+是n ;的渐近表达式。 ② 因为:;0n 1/ 5/n 1414)n 1/ 5/n 14(lim 22=++-++∞→n 由渐近表达式的定义易知: 14是14+5/n+1/ n 2的渐近表达式。 4、 找出最优解的性质,并刻划其结构特征。 递归地定义最优值。 以自底向上的方式计算出最优值。 根据计算最优值时得到的信息,构造最优解。 四、算法设计题 1、按照单位效益从大到小依次排列这7个物品为:FBGDECA 。将它们的序号分别记为1~7。则可生产如下的状态空间搜索树。其中各个节点处的限界函数值通过如下方式求得:【排序1分】 5x =6x =7x =

C语言经典算法100例(1---30)

2008-02-18 18:48 【程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 2.程序源代码: main() { int i,j,k; printf("\n"); for(i=1;i<5;i++) /*以下为三重循环*/ for(j=1;j<5;j++) for (k=1;k<5;k++) { if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/ printf("%d,%d,%d\n",i,j,k); } } ============================================================== 【程序2】 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提 成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于 40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于 100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? 1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 2.程序源代码: main() { long int i; int bonus1,bonus2,bonus4,bonus6,bonus10,bonus; scanf("%ld",&i); bonus1=100000*0.1;bonus2=bonus1+100000*0.75; bonus4=bonus2+200000*0.5; bonus6=bonus4+200000*0.3; bonus10=bonus6+400000*0.15; if(i<=100000)

算法分析与设计》期末考试复习题纲(完整版)

《算法分析与设计》期末复习题 一、选择题 1.算法必须具备输入、输出和( D )等4个特性。 A.可行性和安全性B.确定性和易读性 C.有穷性和安全性D.有穷性和确定性 2.算法分析中,记号O表示( B ),记号Ω表示( A ) A.渐进下界 B.渐进上界 C.非紧上界 D.紧渐进界 3.假设某算法在输入规模为n时的计算时间为T(n)=3*2^n。在某台计算机上实现并完 成概算法的时间为t秒。现有另一台计算机,其运行速度为第一台的64倍,那么在这台新机器上用同一算法在t秒内能解输入规模为多大的问题( B )解题方法:3*2^n*64=3*2^x A.n+8 B.n+6 C.n+7 D.n+5 4.设问题规模为N时,某递归算法的时间复杂度记为T(N),已知T(1)=1, T(N)=2T(N/2)+N/2,用O表示的时间复杂度为( C )。 A.O(logN) B.O(N) C.O(NlogN) D.O(N2logN) 5.直接或间接调用自身的算法称为( B )。 A.贪心算法B.递归算法 C.迭代算法D.回溯法 6.Fibonacci数列中,第4个和第11个数分别是( D )。 A.5,89 B.3,89 C.5,144 D.3,144 7.在有8个顶点的凸多边形的三角剖分中,恰有( B )。 A.6条弦和7个三角形B.5条弦和6个三角形 C.6条弦和6个三角形D.5条弦和5个三角形 8.一个问题可用动态规划算法或贪心算法求解的关键特征是问题的( B )。 A.重叠子问题B.最优子结构性质 C.贪心选择性质D.定义最优解 9.下列哪个问题不用贪心法求解( C )。 A.哈夫曼编码问题B.单源最短路径问题 C.最大团问题D.最小生成树问题 10.下列算法中通常以自底向上的方式求解最优解的是( B )。 A.备忘录法B.动态规划法 C.贪心法D.回溯法 11.下列算法中不能解决0/1背包问题的是( A )。 A.贪心法B.动态规划 C.回溯法D.分支限界法 12.下列哪个问题可以用贪心算法求解( D )。

(完整版)算法设计与分析期末考试卷及答案a

一.填空题(每空 2 分,共30分) 1.算法的时间复杂性指算法中的执行次数。 2.在忽略常数因子的情况下,O、和三个符号中,提供了算法运行时间的一个上界。 3.设D n表示大小为n的输入集合,t(I)表示输入为I时算法的运算时间, p(I)表示输入 I 出现的概率,则算法的平均情况下时间复杂性A(n)= 。 4.分治算法的时间复杂性常常满足如下形式的递归方程: f (n) d , n n0 f(n) af(n/c) g(n) , n n0 其中,g(n)表示。 5. 分治算法的基本步骤包括。6.回溯算法的基本思想是。 7.动态规划和分治法在分解子问题方面的不同点是。 8.贪心算法中每次做出的贪心选择都是最优选择。 9.PQ 式的分支限界法中,对于活结点表中的结点,其下界函数值越小,优先级 10.选择排序、插入排序和归并排序算法中,算法是分治算法。 11.随机算法的一个基本特征是对于同一组输入,不同的运行可能得到的结果。12. 对于下面的确定性快速排序算法,只要在步骤3 前加入随机 化步骤,就可得到一个随机化快速排序算法,该随机化步骤的功能是。 算法QUICKSORT 输入:n 个元素的数组A[1..n] 。 输出:按非降序排列的数组 A 中的元素

1. quicksort(1, n) end QUICKSORT _ _ 过程 quicksort(A, low, high) _ _ // 对 A[low..high] 中的元素按非降序排序。 _ 号 学 2. if low

5.《算法设计与分析》试题库

《算法分析与设计》试题库 (一) 一、 选择题 1.应用Johnson 法则的流水作业调度采用的算法是(D ) A. 贪心算法 B.分支限界法 C.分治法 B. void hanoi(int n, int A, int B, int C) { if (n > 0) { hanoi(n-1, A, C, B); move( n, a,b); hanoi(n-1, C, B, A); 2.Hanoi 塔问题如下图所示。现要求将塔座A 上的的所有圆盘移到塔座 B 上,并 D.动态规划算法

3. 动态规划算法的基本要素为(C) A. 最优子结构性质与贪心选择性质 B ?重叠子问题性质与贪心选择性质 C.最优子结构性质与重叠子问题性质

D.预排序与递归调用 4. 算法分析中,记号0表示(B),记号0表示(A),记号。表示(D) A. 渐进下界 B. 渐进上界 C. 非紧上界 D. 紧渐进界 E. 非紧下界 5. 以下关于渐进记号的性质是正确的有:(A) A. f(n) - P(g(n)),g(n) - 心(h(n))二f(n) - P(h(n)) B. f(n) =0(g(n)),g(n) =0(h(n))二h(n) =0(f(n)) C. O(f(n ))+0(g( n)) = O(mi n{f(n ),g( n)}) D. f(n) =0(g(n)) = g(n) -0(f (n)) 6?能采用贪心算法求最优解的问题,一般具有的重要性质为:(A) A. 最优子结构性质与贪心选择性质 B ?重叠子问题性质与贪心选择性质 C. 最优子结构性质与重叠子问题性质 D. 预排序与递归调用 7.回溯法在问题的解空间树中,按(D)策略,从根结点出发搜索解空间树。 A. 广度优先 B.活结点优先 C.扩展结点优先 D.深度优先

算法设计及分析递归算法典型例题

算法递归典型例题 实验一:递归策略运用练习 三、实验项目 1.运用递归策略设计算法实现下述题目的求解过程。 题目列表如下: (1)运动会开了N天,一共发出金牌M枚。第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。到了第N天刚好还有金牌N枚,到此金牌全部发完。编程求N和M。 (2)国王分财产。某国王临终前给儿子们分财产。他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;给第二个儿子两份,再加上剩余财产的1/10;……;给第i 个儿子i份,再加上剩余财产的1/10。每个儿子都窃窃自喜。以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。请用程序回答,老国王共有几个儿子?财产共分成了多少份? 源程序: (3)出售金鱼问题:第一次卖出全部金鱼的一半加二分之一条金鱼;第二次卖出乘余金鱼的三分之一加三分之一条金鱼;第三次卖出剩余金鱼的四分之一加四分之一条金鱼;第四次卖出剩余金鱼的五分之一加五分之一条金鱼;现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。问这鱼缸里原有多少条金鱼? (4)某路公共汽车,总共有八站,从一号站发轩时车上已有n位乘客,到了第二站先下一半乘客,再上来了六位乘客;到了第三站也先下一半乘客,再上来了五位乘客,以后每到一站都先下车上已有的一半乘客,再上来了乘客比前一站少一个……,到了终点站车上还有乘客六人,问发车时车上的乘客有多少? (5)猴子吃桃。有一群猴子摘来了一批桃子,猴王规定每天只准吃一半加一只(即第二天吃剩下的一半加一只,以此类推),第九天正好吃完,问猴子们摘来了多少桃子? (6)小华读书。第一天读了全书的一半加二页,第二天读了剩下的一半加二页,以后天天如此……,第六天读完了最后的三页,问全书有多少页? (7)日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子? 四、实验过程 (一)题目一:…… 1.题目分析 由已知可得,运动会最后一天剩余的金牌数gold等于运动会举行的天数由此可倒推每一 天的金牌剩余数,且每天的金牌数应为6的倍数。 2.算法构造 设运动会举行了N天, If(i==N)Gold[i]=N; Else gold[i]=gold[i+1]*7/6+i;

算法分析与设计复习题及参考答案

《算法分析与设计》课程复习资料 一、名词解释: 1.算法 2.程序 3.递归函数 4.子问题的重叠性质 5.队列式分支限界法 6.多机调度问题 7.最小生成树 二、简答题: 1.备忘录方法和动态规划算法相比有何异同?简述之。 2.简述回溯法解题的主要步骤。 3.简述动态规划算法求解的基本要素。 4.简述回溯法的基本思想。 5.简要分析在递归算法中消除递归调用,将递归算法转化为非递归算法的方法。 6.简要分析分支限界法与回溯法的异同。 7.简述算法复杂性的概念,算法复杂性度量主要指哪两个方面? 8.贪心算法求解的问题主要具有哪些性质?简述之。 9.分治法的基本思想是什么?合并排序的基本思想是什么?请分别简述之。 10.简述分析贪心算法与动态规划算法的异同。 三、算法编写及算法应用分析题: 1.已知有3个物品:(w1,w2,w3)=(12,10,6),(p1,p2,p3)=(15,13,10),背包的容积M=20,根据0-1背包动态规划的递推式求出最优解。 2.按要求完成以下关于排序和查找的问题。 ①对数组A={15,29,135,18,32,1,27,25,5},用快速排序方法将其排成递减序。 ②请描述递减数组进行二分搜索的基本思想,并给出非递归算法。 ③给出上述算法的递归算法。 ④使用上述算法对①所得到的结果搜索如下元素,并给出搜索过程:18,31,135。 3.已知1()*()i i k k ij r r A a +=,k=1,2,3,4,5,6,r 1=5,r 2=10,r 3=3,r 4=12,r 5=5,r 6=50,r 7=6,求矩阵链积A 1×A 2×A 3×A 4×A 5×A 6的最佳求积顺序(要求给出计算步骤)。 4.根据分枝限界算法基本过程,求解0-1背包问题。 已知n=3,M=20,(w1,w2,w3)=(12,10,6),(p1,p2,p3)=(15,13,10)。 5.试用贪心算法求解汽车加油问题:已知一辆汽车加满油后可行驶n 公里,而旅途中有若干个加油站。试设计一个有效算法,指出应在哪些加油站停靠加油,使加油次数最少,请写出该算法。 6.试用动态规划算法实现下列问题:设A 和B 是两个字符串。我们要用最少的字符操作,将字符串A 转换为字符串B ,这里所说的字符操作包括: ①删除一个字符。 ②插入一个字符。 ③将一个字符改为另一个字符。 请写出该算法。 7.对于下图使用Dijkstra 算法求由顶点a 到顶点h 的最短路径。

算法分析复习题目及答案

一。选择题 1、二分搜索算法是利用( A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是( A )。 A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解 3、最大效益优先是( A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 4、在下列算法中有时找不到问题解的是( B )。 A、蒙特卡罗算法 B、拉斯维加斯算法 C、舍伍德算法 D、数值概率算法 5. 回溯法解旅行售货员问题时的解空间树是(B )。 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、回溯法 10、下列随机算法中运行时有时候成功有时候失败的是(C ) 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)

算法分析与设计复习题及答案

算法分析与设计复习题及答案一、单选题 1.D 2.B 3.C 4.D 5.D 6.D 7.C 8.D 9.B 10.C 11.D 12.B 13.D 14.C 15.C 16.D 17.D 18.D 19.D 20.C 1.与算法英文单词algorithm具有相同来源的单词是()。 A logarithm B algiros C arithmos D algebra 2.根据执行算法的计算机指令体系结构,算法可以分为()。 A精确算法与近似算法B串行算法语并行算法 C稳定算法与不稳定算法D32位算法与64位算法 3.具有10个节点的完全二叉树的高度是()。 A6B5C3D 2 4.下列函数关系随着输入量增大增加最快的是()。 Alog2n B n2 C 2n D n! 5.下列程序段的S执行的次数为( )。 for i ←0 to n-1 do for j ←0 to i-1 do s //某种基本操作 A.n2 B n2/2 C n*(n+1) D n(n+1)/2 6.Fibonacci数列的第十项为( )。 A 3 B 13 C 21 D 34 7.4个盘子的汉诺塔,至少要执行移动操作的次数为( )。 A 11次 B 13次 C 15次 D 17次 8.下列序列不是堆的是()。 A 99,85,98,77,80,60,82,40,22,10,66 B 99,98,85,82,80,77,66,60,40,22,10 C 10,22,40,60,66,77,80,82,85,98,99 D 99,85,40,77,80,60,66,98,82,10,22 9.Strassen矩阵乘法的算法复杂度为()。 AΘ(n3)BΘ(n2.807) CΘ(n2) DΘ(n) 10.集合A的幂集是()。 A.A中所有元素的集合 B. A的子集合 C. A 的所有子集合的集合 D. 空集 11.与算法英文单词algorithm具有相同来源的单词是()。 A logarithm B algiros C arithmos D algebra 12.从排序过程是否完全在内存中显示,排序问题可以分为()。 A稳定排序与不稳定排序B内排序与外排序 C直接排序与间接排序D主排序与辅助排序 13.下列()不是衡量算法的标准。 A时间效率B空间效率 C问题难度D适应能力 14.对于根树,出度为零的节点为()。 A0节点B根节点C叶节点D分支节点 15.对完全二叉树自顶向下,从左向右给节点编号,节点编号为10的父节点编号为()。 A0B2C4D6 16.下列程序段的算法时间的复杂度为()。 for i ←0 to n do for j ←0 to m do

经典算法题目

【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... public class exp2{ public static void main(String args[]){ int i=0; for(i=1;i<=20;i++) System.out.println(f(i)); } public static int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } } 【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 【程序3】 题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 【程序4】 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:

(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果n <> k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 【程序5】 题目:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。 1.程序分析:(a> b)?a:b这是条件运算符的基本例子。 【程序6】 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 1.程序分析:利用辗除法。 【程序7】 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 1.程序分析:利用while语句,条件为输入的字符不为 '\n '. 【程序8】 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如 2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。 1.程序分析:关键是计算出每一项的值。 【程序9】 题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程找出1000以内的所有完数。 【程序10】 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高? 【程序11】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排

算法分析复习题(含答案)

一、选择题 1、衡量一个算法好坏的标准是( C )。 (A)运行速度快(B)占用空间少(C)时间复杂度低(D)代码短 2、记号O的定义正确的是(A)。 (A)O(g(n)) = { f(n) | 存在正常数c和n0使得对所有n≥n0有:0≤ f(n) ≤ cg(n) }; (B)O(g(n)) = { f(n) | 存在正常数c和n0使得对所有n≥n0有:0≤ cg(n) ≤ f(n) }; (C)O(g(n)) = { f(n) | 对于任何正常数c>0,存在正数和n0 >0使得对所有n≥n0 有:0 ≤f(n)0,存在正数和n0 >0使得对所有n≥n0 有:0 ≤cg(n) < f(n) }; 3、二分搜索算法是利用( A )实现的算法。 (A)分治策略(B)动态规划法(C)贪心法(D)回溯法

4、使用分治法求解不需要满足的条件是(A )。 (A)子问题必须是一样的(B)子问题不能够重复 (C)子问题的解可以合并(D)原问题和子问题使用相同的方法解 5、合并排序算法是利用( A )实现的算法。 (A)分治策略(B)动态规划法(C)贪心法 (D)回溯法 6、实现大整数的乘法是利用(C )的算法。 (A)贪心法(B)动态规划法(C)分治策略 (D)回溯法 7、以下不可以使用分治法求解的是( D )。 (A)棋盘覆盖问题(B)选择问题(C)归并排序(D)0/1背包问题 8、实现循环赛日程表利用的算法是( A )。 (A)分治策略(B)动态规划法(C)贪心法(D)回溯法 9、实现棋盘覆盖算法利用的算法是( A )。

相关文档
最新文档