【问题标题】:calculate time complexity of square root algorithm计算平方根算法的时间复杂度
【发布时间】:2016-02-27 04:07:24
【问题描述】:

我正在浏览下面的链接enter link description here 并浏览我想计算以下建议代码的时间复杂度的答案。我玩了很多值,步数徘徊在 23 之间(即使对于小值),对于真正的大值来说是 50。我应该如何计算以下代码的时间复杂度 - 任何指针?

float val, low, high, mid, oldmid, midsqr;
// Set initial bounds and print heading.
low = 0; high = mid = val; oldmid = -1;

// Keep going until accurate enough.
while (fabs(oldmid - mid) >= 0.00001) 
{
    oldmid = mid;
    // Get midpoint and see if we need lower or higher.
    mid = (high + low) / 2;
    midsqr = mid * mid;
    if (mid * mid > val) 
    {
        high = mid;
        printf("- too high\n");
    }
    else 
    {
        low = mid;
        printf("- too low\n");
    }
}

【问题讨论】:

  • 看算法。它重复这个过程:给定一个范围,考虑该范围的中点,并根据结果将所考虑的范围缩小到原始范围的上半部分或下半部分。任何研究复杂性分析的人都应该非常熟悉。
  • 在(0, high)上进行二分查找,复杂度为log_2(high * 100000) = O(log_2(high) - log_2(precision))。

标签: c algorithm time-complexity


【解决方案1】:

您应该将您呈现的算法识别为二进制搜索。既然您首先进行了复杂度分析,我想您应该知道二分查找的复杂度是O(log N)

主要的潜在并发症是N 应用于此问题的问题。您可能会认为这是您要确定的平方根的值(即平方),但这只是大致正确的。相反,它是搜索空间中不同点的数量。这取决于搜索空间的边界和您在其中的数字是否不同的标准(在这种情况下,它们的差异超过 0.00001)。

因为可表示的浮点数不是均匀分布的,它不像(upper_bound - lower_bound) / 0.00001那么简单,但你可以把它当作一个粗略的近似。此外,如果您使用0 作为下限,并使用平方的固定倍数(可能是 1)作为上限,那么该近似值会为您提供O(log square) 作为整体复杂度。

现在考虑由于算法以对数方式扩展,因此将搜索空间的大小加倍会在搜索中的最大步数中产生一个固定增量。由于它是一种专门的二分搜索,因此一次运行与另一次运行之间 27 步的差异应该对应于搜索空间大小的大约 227(大约 127,000,000)倍。

【讨论】:

  • 谢谢,精确的部分是我没有得到的
【解决方案2】:

在确定时间复杂度方面,想想你的算法需要多少“步骤”才能终止。

在这种情况下,我们本质上是通过二进制搜索来找到平方根。因此,我们需要考虑的步骤数是您的算法进行了多少次比较。因为它是二分搜索,所以我们知道它在O(log(n)) 的范围内,因为您可以将二分搜索视为每次将可搜索空间减半。

所以现在我们需要弄清楚n 是什么。我们正在搜索范围(low, high),它来自(0, val)。但是因为我们搜索的是浮点数,而您关心的精度高达0.00001,所以我们可以有效地将范围乘以100000,以便我们考虑整数问题。

那么我们将有O(log(100000 * val)) 的时间复杂度,它在O(log(val)) 中(除非精度不是恒定的)。

【讨论】:

  • 得到它的精彩解释 - 精确常数让我很困惑 - 现在我明白了..谢谢
猜你喜欢
  • 1970-01-01
  • 2011-06-21
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
  • 2018-10-15
  • 1970-01-01
  • 2021-03-03
相关资源
最近更新 更多