【发布时间】:2022-01-01 13:46:28
【问题描述】:
我正在尝试将一个数字与包含某些未知值的数组进行比较,并且我想获得小于比较数字的整数个数。
例如:
数组将是:-2 5 2 5 7 9 10
比较号码是:8
回答:5
#include <stdio.h>
#include <stdlib.h>
long long data[200000] = { 0 };
int cmpfunc(const void *a, const void *b) {
return (*(long long*)b - *(long long*)a);
}
int main() {
int numbers, i, j, z, counter, testcases;
long long check;
scanf("%d", &numbers);
for (i = 0; i < numbers; i++)
scanf("%lld", &data[i]);
qsort(data, numbers, sizeof(long long), cmpfunc);
scanf("%d", &testcases);
for (j = 0; j < testcases; j++) {
scanf("%lld", &check);
counter = numbers;
for (z = 0; z < numbers; z++) {
if (check >= data[z])
break;
counter--;
}
printf("%d\n", counter);
}
}
我的程序运行速度仍然比要求的慢,有什么办法可以加快速度吗?
【问题讨论】:
-
你可以看看 binary search。
-
如果你有一个排序数组,那么,你可以使用具有 O(logn) 时间复杂度的二分查找。但是,您可以在不对数组进行排序的情况下进行线性搜索。因为,排序数组具有 O(nlogn) 时间复杂度。这就是您的算法具有 O(nlogn) 时间复杂度的原因。但是,您可以通过线性搜索以 O(n) 的时间复杂度完成您的任务。
-
为什么要使用
long long? -
示例数据集很小。 “真实”数据集能有多大?请注意,标准的二进制搜索无济于事;在样本数据中,它会寻找 8 却找不到它。你需要一个修改过的二分查找,找到小于目标值的最大值的位置。
标签: c