多重二进制搜索和比较算法的复杂性

时间:2015-01-28 02:55:40

标签: algorithm sorting search big-o

  

您好,

     

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

     

1)被称为二进制搜索的最佳/最差复杂度是什么?   多次。换句话说,二进制搜索用于比较两个   阵列。我相信其中一个是O(mlog(n))(之间没有匹配   阵列)。但是,由于我无法弄清楚另一个,我无法判断   这是最好还是最差。

     

2)对于以下代码段:两个大小为m且B为B的数组A.   大小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的前n个元素(大小为m)与全部匹配   数组B的元素(大小为n)。 - &GT;为O(n ^ 2)

     

复杂性可能性(排序和搜索):O(n ^ 2 + mn),O(n + mn),O(n ^ 2 + n)= O(n ^ 2)最好   似乎是排序的,没有匹配O(mn + n)最坏的似乎不是   已排序且无匹配O(n ^ 2 + mn)这似乎有效吗?

谢谢。

P.S。对不起整件事是块格式的。如果不这样做,我就不会提交。

1 个答案:

答案 0 :(得分:1)

如果对数组进行排序,那么当您在m:n中完成这两项操作时,为什么要使用二进制搜索或O(n) <= O(n+m-c) <= 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++;
 } 
  • 如果需要,只需在数组末尾添加一些ifs(不确定它是否会忽略最后一个常见元素而又懒得分析它)但无论如何你都会看到如何更快地解决这类问题
  • 同样可以进行比较但你没有提供任何有关其目的的细节......

现在回到你的问题:

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

    • 然后是最差的复杂性是O(m.log(n))
    • 但最好也是因为你在不使用最后找到的索引
    • 的情况下浏览了整个b数组
    • btw如果您要解析B并搜索A,那么O(n.log(m))
    • 会更好m>n
  2. 您的常用元素计算代码令人困惑

    • 为什么会有if (i<n) ???
    • 如果您有A={1,2,3,4,5}B={3,5}
    • ,该怎么办?
    • 然后这个if将拒绝两个共同元素
    • 我认为应该将其删除
    • 因此,删除后所有情况的复杂性为O(m.n)
  3. [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; }      
     }