“编写一个算法,给定两个大小为N的有序向量,以有序的方式打印出两个向量上出现的所有元素。在最坏的情况下,程序的执行时间必须与N成正比。” / p>
在本练习中,我将循环检查每个数组a []然后使用二进制搜索算法检查de array b []并比较它是否等于[]上的数组
但我不知道在最坏的情况下是否与N成正比。
int main() {
int a[6] = {2, 8, 15, 31, 46, 75};
int b[6] = {1, 8, 17, 21, 31, 75};
int i, tam = 6, key, res, c[6], k=0;
for (i = 0; i < tam; i++) {
key = a[i];
res = binary_search(b, tam, key);
if (res != -1) {
c[k]=a[i];
k++;
}
}
return 0;
}
int binary_search(int a[], int n, int key) {
int low = 0, high = n - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (key < a[mid])high = mid - 1;
else if (key > a[mid]) low = mid + 1;
else return mid;
}
return -1;
}
答案 0 :(得分:0)
但我不知道在最坏的情况下是否与N成正比。
不是。通过有序列表的二进制搜索是O(log n)。如果必须对其中一个数组中的所有元素执行此操作,则需要查看O(n log n)。
当您尝试在O(n)时间内解决问题且当前解决方案为O(n log n)时,解决方案中采用O(log n)的部分可能就是问题。
答案 1 :(得分:0)
我做了一个新代码:
int main() {
int a[6] = {2, 8, 15, 31, 46, 75};
int b[6] = {1, 8, 17, 21, 31, 75};
int i=0, j=0, N = 6, c[6], k = 0;
while (i < N && j < N) {
if (a[i] < b[j]) {
i++;
} else if (a[i] > b[j]) {
j++;
} else {
c[k] = a[i];
k++;
i++;
j++;
}
}
return 0;
}
我认为这个服从O(n)的最坏情况。 但我仍然要感谢你们的帮助!!
答案 2 :(得分:0)
#include <stdio.h>
#define N 6
int main(void) {
int a[N] = {2, 8, 15, 31, 46, 75};
int b[N] = {1, 8, 17, 21, 31, 75};
int i = 0, int j = 0, int n = 0;
while (j + i < (N + N))
{
n = (b[j] - a[i]) & 0x80000000 // non null if b < a, else n = 0
printf("%d\n", n ? b[j++] : a[i++]); // access i if n=0 else if n=1 access j
while (j == N && i != N)
printf("%d\n", a[i++]);
while (i == N && j != N)
printf("%d\n", b[j++]);
}
return 0;
}