1. 百钱百鸡问题
问题提出:公元前5世纪末,中国古代数学家张丘建在他的《算经》中提出了著名的 “百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?即一百个铜钱买了一百只鸡,其中公鸡一只5钱、母鸡一只3钱,雏鸡一钱3只,问一百只鸡中公鸡、母鸡、雏鸡各多少? 算法的伪代码如下:
for x = 0 to 100
for y = 0 to 100
for z = 0 to 100
if (x+y+z=100) and (5*x + 3*y + z/3 = 100) then
System.out.println(" "+x+" "+y+" "+z)
end if
实验要求: 对上述算法做出改进以提高算法的效率,要求将算法的时间复杂性由Ο(n3)降为 Ο(n2),并将改进的算法编程实现。
思想: 将a, b, c 转换成 a, b, (100 - a - b);
public class moneyCock {
public static void main(String[] args) {
for (int i = 0; i <= 100; i++) {
for (int j = 0; j <= 100; j++) {
boolean edge = 100 - i - j >= 0 && 100 - i - j <= 100;
boolean money = i * 5 + j * 3 + (100 - i - j) / 3 == 100;
boolean flagTimes = (100 - i - j) % 3 == 0;
if (edge && money && flagTimes) {
System.out.println("公鸡数量" + i + ' ' + "母鸡数量为" + j + ' ' + "小鸡数量为" + (100 - i - j));
}
}
}
}
}
2. 算法和机器性能提高带来输入规模增大的比较
硬件厂商XYZ公司宣称他们研制的微处理器的运行速度是其竞争对手ABC公司同类产品的1000倍。对于计算复杂性分别为 n , n 2 , n 3 n,n^2,n^3 n,n2,n3 的各类算法,若用ABC公司的计算机能在1小时内解决输入规模的问题,则用XYZ公司的计算机在1小时内能解决多大输入规模的问题?
解:
假设ABC公司的微型处理器的运算速度是x,则XYZ公司的微型处理器的运算速度是
n
′
=
1000
n
n'= 1000n
n′=1000n
n
′
2
=
1000
n
2
n'^2=1000n^2
n′2=1000n2 →
n
′
=
1000
n
n'=\sqrt{1000}n
n′=1000n
n
′
3
=
1000
n
3
n'^3=1000n^3
n′3=1000n3 →
n
′
=
10
n
n'=10n
n′=10n
n
!
=
1000
n
!
n!=1000n!
n!=1000n! →
n
′
=
1000
+
l
o
g
1000
≈
1000
+
9.966
n'=1000+log1000 ≈ 1000 + 9.966
n′=1000+log1000≈1000+9.966
3. T = 3 × 2 n T=3×2^n T=3×2n
题目:假设某算法在输入规模为n时的计算时间为 T = 3 × 2 n T=3×2^n T=3×2n.在某台计算机上实现并完成该算法在 t 秒。现有另一台计算机,其运行速度为第一台的128倍,那么在这台新机器上用同一算法在t秒内能解输入输入规模为多大的问题?
解:
设新机器的规模是
n
1
n_1
n1
T
=
3
×
2
n
=
3
×
2
n
1
/
128
T=3×2^n=3×2^{n_1}/128
T=3×2n=3×2n1/128
n
1
=
n
+
7
n_1=n+7
n1=n+7