《算法技术手册》一2.4.2 对数级算法的性能

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

2.4.2 对数级算法的性能

酒保和顾客打了一个10 000 美元的赌。酒保说:“我会从1~1 000 000中挑选一个秘密数字,你有20次的机会来猜这个数字。每次猜完,我会告诉你结果是高了、低了,还是猜中了。如果你能在20个问题之内猜到我的秘密数字,我给你10 000美元,否则你给我10 000美元。”你会打这个赌吗?回答当然是应该打,因为你能够稳赢。表2-1给出了范围为1~8的示例场景。表中展示了如何通过一系列的询问,每次将候选数据缩减一半。
表2-1:在1~8之间猜数字的示例行为
2017_09_19_161341
酒保的每次回答都可以将数字范围缩减一半,直到剩下最后一个可能的数字。最后的情况会在1 + log2 (n)次询问之后出现,其中log2(x)是计算以2为底数的x的对数。向下取整函数x将数字x向下取整到小于等于x的最大整数。例如,如果酒保选择的数字在1~10,你需要猜测的次数为1 + log2 (10)= 1 + 3.32,即4次。如果需要进一步证实上述公式,可以假设酒保在两个数字中选择一个,那么你需要两次才能保证猜到该数字,即1 + log2 (2) = 1 + 1 = 2。需要注意的是,根据酒保的规则,你必须要说出你猜的数字。
这种方法在1 000 000个数字的时候也同样可行。事实上,例2-1所示的猜数算法能够对于任意范围[low, high]有效,并且在1 +log2 (high-low+1)次内猜测到隐藏的数字n。如果有1 000 000个数字,那么这个算法将在最多1 +log2 (1 000 000)= 1 + 19.93亖最多猜20次(最坏情况)就可以知道是哪个数字。
例2-1:在范围[low, high]之间猜数字的Java代码
// 当n确认在范围[low, high]时,计算需要猜测的次数
public static int turns (int n, int low, int high) {
int turns = 0;
// 如果还有潜在的数字需要猜测,则继续
while (high >= low) {

turns++;
int mid = (low + high)/2;
if (mid == n) {
   return turns;
} else if (mid < n) {
  low = mid + 1;
} else {
  high = mid -1;
}

}
return turns;
}
对数级算法是非常高效的,因为它们能够快速收敛得到解。这种算法的成功之处在于可以每次将问题的规模缩减一半。以上的猜数算法最多经过k = 1 + log2 (n)次迭代就可以得到解,在第i次(0在书中接下去的部分中,log(n)均指代以2为底的对数,因此我们会舍弃log2 (n)中的下标。
另外一个展现高效对数级算法的例子是使用二分(bisection)算法求一元方程的根,即求出满足连续型函数f(x) = 0的x。已知有两个初始值a和b,其中f(a)和f(b)正负符号相反,即一个是正数,另一个是负数。在每一步中,算法二分范围[a, b]并计算它的中间点c,以此来决定根所在的半区间。因此,每一轮都会使得c更加近似根值,并将误差值削减一半。
为了求f(x) = xsin(x)-5x -cos(x)的根,已知a = -1,b = 1。算法会逐渐收敛至f(x) = 0,x=-0.189302759即为方程的根(见表2-2)。
表2-2:二分法
2017_09_19_161641

相关文章
|
2月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
68 1
|
15天前
|
缓存 算法 数据处理
时间&空间复杂度,Python 算法的双重考验!如何优雅地平衡两者,打造极致性能?
在Python算法中,时间与空间复杂度的平衡至关重要。时间复杂度反映算法执行时间随输入规模的变化趋势,空间复杂度则关注额外存储空间的需求。优秀的算法需兼顾两者,如线性搜索时间复杂度为O(n),空间复杂度为O(1);二分查找在时间效率上显著提升至O(log n),空间复杂度保持为O(1);动态规划通过牺牲O(n)空间换取O(n)时间内的高效计算。实际应用中,需根据具体需求权衡,如实时数据处理重视时间效率,而嵌入式系统更关注空间节约。通过不断优化,我们能在Python中找到最佳平衡点,实现高性能程序。
37 3
|
2月前
|
机器学习/深度学习 人工智能 算法
【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+TensorFlow
眼疾识别系统,使用Python作为主要编程语言进行开发,基于深度学习等技术使用TensorFlow搭建ResNet50卷积神经网络算法,通过对眼疾图片4种数据集进行训练('白内障', '糖尿病性视网膜病变', '青光眼', '正常'),最终得到一个识别精确度较高的模型。然后使用Django框架开发Web网页端可视化操作界面,实现用户上传一张眼疾图片识别其名称。
72 9
【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+TensorFlow
|
2月前
|
存储 人工智能 算法
AI算法的道德与社会影响:探索技术双刃剑的边界
【8月更文挑战第22天】AI算法作为一把双刃剑,在推动社会进步的同时,也带来了诸多道德与社会挑战。面对这些挑战,我们需要以开放的心态、严谨的态度和创新的思维,不断探索技术发展与伦理规范之间的平衡之道,共同构建一个更加美好、更加公正的AI未来。
|
2月前
|
机器学习/深度学习 自然语言处理 负载均衡
揭秘混合专家(MoE)模型的神秘面纱:算法、系统和应用三大视角全面解析,带你领略深度学习领域的前沿技术!
【8月更文挑战第19天】在深度学习领域,混合专家(Mixture of Experts, MoE)模型通过整合多个小型专家网络的输出以实现高性能。从算法视角,MoE利用门控网络分配输入至专家网络,并通过组合机制集成输出。系统视角下,MoE需考虑并行化、通信开销及负载均衡等优化策略。在应用层面,MoE已成功应用于Google的BERT模型、Facebook的推荐系统及Microsoft的语音识别系统等多个场景。这是一种强有力的工具,能够解决复杂问题并提升效率。
57 2
|
2月前
|
算法 数据安全/隐私保护
基于LS算法的OFDM+QPSK系统信道估计均衡matlab性能仿真
基于MATLAB 2022a的仿真展示了OFDM+QPSK系统中最小二乘(LS)算法的信道估计与均衡效果。OFDM利用多个低速率子载波提高频谱效率,通过循环前缀克服多径衰落。LS算法依据导频符号估计信道参数,进而设计均衡器以恢复数据符号。核心程序实现了OFDM信号处理流程,包括加性高斯白噪声的加入、保护间隔去除、快速傅立叶变换及信道估计与均衡等步骤,并最终计算误码率,验证了算法的有效性。
60 2
|
2月前
|
机器学习/深度学习 监控 算法
目标检测算法技术
8月更文挑战第11天
|
2月前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
2月前
|
机器学习/深度学习 数据采集 人工智能
理解并应用机器学习算法:从技术基础到实践应用
【8月更文挑战第10天】机器学习算法的应用已经深入到我们生活的方方面面,理解和掌握机器学习算法对于数据科学家、工程师乃至普通从业者来说都至关重要。通过本文的介绍,希望大家能够对机器学习有一个基本的认识,并学会如何将其应用于实际问题中。当然,机器学习是一个不断发展和演变的领域,只有不断学习和实践,才能跟上时代的步伐。
|
2月前
|
机器学习/深度学习 算法 数据可视化
Python数据分析高手修炼手册:线性回归算法,让你的数据说话更有力
【8月更文挑战第1天】在数据驱动时代,掌握数据分析技能至关重要。线性回归是最基础且强大的工具之一,能从复杂数据中提炼简单有效的模型。本文探索Python中线性回归的应用并通过实战示例加深理解。线性回归建立变量间线性关系模型:Y = β0 + β1*X + ε。使用scikit-learn库进行实战:首先安装必要库,然后加载数据、训练模型并评估性能。示例展示了如何使用`LinearRegression`模型进行房价预测,包括数据可视化。掌握线性回归,让数据“说话”更有力。
33 2
下一篇
无影云桌面