【问题标题】:bsearch and searching range?bsearch 和搜索范围?
【发布时间】:2011-07-22 09:37:30
【问题描述】:

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

更新

例如,如果我想查找 a 和 b ( a >= x

更新

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

【问题讨论】:

  • 不,我不觉得它自己说话。能否请您详细说明您的问题。
  • 对不起。例如,如果我想查找 a 和 b 之间的值范围( a >= x

标签: c algorithm search range bsearch


【解决方案1】:

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

bsearch("foo", data, /*100*/42, sizeof *data, cmpfx);

更新后

我要做的是手动(意味着我会编写代码)二进制搜索。

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


第二次更新后

你想返回一对指针吗?

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

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

【讨论】:

    【解决方案2】:

    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);
    

    您可能必须编写自己的函数来完成您想要的操作。

    【讨论】:

      猜你喜欢
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多