算法效率分析:渐近记号与复杂性探讨

需积分: 9 2 下载量 173 浏览量 更新于2024-08-13 收藏 2.43MB PPT 举报
本篇文章主要探讨了渐近分析记号在算法效率分析中的核心性质和应用,以及算法效率评价的多个方面。首先,文章强调了算法分析的重要性,尤其是时间效率和空间效率,其中时间效率通常被优先考虑,因为对于大部分问题,提高速度比优化空间需求更为关键。 在反身性方面,作者阐述了三种常见的渐近关系: 1. `f(n) ∈ Θ(f(n))` 表示函数f(n)与自身在增长速度上相等,即存在正实数常数c1和c2,使得0 < c1 * f(n) <= f(n) <= c2 * f(n) 对于所有足够大的n成立。 2. `f(n) ∈ O(f(n))` 指函数f(n)的上限是其自身的某个倍数,表示存在正实数常数c,使得对于所有n大于某个值N,都有f(n) <= c * f(n)。 3. `f(n) ∈ Ω(f(n))` 则表示函数f(n)的下限也是其自身,即存在正实数c,对于所有n大于N,都有f(n) >= c * f(n)。 对称性原则指出,如果f(n)属于某个类,那么g(n)也必然属于相同的类,反之亦然,即 `f(n) ∈ Θ(g(n)) ⇔ g(n) ∈ Θ(f(n))` 和 `f(n) ∈ O(g(n)) ⇔ g(n) ∈ Ω(f(n))`。 互对称性进一步揭示了函数之间的关系,即 `f(n) ∈ o(g(n))` 表示f(n)的增长速度比g(n)慢得多,而 `g(n) ∈ ω(f(n))` 则意味着g(n)的速度远超f(n)。 文章还提到了算法的五个基本特征:可行性、确定性、有穷性、输入和输出,以及算法的评价标准,如正确性、可读性、健壮性和复杂性。复杂性主要通过时间复杂性和空间复杂性来衡量,前者关注的是执行算法所需的运行时间,后者关注的是算法在执行过程中使用的额外存储空间。 在分析框架中,作者建议以算法的输入规模n作为参数来研究效率,并指出通常以基本操作的运行次数作为衡量运行时间的标准。基本操作的选择应能反映算法的核心计算过程,其运行次数直接影响算法的总体性能。 总结来说,本文深入解析了渐近分析记号在算法效率分析中的应用,提供了理解和评估算法性能的重要工具,并强调了时间效率和空间效率评价体系的关键要素。

%% 求解根轨迹与渐近线 % 创建系统模型 num = 10 * conv([2 5], conv([1 6 34], [1])); den = conv([1 7], [50 644 996 -739 -3559]); sys = tf(num, den); % 计算系统的增益值 K = dcgain(sys); % 绘制根轨迹 figure; rlocus(sys); hold on; % 计算并绘制渐近线 p = pole(sys); z = zero(sys); if isempty(z) z = 0; % 若不存在零点则认为有一个零点在原点 end theta_p = angle(p - 7); theta_z = angle(z - 7); zeta = 0.6; T = 0.1; for i = 1:length(p) a = real(p(i)); b = imag(p(i)); sin_theta_a = sqrt(1 - zeta^2); K = abs(prod(-1-p/7)) / abs((a - p(i))*(a - conj(p(i)))); sigma_a = real(roots(den)); jw_intersection = imag(p(i)) - imag(p(i)) / tan(theta_p(i)); if ~isempty(z) y_asymptote = imag(tf([0 1], [1 sigma_a], T)) - imag(z(i)) + (imag(p(i)) / tan(theta_p(i))); else y_asymptote = jw_intersection / sin_theta_a; end plot([a-sigma_a,a+sigma_a],[b+jw_intersection,b+jw_intersection],'r--'); plot([a-sigma_a,a+sigma_a],[b+y_asymptote,b+y_asymptote],'m--'); end % 计算并输出渐近线与实轴的交点 sigma_a = real(roots(den)); disp(['Intersection of asymptotes and axis: sigma_a = ' num2str(sigma_a)]); % 计算并输出渐近线与实轴的夹角 angle_d = (180/pi)*angle(-10); % 在此,我默认第一个极点在左侧,因此角度为负 disp(['Angle between asymptotes and axis: ' num2str(angle_d) ' deg']); % 计算并输出分离点 zp = pole(sys(sys.num{1}==0)); % 零点为0的极点 if isempty(zp) fprintf('No breakaway/ break-in points.\n'); else fprintf('Breakaway/ Break-in point(s): \n'); for i = 1:length(zp) fprintf('%g + %gi\n', real(zp(i)), imag(zp(i))); end end % 计算并输出根轨迹与虚轴的交点 p1 = pole(sys); z1 = zero(sys); ImAxisCrossings = []; for k = 1:length(p1) if real(p1(k)) < 0 && imag(p1(k)) == 0 continue; % 跳过实部为负的极点,因为它们并不与虚轴相交 end if ~isempty(z1) M = abs(prod((-1)*z1)); N = ((K*abs(conv([1 -p1(k)], [1 -conj(p1(k))])))/abs(den(end))); % 计算二次项系数 kz = N/M; else kz = K; end s = [p1(k) zeros(1, length(z1))]; for i = 1:100 % 改为100步 s = [roots(conv([1 -s(end)], [1 -s(1:end-1)])) s(end)]; if ~isempty(find(abs(imag(s))<1e-3 & imag(s.*conj(s))>1e-3, 1)) ImAxisCrossings = [ImAxisCrossings real(s(find(abs(imag(s))<1e-3 & imag(s.*conj(s))>1e-3, 1)))]; end end end if isempty(ImAxisCrossings) fprintf('No intersection with imaginary axis.\n'); else end fprintf('Intersection(s) with imaginary axis: \n');

2023-06-09 上传