已知有实现同一功能的两个算法,其时间复杂度分别为
nO 2 和
10nO
,假设现实计算机
可连续运算的时间为
710 秒(100 多天),又每秒可执行基本操作(根据这些操作来估算算
法时间复杂度)
510 次。试问在此条件下,这两个算法可解问题的规模(即 n 值的范围)各
为多少?哪个算法更适宜?请说明理由。
2 n
1210
解:
n=40
10
10n
12
n=16
则对于同样的循环次数 n,在这个规模下,第二种算法所花费的代价要大得多。故在这个规
模下,第一种算法更适宜。
设有以下三个函数:
nf
4
21
n
2
n
1000
,
ng
15
n
4
500
n
3
,
nh
500
n
5.3
n
log
n
请判断以下断言正确与否:
f(n)是 O(g(n))
h(n)是 O(f(n))
g(n)是 O(h(n))
h(n)是 O(n3.5)
h(n)是 O(nlogn)
解:(1)对 (2)错 (3)错 (4)对 (5)错
50
n
试设定若干 n 值,比较两函数
2n 和
log
2
n
的增长趋势,并确定 n 在什么范围内,函数
2n
的值大于
50
n
log
n
2
的值。
解:
2n 的增长趋势快。但在 n 较小的时候,
50
n
log
n
2
的值较大。
当 n>438 时,
2
n
50
n
log
n
2
判断下列各对函数 nf 和 ng ,当
n
时,哪个函数增长更快?
nf
10 2
n
nf
ln
!
n
nf
1.2
n
nf
2 3
n
(1)
(2)
(3)
(4)
n
,
ng
2 4
n
n
7
ln
310!
n
,
25
ng
,
ng
,
ng
14
n
22
n
5.2
13n
ln
2!
n
n
2
n
n
5
n
解:(1)g(n)快 (2)g(n)快 (3)f(n)快 (4) f(n)快
试用数学归纳法证明:
n
2
i
i
1
nn
21
n
6/1
0n
n
i
0
i
x
x
n
/11
x
1
x
n
,1
0
1n
1n
(1)
(2)
(3)
(4)
n
n
i
2
1
i
1
n
2
1
1
2
i
2
n
i
1
试写一算法,自大至小依次输出顺序读入的三个整数 X,Y 和 Z 的值
解:
int max3(int x,int y,int z)
{
if(x>y)
if(x>z) return x;
else return z;
else
if(y>z) return y;
else return z;
}
已知 k 阶斐波那契序列的定义为
0 f
0
1 f
0
,
,…,
2 kf
0
1 kf
1
;
,
f
n
f
n
1
f
2
n
f
n
,
kk
,1
kn
,
试编写求 k 阶斐波那契序列的第 m 项值的函数算法,k 和 m 均以值调用的形式在函数参数表
中出现。
解:k>0 为阶数,n 为数列的第 n 项
int Fibonacci(int k,int n)
{
if(k<1) exit(OVERFLOW);
int *p,x;
p=new int[k+1];
if(!p) exit(OVERFLOW);
int i,j;
for(i=0;i
for(j=0;jarrsize 或对某个
k
1
k
n
,使
k
k
2!
max
int
时,应按出错处理。注意选择你认为较好的出错处理方法。
解:
#include
#include
#define MAXINT 65535
#define ArrSize 100
int fun(int i);
int main()
{
int i,k;
int a[ArrSize];
cout<<"Enter k:";
cin>>k;
if(k>ArrSize-1) exit(0);
for(i=0;i<=k;i++){
if(i==0) a[i]=1;
else{
if(2*i*a[i-1]>MAXINT) exit(0);
else a[i]=2*i*a[i-1];
}
}
for(i=0;i<=k;i++){
if(a[i]>MAXINT) exit(0);
else cout<
#include
#define N
double polynomail(int a[],int i,double x,int n);
int main()
{
double x;
int n,i;
int a[N];
cout<<"输入变量的值 x:";