算法复杂度渐近线图
Posted
技术标签:
【中文标题】算法复杂度渐近线图【英文标题】:Algorithm complexity asymptote graph 【发布时间】:2016-04-22 00:49:09 【问题描述】:我正在准备一个 C++ 项目,我必须计算许多算法复杂度 big-O 并将其与图表上的理论值进行比较。我做了一个时间函数来计算算法的执行时间,但我没有找到一种方法来计算复杂度并使用时间 T 和输入 N 绘制曲线。
有什么想法吗?
【问题讨论】:
您的程序正在测量特定值 n=n0 的时间。其中,作为运行时间,T=O(n) 是 n 的图(=min_value 到 max_value)。如果您为所有这些 n(=min_value 到 max_value)运行程序并计算每个输入的时间,然后绘制(y 轴 = 时间 Vs x 轴 = n),这应该类似于理论复杂度的图表(在这种情况下,T=O(n) 的形式为 y=mx,其中 m 是一个常数,仅影响直线的斜率,您可以考虑 m=1 进行计算。 请问如何用C++代码制作? 【参考方案1】:简而言之:如果您定义了理论复杂度 T(n),您所要做的就是在给定的 n 范围内执行 x 次测试:n1, ..., nx 并测量每个测试的时间。然后从 n1、...、nx 和计算系数 c 的集合中选择中值 nm,定义为:c = t(nm)/T(nm)。 t(nm) 是 n (nm) 的中位数的测量时间,T(nm) 是计算 nm 的理论复杂度。 接下来,对于每个 n,计算系数 q,它是算法的理论和实验复杂度的一致性系数:
最后,您可以绘制 q(n) 的图,它是渐近线图,它应该渐近收敛到 1。如果您的图渐近低于 1,则理论复杂度被高估,如果高于 1,复杂度被低估。
【讨论】:
以上是关于算法复杂度渐近线图的主要内容,如果未能解决你的问题,请参考以下文章
算法 -- 数据结构和算法的关系算法定义和特性算法设计的要求算法效率的度量方法函数的渐近增长算法时间复杂度 算法空间复杂度