《算法技术手册》一2.4.7 性能不明显的计算

简介: 本节书摘来华章计算机《算法技术手册》一书中的第2章 ,第2.4.7节, George T.Heineman Gary Pollice Stanley Selkow 著 杨晨 曹如进 译 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.4.7 性能不明显的计算

在很多情况下,仅仅通过算法的描述(如加法和乘法)就可以分辨出算法的性能是线性级还是平方级的。例如,平方级的主要特征是嵌入的循环结构。但是,这样的直接分析对某些算法却无法使用。例2-5给出了GCD算法,该算法是由欧几里德设计,用于计算两个整数的最大公约数。
例2-5:欧几里得GCD 算法
public static void gcd (int a[], int b[], int gcd[]) {
if (isZero (a)) { assign (gcd, a); return; }
if (isZero (b)) { assign (gcd, b); return; }
a = copy (a); // 确保a和b都没有被修改
b = copy (b);
while (!isZero (b)) {

// 最后一个参数表示结果符号,这里可以忽略它,
// 因为我们总是用大数减去小数
// 注意如果a > b,compareTo(a, b)的结果为正数

if (compareTo (a, b) > 0) {

subtract (a, b, gcd, new int[1]); 
assign (a, gcd);

} else{

subtract (b, a, gcd, new int[1]); 
  assign (b, gcd);
}

}
// a的值就是原先a和b的最大公约数
assign (gcd, a);
}
这个算法不断地比较a和b,然后用大数减去小数直至得到0为止。其中的辅助函数(isZero、assign、compareTo和subtract)都可以在代码库中找到。
虽然这个算法可以计算出两个数的最大公约数,但是对于给定的输入规模,要经过多少次迭代,这个答案并不明显。由于每一次循环之后,a或者b都不会变为负数,因此能够保证的是这个算法一定会结束,但是某些GCD的计算可能会需要较长的时间,例如,该算法计算gcd(1000, 1)时会执行999步!很明显,这个算法的性能对于输入数据的敏感程度比乘法和加法算法要大得多。对于相同规模的输入来说,GCD算法的时间是随着输入数据的变化而变化的。GCD算法在计算(10k-1, 1) 的最大公约数时性能最差,它需要处理n=10k-1次循环!由于加法和减法在数据规模为n时的时间复杂度均为O(n),因此GCD算法可以被归类为O(n2)。
例2-6中ModGCD算法的性能要比例2-5的GCD实现好得多,这个算法使用取模计算a除以b的余数。
例2-6:ModGCD 算法计算最大公约数
public static void modgcd (int a[], int b[], int gcd[]) {
if (isZero(a)) { assign (gcd, a); return; }
if (isZero(b)) { assign (gcd, b); return; }

// 将a、b调整到相同位数,然后在其副本上进行计算
a = copy(normalize(a, b.length));
b = copy(normalize(b, a.length));
// 确保a比b大,同时返回最大公约数
int rc = compareTo(a,b);
if (rc == 0) { assign (gcd, a); return; }
if(rc < 0){ 
int t[]=b;
b=a;
a=t; 

}
int quot[] = new int[a.length];
int remainder[] = new int[a.length];
while (!isZero(b)) {
int t[] = copy (b);
divide (a, b, quot, remainder);
assign (b, remainder);
assign (a, t);
}
// a 的值就是原始的(a,b)的最大公约数
assign (gcd, a);
}
ModGCD能够更快地得到解,因为它不会在while循环中不断地从大数中减去小数。这个差异并不仅仅体现在实现细节上,也反映了在如何使用算法解决问题方面的一个根本性改变。
图2-5和表2-5展示了针对随机产生的142个n位数,求解所有10 011对整数对最大公约数的计算结果。
2017_09_20_100216
图2-5:比较gcd和modgcd算法
2017_09_20_100249
对于随机数据,即便ModGCD实现比对应的GCD实现约快3倍,它的性能依旧是平方级,也就是O(n2)。分析ModGCD算法的最坏情况有些难度,研究表明当ModGCD处理两个连续的Fibonacci数字时性能最差。从图2-5上也可以推断出算法是平方级的,因为算法性能在数据规模翻倍后变为原先的4倍。
计算最大公约数还有着更为优秀的算法,不过这些算法主要针对特别大的整数,因而在实际场景中并不实用。

相关文章
|
3月前
|
算法 机器人
基于SOA海鸥优化算法的PID控制器最优控制参数计算matlab仿真
本课题研究基于海鸥优化算法(SOA)优化PID控制器参数的方法,通过MATLAB仿真对比传统PID控制效果。利用SOA算法优化PID的kp、ki、kd参数,以积分绝对误差(IAE)为适应度函数,提升系统响应速度与稳定性。仿真结果表明,SOA优化的PID控制器在阶跃响应和误差控制方面均优于传统方法,具有更快的收敛速度和更强的全局寻优能力,适用于复杂系统的参数整定。
|
7月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
2月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
225 4
|
3月前
|
算法 数据挖掘 异构计算
【多目标优化算法比较】MOFPA、MOFA、MOCS、MOBA、MOHHO五种多目标优化算法性能对比研究(Matlab代码实现)
【多目标优化算法比较】MOFPA、MOFA、MOCS、MOBA、MOHHO五种多目标优化算法性能对比研究(Matlab代码实现)
241 0
【多目标优化算法比较】MOFPA、MOFA、MOCS、MOBA、MOHHO五种多目标优化算法性能对比研究(Matlab代码实现)
|
7月前
|
算法 JavaScript 数据安全/隐私保护
基于GA遗传优化的最优阈值计算认知异构网络(CHN)能量检测算法matlab仿真
本内容介绍了一种基于GA遗传优化的阈值计算方法在认知异构网络(CHN)中的应用。通过Matlab2022a实现算法,完整代码含中文注释与操作视频。能量检测算法用于感知主用户信号,其性能依赖检测阈值。传统固定阈值方法易受噪声影响,而GA算法通过模拟生物进化,在复杂环境中自动优化阈值,提高频谱感知准确性,增强CHN的通信效率与资源利用率。预览效果无水印,核心程序部分展示,适合研究频谱感知与优化算法的学者参考。
|
4月前
|
机器学习/深度学习 算法 5G
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
195 0
|
4月前
|
运维 监控 算法
基于 Java 滑动窗口算法的局域网内部监控软件流量异常检测技术研究
本文探讨了滑动窗口算法在局域网流量监控中的应用,分析其在实时性、资源控制和多维分析等方面的优势,并提出优化策略,结合Java编程实现高效流量异常检测。
187 0
|
5月前
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
145 2
|
7月前
|
监控 算法 JavaScript
基于 JavaScript 图算法的局域网网络访问控制模型构建及局域网禁止上网软件的技术实现路径研究
本文探讨局域网网络访问控制软件的技术框架,将其核心功能映射为图论模型,通过节点与边表示终端设备及访问关系。以JavaScript实现DFS算法,模拟访问权限判断,优化动态策略更新与多层级访问控制。结合流量监控数据,提升网络安全响应能力,为企业自主研发提供理论支持,推动智能化演进,助力数字化管理。
204 4

热门文章

最新文章