【问题标题】:Complexity of Multiple Binary Search and comparison algorithms多重二分搜索和比较算法的复杂性
【发布时间】:2015-01-28 02:55:40
【问题描述】:

你好,

我有两个关于复杂性的问题:

1) 所谓的二分搜索的最佳/最差复杂度是多少 多次。换句话说,用于比较两个 数组。我相信其中之一是 O(mlog(n)) (之间不匹配 数组)。但是,由于我无法弄清楚另一个,我无法确定是否 这是最好的或最坏的。

2) 对于以下代码段:两个大小为 m 的数组 A 和 B 大小 n,其中 m>=n,并且 A 和 B 已通过冒泡排序 每个。此外,没有重复 A 中的元素。 B 中没有元素 被重复。但是,A 和 B 可能有共同的元素。这 以下伪代码计算公共元素的数量:

count = 0
for i from 0 to m:
 if i < n:
  for j from 0 to n:
     if A[i]==B[j]:
       count + =1
       break
 else:
    break

我似乎想出了以下排序和比较的复杂性:

冒泡排序有最差的 O(n^2) 和最好的 O(n)

搜索有两个界限(我认为):情况 1:没有匹配 O(mn), 情况 2:数组 A(size m) 的前 n 个元素匹配所有 数组 B(大小 n)的元素。 -> O(n^2)

复杂度可能性(排序和搜索):O(n^2+mn),O(n+mn),O(n^2+n)=O(n^2) 最好的 似乎已排序,没有匹配 O(mn+n) 最糟糕的似乎不是 排序后没有匹配项 O(n^2+mn) 这看起来有效吗?

谢谢。

附:对不起,整个事情都是块格式的。它不会让我不这样做就提交。

【问题讨论】:

    标签: algorithm sorting search big-o


    【解决方案1】:

    如果数组已排序,为什么您使用二分查找或m:n 组合比较,当您可以在O(n) &lt;= O(n+m-c) &lt;= O(n+m) 中完成这两种操作时?

    问题 2 的示例:

    int c=0; // common elements
    for (int i=0,j=0;(i<m)&&(j<n);)
     {
          if (a[i]==b[i]) { c++; i++; j++; }
     else if (a[i]< b[i]) i++;
     else                   j++;
     } 
    
    • 如果需要,只需在数组末尾添加一些 if(不确定它是否不会忽略最后一个常见元素并且懒得分析它),但无论如何您都会看到如何更快地解决此类问题
    • 同样可以进行比较,但您没有提供任何有关其目的的详细信息...

    现在回到你的问题:

    1. 如果您解析数组A 的每个元素并在B 中搜索相关元素

      • 那么是的,最糟糕的复杂性是O(m.log(n))
      • 但最好的也是因为您遍历整个 b 数组而不使用最后找到的索引
      • 顺便说一句,如果您要解析 B 并搜索 A,那么 O(n.log(m)) 更好,如果 m&gt;n
    2. 您的通用元素计算代码令人困惑

      • 为什么会有if (i&lt;n)???
      • 如果你有A={1,2,3,4,5}B={3,5} 怎么办?
      • 那么这个 if 将拒绝两个共同的元素
      • 我认为应该删除它
      • 因此,在所有情况下,删除后的复杂性为 O(m.n)

    [edit1] 处理边缘情况的代码更新

    int c=0; // common elements
    if (n+m) for (int i=0,j=0;;) // loop only if both arrays are not empty
     {
          if (a[i]==b[i]) { c++; if (i<m-1) i++; else if (j==n-1) break; j++;  }
     else if (a[i]< b[i]) {      if (i<m-1) i++; else if (j==n-1) break; }
     else                 {      if (j<n-1) j++; else if (i==m-1) break; }      
     } 
    

    【讨论】:

    • 谢谢。哦,我的错,我确实意识到如果 i
    • @dylan7 1. ifs 不会下降太多(单次迭代常数时间)性能,因为它们替换了条件语句 2。因为您的代码中有 2 个嵌套的 fors只在重复元素上停止,所以最坏的情况是 O(m.n) ... 3. 那是O(n+m-c) !!!在不知道如何比较的情况下很难确定比较......以及结果如何
    • 如果只有内部循环在找到匹配项时中断怎么办?这不是正在发生的事情吗?
    • @dylan7 for (i ...) 让你 O(m), .... + 嵌套 for(j...) 即使有中断也会给你 O(n.m) 并不重要,如果它有时会中断....主要是它在你的代码中运行完整的 m 个周期...尝试跟踪它然后你会明白我的意思(乍一看并不明显)或者在里面添加一些计数器来看看这确实做了多少个周期
    猜你喜欢
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2018-09-23
    • 2021-08-24
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多