西农 算法设计与分析第四版王晓东(第一次作业)
1-3
写一个通用方法用于判定给定数组是否已排好序。
解: 分析问题:
1.满足从小到大或从大到小 2.满足各种合法的数据类型 3.满足负数,零和正数
//C++实现
template <class T>//使用模板
bool IsSorted(T* a, int n) {
int Lower = 0;
int Higher = 0;
int i = 0;
for (i = 0; i < n; i++) {
if (a[i] > a[i+1]) Lower ++;
if (a[i] < a[i+1]) Higher ++;
if (a[i] == a[i+1]) {Lower++;Higher++;}
if ((toLow == i) || (toHigh == i )) return true;
return false;
}
1-4
求下列函数的渐进表达式。
(
1
)
3
n
2
+
10
n
(1)3n^2+10n
(1)3n2+10n
(
2
)
n
2
/
10
+
2
n
(2) n^2/10+2^n
(2)n2/10+2n
(
3
)
21
+
1
/
n
(3)21+1/n
(3)21+1/n
(
4
)
log
n
3
(4) \log n^3
(4)logn3
(
5
)
10
log
3
n
(5) 10\log 3^n
(5)10log3n
解: 分析问题:
算法复杂性的关系:
O
(
1
)
<
O
(
log
n
)
<
O
(
n
log
n
)
<
O
(
n
)
<
O
(
n
2
)
<
O
(
n
3
)
<
⋯
<
O
(
n
m
)
<
O
(
2
n
)
<
O
(
n
!
)
<
O
(
n
n
)
O(1)<O(\log n)<O(n\log n)<O(n)<O(n^2)<O(n^3)<\cdots<O(n^m)<O(2^n)<O(n!)<O(n^n)
O(1)<O(logn)<O(nlogn)<O(n)<O(n2)<O(n3)<⋯<O(nm)<O(2n)<O(n!)<O(nn)
(
1
)
3
n
2
+
10
n
=
O
(
n
2
)
(1) 3n^2+10n=O(n^2)
(1)3n2+10n=O(n2)
(
2
)
n
2
/
10
+
2
n
=
O
(
2
n
)
(2) n^2/10+2^n=O(2^n)
(2)n2/10+2n=O(2n)
(
3
)
21
+
1
/
n
=
O
(
1
)
(3)21+1/n=O(1)
(3)21+1/n=O(1)
(
4
)
log
n
3
=
3
log
n
=
O
(
log
n
)
(4)\log n^3=3\log n=O(\log n)
(4)logn3=3logn=O(logn)
(
5
)
10
log
3
n
=
(
10
log
3
)
n
=
O
(
n
)
(5)10\log 3^n=(10\log 3)n=O(n)
(5)10log3n=(10log3)n=O(n)
1-5
说明
O
(
1
)
O(1)
O(1)和
O
(
2
)
O(2)
O(2)的区别。
解:
O
(
1
)
=
O
(
2
)
O(1)=O(2)
O(1)=O(2),用
O
(
1
)
O(1)
O(1)和
O
(
2
)
O(2)
O(2)表示同一个函数时,差别仅在于常数因子。
1-6
按照渐进阶从低到高的顺序排列以下表达式:
4
n
2
,
log
n
,
3
n
,
20
n
,
2
,
n
2
/
3
4n^2,\log n,3^n,20n,2,n^{2/3}
4n2,logn,3n,20n,2,n2/3。又
n
!
n!
n!应该排在哪一位?
解: 排列顺序为:
2
,
log
n
,
n
2
/
3
,
4
n
2
,
3
n
,
n
!
2,\log n,n^{2/3},4n^2,3^n,n!
2,logn,n2/3,4n2,3n,n!。
1-7
(1)假设某算法在输入规模为
n
n
n时的计算时间为
T
(
n
)
=
3
×
2
n
T(n)=3\times2^n
T(n)=3×2n。在某台计算机上实现并完成该算法的时间为
t
t
t秒。现有另一台计算机,其运行速度为第一台的
64
64
64倍,那么在这台新机器上用同一算法在
t
t
t秒内能解输入规模多大的问题?
(2)若上述算法的计算时间改进为
T
(
n
)
=
n
2
T(n)=n^2
T(n)=n2,其余条件不变,则在新机器上用
t
t
t秒时间能解输入规模多大的问题?
(3)若上述算法的计算时间进一步改进为
T
(
n
)
=
8
T(n)=8
T(n)=8,其余条件不变,那么在新机器上用
t
t
t秒时间能解输入规模多大的问题?
解:
(
1
)
(1)
(1)由题知
3
×
2
n
=
(
3
×
2
n
1
)
/
64
3\times2^n=(3\times2^{n_1})/64
3×2n=(3×2n1)/64,解得
n
1
=
n
+
6
n_1=n+6
n1=n+6,则能解输入规模为
n
+
6
n+6
n+6的问题。
(
2
)
(2)
(2)由题知
n
2
=
n
2
2
/
64
n^2=n_2^2/64
n2=n22/64,解得
n
2
=
8
n
n_2=8n
n2=8n,则能解输入规模为
8
n
8n
8n的问题。
(
3
)
(3)
(3)在输入规模为
n
n
n时的计算时间为
T
(
n
)
=
8
T(n)=8
T(n)=8,则能解任意输入规模的问题。
1-8
硬件厂商XYZ公司宣称他们最新研制的微处理器的运行速度为其竞争对手ABC公司同类产品的的100倍。对于计算复杂性分别为
n
,
n
2
,
n
3
n,n^2,n^3
n,n2,n3和
n
!
n!
n!的各算法,若用ABC公司的计算机在1小时内能解决输入规模为
n
n
n的问题,那么用XYZ公司的计算机在1小时内分别能解输入规模为多大的的问题?
解:
n
1
=
100
n
;
n
2
2
=
100
n
2
,
n_1=100n;{n_2}^2=100n^2,
n1=100n;n22=100n2,则
n
2
=
10
n
;
n
3
3
=
100
n
3
,
n_2=10n;{n_3}^3=100n^3,
n2=10n;n33=100n3,则
n
3
=
100
3
n
;
n_3=\sqrt[3]{100}n;
n3=3100n;
1-9
对于下列各组函数
f
(
n
)
f(n)
f(n)和
g
(
n
)
g(n)
g(n),确定
f
(
n
)
=
O
(
g
(
n
)
)
f(n)=O(g(n))
f(n)=O(g(n))或
f
(
n
)
=
Ω
(
g
(
n
)
)
f(n)=\Omega(g(n))
f(n)=Ω(g(n))或
f
(
n
)
=
θ
(
g
(
n
)
)
f(n)=\theta(g(n))
f(n)=θ(g(n)),并简述理由。
(
1
)
f
(
n
)
=
log
n
2
,
g
(
n
)
=
log
n
+
5
(1)f(n)=\log n^2,g(n)=\log n+5
(1)f(n)=logn2,g(n)=logn+5
(
2
)
f
(
n
)
=
log
n
2
,
g
(
n
)
=
n
(2)f(n)=\log n^2,g(n)=\sqrt{n}
(2)f(n)=logn2,g(n)=n
(
3
)
f
(
n
)
=
n
,
g
(
n
)
=
log
2
n
(3)f(n)=n,{g(n)=\log}^2 n
(3)f(n)=n,g(n)=log2n
(
4
)
f
(
n
)
=
n
log
n
+
n
,
g
(
n
)
=
log
n
(4)f(n)=n\log n+n,g(n)=\log n
(4)f(n)=nlogn+n,g(n)=logn
(
5
)
f
(
n
)
=
10
,
g
(
n
)
=
log
10
(5)f(n)=10,g(n)=\log 10
(5)f(n)=10,g(n)=log10
(
6
)
f
(
n
)
=
log
2
n
,
g
(
n
)
=
log
n
(6)f(n)={\log}^2 n,g(n)=\log n
(6)f(n)=log2n,g(n)=logn
(
7
)
f
(
n
)
=
2
n
,
g
(
n
)
=
100
n
2
(7)f(n)=2^n,g(n)=100n^2
(7)f(n)=2n,g(n)=100n2
(
8
)
f
(
n
)
=
2
n
,
g
(
n
)
=
3
n
(8)f(n)=2^n,g(n)=3^n
(8)f(n)=2n,g(n)=3n
解: 分析问题:
算法复杂性的关系:
O
(
1
)
<
O
(
log
n
)
<
O
(
n
log
n
)
<
O
(
n
)
<
O
(
n
2
)
<
O
(
n
3
)
<
⋯
<
O
(
n
m
)
<
O
(
2
n
)
<
O
(
n
!
)
<
O
(
n
n
)
O(1)<O(\log n)<O(n\log n)<O(n)<O(n^2)<O(n^3)<\cdots<O(n^m)<O(2^n)<O(n!)<O(n^n)
O(1)<O(logn)<O(nlogn)<O(n)<O(n2)<O(n3)<⋯<O(nm)<O(2n)<O(n!)<O(nn)
(
1
)
log
n
2
=
2
log
n
(1)\log n^2=2\log n
(1)logn2=2logn,则
f
(
n
)
f(n)
f(n)与
g
(
n
)
g(n)
g(n)同阶,即
log
n
2
=
θ
(
log
n
+
5
)
\log n^2=\theta(\log n+5)
logn2=θ(logn+5)。
(
2
)
log
n
2
=
2
log
n
≤
n
(2)\log n^2=2\log n\le\sqrt{n}
(2)logn2=2logn≤n,则
g
(
n
)
g(n)
g(n)是
f
(
n
)
f(n)
f(n)的上界,即
log
n
2
=
O
(
n
)
\log n^2=O(\sqrt{n})
logn2=O(n)。
(
3
)
(3)
(3)令
n
=
2
m
n=2^m
n=2m,则
f
(
n
)
=
2
m
,
g
(
n
)
=
m
2
f(n)=2^m,g(n)=m^2
f(n)=2m,g(n)=m2,则
g
(
n
)
g(n)
g(n)是
f
(
n
)
f(n)
f(n)的下界,即
n
=
Ω
(
log
2
n
)
n=\Omega({\log}^2 n)
n=Ω(log2n)。
(
4
)
n
log
n
+
n
≥
log
n
(4)n\log n+n\ge\log n
(4)nlogn+n≥logn,则
g
(
n
)
g(n)
g(n)是
f
(
n
)
f(n)
f(n)的下界,即
n
log
n
+
n
=
Ω
(
log
n
)
n\log n+n=\Omega(\log n)
nlogn+n=Ω(logn)。
(
5
)
10
(5)10
(5)10和
log
10
\log 10
log10都是常数,则
f
(
n
)
f(n)
f(n)与
g
(
n
)
g(n)
g(n)同阶,即
10
=
θ
(
log
10
)
10=\theta(\log 10)
10=θ(log10)。
(
6
)
log
2
n
=
log
n
×
log
n
≥
log
n
(6){\log}^2 n=\log n\times\log n\ge\log n
(6)log2n=logn×logn≥logn,则
g
(
n
)
g(n)
g(n)是
f
(
n
)
f(n)
f(n)的下界,即
log
2
n
=
Ω
(
log
n
)
{\log}^2 n=\Omega(\log n)
log2n=Ω(logn)。
(
7
)
2
n
≥
100
n
2
(7)2^n\ge100n^2
(7)2n≥100n2,则
g
(
n
)
g(n)
g(n)是
f
(
n
)
f(n)
f(n)的下界,即
2
n
=
Ω
(
100
n
2
)
2^n=\Omega(100n^2)
2n=Ω(100n2)。
(
8
)
2
n
≤
3
n
(8)2^n\le3^n
(8)2n≤3n,则
g
(
n
)
g(n)
g(n)是
f
(
n
)
f(n)
f(n)的上界,即
2
n
=
O
(
3
n
)
2^n=O(3^n)
2n=O(3n)。