求O(log(logX))时间复杂度算法:满足容积要求的最小橱柜花费
优化到O(log(logX))复杂度的解法
原代码的潜在问题
- 初始
left=0不符合题目中“正整数n”的要求,会出现无效的n=0的计算。 - 直接用
math.log(int(X),2)作为右边界,当X不是2的幂时,右边界是浮点数,二分过程中middle的计算可能存在精度误差。 - 直接计算
2**middle会在n较大时生成极大数,占用不必要的内存和计算时间。
优化思路
橱柜容积公式为:V(n) = 25n(n+1)×2ⁿ
该函数严格单调递增且增长速度为超指数级(核心项是2ⁿ),这意味着满足V(n)≥X的n取值范围极小。我们可以利用这个特性优化:
- 倍增法快速找边界:从n=1开始,不断将n翻倍,直到V(n)≥X。由于V(n)超指数增长,这个过程仅需O(log(logX))次操作(最终n达到log₂(X)量级,翻倍次数为log₂(log₂(X)))。
- 小范围二分查找:在倍增得到的区间(前一次的n到当前n)内进行二分,找到最小的n满足V(n)≥X,操作次数同样为O(log(logX))。
优化后的代码
import math def min_cost(X): X = int(X) if X <= 0: return 0 # 题目中X应为正整数,此处处理边界情况 # 倍增法确定上下界 low = 1 high = 1 log_X = math.log(X) while True: # 用对数比较替代直接计算容积,避免大数运算 log_vol = math.log(25) + math.log(high) + math.log(high + 1) + high * math.log(2) if log_vol >= log_X: break low = high high *= 2 # 在缩小后的区间内二分查找最小n result = high while low <= high: mid = (low + high) // 2 log_vol = math.log(25) + math.log(mid) + math.log(mid + 1) + mid * math.log(2) if log_vol >= log_X: result = mid high = mid - 1 else: low = mid + 1 return result X = input("Enter a value:\n") print(f'the min pay out is: {min_cost(X)}')
代码说明
- 对数比较优化:将容积的乘法、幂运算转换为对数的加法运算,避免生成超大数,同时提升计算效率。
- 倍增法缩范围:相比直接设定右边界,倍增法能快速定位到极小的有效区间,确保后续二分的操作次数被控制在O(log(logX))。
- 修正正整数限制:从n=1开始查找,符合题目中“正整数n”的要求。
内容的提问来源于stack exchange,提问作者mewowo
相关产品推荐
相关产品推荐

