【发布时间】:2016-02-11 09:55:38
【问题描述】:
需要找到一个数字的索引,它可能存在也可能不存在于数组中。我尝试了以下代码:
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *lhs, const void *rhs){
return ( *(long long*)lhs - *(long long*)rhs );
}
int main(){
int size = 9;
long long a[] = {16426799,16850699,17802287,18007499,18690047,18870191,18870191,19142027,19783871};
long long x = 17802287;
long long *p = (long long *)bsearch(&x, a, size, sizeof(long long), cmp);
if (p != NULL)
printf("%lld\n", p - a);
return 0;
}
如果数字(在本例中为 17802287)存在于数组 a 中,则上述代码有效,但如果数字不存在于 a 中,则失败,例如没有为x=18802288 提供任何输出,我想获得索引i=5 在这种情况下第5 个元素开始的元素大于18802288。
另外,实际的数组大小将有超过 400 万个元素,相同的代码可以工作吗?
感谢您的帮助。
【问题讨论】:
-
在标准 C 中没有这样的功能,但是用你想要的额外功能制作一个二分查找函数应该不会很难。创建自己的函数,您还可以添加一个参数,如果找到完全匹配则设置为非零,否则设置为零,以便调用者轻松决定如何处理结果。
-
嗯,我试图将一些 python 代码移植到 C 中,卡在这里。我的 C 知识还不足以实现高效的搜索功能。
-
Binary search 是 (IMO) 最简单的搜索算法之一。尝试一下,尝试制作自己的二分搜索功能,只是一个返回完全匹配的简单功能(如
bsearch),然后您可以对其进行调整以满足您的要求。但是请注意极端情况,如果您搜索的值大于数组中的最后一个元素,您的要求可能会给您带来麻烦。 -
在 python 中找到了
bisect_left的源代码,因此将其移植到 C 中。效果很好。对我来说没有问题,因为数字会在数组的中间深处。
标签: c arrays binary-search-tree