搜索和搜索范围?

时间:2011-03-24 18:59:22

标签: c algorithm search range bsearch

bsearch非常适合直接搜索,但如果我需要搜索范围,我应该使用什么?

更新

例如,如果我想在a和b之间找到一系列值(a> = x< b)。

更新

范围值可能不相等。 所以如果我有数组(10,20,30)并且我想找到“15”我想获得最接近的最小范围的地址(指针),在这个例子中这是范围(10,20)

2 个答案:

答案 0 :(得分:1)

其中一个参数bsearch采用的是要搜索的元素数。因此,不要使用例如100,而是在42 ...

中进行搜索
bsearch("foo", data, /*100*/42, sizeof *data, cmpfx);

更新后

我要做的是手册(意思是我写代码)二元搜索。

这个想法是将(剩余的)数组的中间元素与下限和上限进行比较。如果它小,那么下限再次搜索小半部分;如果它在大半部分再次大于上限搜索;否则你在范围内找到了一个元素。


第二次更新后

你想要返回一对指针吗?

你必须将它们包装在一个结构中,或者将指针的地址传递给函数......或者其他东西。

但是现在你有一个更简单的搜索:搜索直到找到值(并返回0长度范围)或直到你即将失败。范围介于您上次查看的数组值之间,具体取决于您到达失败情况的确切方式,如果您位于数组的末尾,则为其中一个边或EMPTY的值。

答案 1 :(得分:1)

bsearch()函数旨在查找与某些条件匹配的单个元素。根据手册页:

RETURN VALUE
       The bsearch() function returns a pointer to a matching  member  of  the
       array,  or  NULL  if no match is found.  If there are multiple elements
       that match the key, the element returned is unspecified.

这里的关键是如果有多个元素与键匹配,则返回的元素是未指定的。因此,您不知道您获得的元素是否是该范围中间的第一个,最后一个或某个位置。

如果您可以更改您的要求,以便在A和B之间查找数组中的元素,并且可以保证数组中只有一个A和一个B,那么您可以先搜索A然后搜索B.

start = bsearch(A, array, N, sizeof(*array), compare);
end = bsearch(B, array, N, sizeof(*array), compare);

您可能必须编写自己的功能才能完全按照自己的意愿行事。