算法设计与分析大作业西安电子科技大学

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

算法设计技术与方法

学院电子工程学院专业电子与通信工程学号

学生姓名

授课教师公茂果

问题一

1 问题描述

分别实现多项式求值的三种运算,针对不同规模的输入值a,各算法的运行时间,问题规模n分别取10, 50, 100, 150, 200, 300, 400, 500, 10000, 20000, 50000, 100000时绘制三种算法运行时间的比较图。

2 算法分析

1)算法1:P n(x) = P n-1(x) + a n x n→P i(x) = P i-1(x) + a i x i

该算法的伪代码表示如下:

begin

P := a0;

for i=1 to n do

P = P + a i x i;

end

end

该算法的时间复杂度为T(n) = O(n2)。

2)算法2:在上一算法中,可以看出xi重复计算了。如果

把上一次计算出的xi-1保存起来,直接乘以x,就可以得到xi,这样就可以避免重复计算。

该算法的伪代码表示如下:

begin

P := a0;

Q := 1;

for i=1 to n do

Q = Qx;

P = P + a i Q;

end

end

该算法的时间复杂度为T(n) = O(n)。

3)算法3:P n(x) = P’n-1(x)x+a0,

P’n-1(x)=a n x n-1+a n-1x n-2+…+a2x+a1

→P’i(x)=P’i-1(x)x+a n-i

该算法的伪代码表示如下:

begin

P := a n;

for i=1 to n do

P = xP + a n-i;

end

end

该算法的时间复杂度为T(n) = O(n)。

3 实验数据

下表为实验中所测得的数据:

4 实验结果图

下图为用所测得的数据画出的运行时间对比图,横轴为多项式的规模n,纵轴为运行时间。为了便于观察,横坐标采用了对数坐标。

从上图可以看出,在多项式的规模n < 1000时,这三种算法的运行时间都差不多。在n > 1000时,可以明显地看出算法2和算法3的优越性。由于算法2和算法3的时间复杂度都为O(n),所以这两种算法的运行时间差不多。

三种算法的运行时间曲线与前面分析的三种算法的时间复杂度也是相吻和的:算法1的时间复杂度为O(n2),运行

时间随着n的增长呈平方律增长;算法2和算法3的时间复杂度为O(n),运行时间随着n的增长而线性增长。

5 源代码

3)% polyval1.m ---- 算法1的实现

function val = polyval1(a, x) % 该函数用来实现算法1 n = length(a);

val = a(1);

for i = 1:(n-1)

val = val + a(i+1)*x^i;

end;

3)% polyval2.m ---- 算法2的实现

function val = polyval3(a, x) % 该函数用来实现算法2 n = length(a);

val = a(1);

temp = 1;

for i = 1:(n-1)

temp = temp * x;

val = val + a(i+1)*temp;

end;

3)% polyval3.m ---- 算法3的实现

function val = polyval4(a, x) % 该函数用来实现算法3 n = length(a);

val = a(n);

for i = 1:(n-1)

val = val * x + a(n - i);

end;

3)% main.m ---- n取不同值时,分别计算3种算法的运行时间

n = [10 50 100 150 200 300 400 500 10000 20000 50000 100000];

x = 1.001; % x取1.001以下才能保证结果不溢出

for i = 1:length(n)

a = rand(n(i), 1);

origin_time = cputime;

for j = 1:500

polyval1(a, x);

end;

time1(i) = (cputime - origin_time)/500; % 计算算法1的运行时间

origin_time = cputime;

for j = 1:1000

polyval2(a, x);

end;

time2(i) = (cputime - origin_time)/1000; % 计算算法2

的运行时间

origin_time = cputime;

for j = 1:1000

polyval3(a, x);

end;

time3(i) = (cputime - origin_time)/1000; % 计算算法3的运行时间

end;

save data time1 time2 time3 %保存数据

load data %加载数据

% 画图

semilogx(n, time1,'-b*', n, time2, ':b*', n, time3, '-.b*'); xlabel('n'),ylabel('时间/s');

legend('算法1','算法2','算法3');

grid on

相关文档
最新文档