您好,
我有两个关于复杂性的问题:
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。对不起整件事是块格式的。如果不这样做,我就不会提交。
答案 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++;
}
现在回到你的问题:
如果您解析数组A
的每个元素并在B中搜索相关元素
O(m.log(n))
O(n.log(m))
m>n
您的常用元素计算代码令人困惑
if (i<n)
??? A={1,2,3,4,5}
和B={3,5}
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; }
}