【问题标题】:Worst-case time complexity of an algorithm with 2+ steps具有 2 个以上步骤的算法的最坏情况时间复杂度
【发布时间】:2022-12-03 02:05:16
【问题描述】:

我的目标是编写一个算法来检查未排序的正整数数组是否包含值 x 和 x^2,如果包含则返回它们的索引。 我已经解决了这个问题,建议首先使用归并排序对数组进行排序,然后对 x 执行二进制搜索,然后对 x^2 执行二进制搜索。 然后我写道:“由于二分搜索的最坏情况运行时间为 O(log n),归并排序的最坏情况运行时间为 O(n log n),我们得出结论,该算法的最坏情况运行时间为 O(n记录 n)。”我的理解是否正确,在分析涉及具有不同运行时间的步骤的算法的整体效率时,我们只采用运行时间最长的那个?或者它比这更复杂? 提前致谢!

【问题讨论】:

  • 你在声明中遗漏了一个 n,结果是 O(nlogn),是的,理论上你只需要最差的运行时间。实际上,这两个集市可能会以导致不同运行时的方式相互影响。但我认为首先不需要 nlogn 。您不需要搜索也不需要排序,尝试迭代列表一次并始终将 x 和 x^2 添加到以索引为值的 Map 中。在添加之前检查 x 或 x^2 是否已经存在。如果其中任何一个存在,您就找到了匹配项并完成了。上)。如果您的列表可以包含重复项,您需要在地图中跟踪更多信息
  • 如果单单排序就已经需要 O( n * logn),那么总体复杂度怎么可能是 O( logn)?
  • 我的@derpirscher 打字错误,已在编辑中修复

标签: algorithm sorting time-complexity big-o amortized-analysis


【解决方案1】:

由于O(log n) < O(n log n)

O(n log n) + O(log n) + O(log n) = O(n log n)

所以打洞算法的时间复杂度是 O(n log n)

【讨论】:

    【解决方案2】:

    你的问题有点模棱两可。你明白了吗

    1. 一个未排序的列表[a,b,c ...] 和一个特定的x 作为参数搜索?

      或者

      1. 只是获取列表,并且必须查找列表中是否至少包含一对(x,y)x^2 = y

      如果是第一个,答案是上),因为您只需遍历列表(无需排序)并检查每个元素是否等于 xx^2。如果两者都找到,则该列表满足条件。

      function match(list, x) {
        let foundX = false, foundX2 = false;
        for (let i of list) {
          if (i == x) foundX = true;
          else if (i == x*x) foundX2 = true;
        }
        return foundX && foundX2;
      }    
      

      如果是第二个,答案是O(n logn)因为你先对数组进行排序,然后遍历列表并检查是否可以找到当前元素的平方。排序是O(n logn),二分查找是O(登录), 但当你应用它时n次,你的整体搜索也是O(n logn).因此整体复杂度为O(n logn) + O(n logn)或者简单地O(n logn).

      function match(list) {
        list.sort();
        for (let i of list) {
          if (binsearch(list, i*i)) return true;
        }    
        return false;
      }
      

    【讨论】:

    • 抱歉,给定一个特定的输入 x,查找数组是否包含 x 和 x^2
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多