c++ - 二进制搜索避免不可读的条目(列表中的漏洞)

标签 c++ algorithm binary-search

我已经实现了二进制搜索功能,但我遇到了一个列表条目可能变得不可读的问题。它是用 C++ 实现的,但我只是使用一些伪代码来简化它。请不要关注不可读或字符串实现,它只是伪代码。重要的是列表中有不可读的条目,必须四处浏览。

int i = 0;
int imin = 0;
int imax = 99;
string search = "test";

while(imin <= imax)
{
    i = imin + (imax - imin) / 2;
    string text = vector.at(i);
    if(text.isUnreadable())
    {
        continue;
    }
    if(compare(text, search) = 0)
    {
         break;
    }
    else if(compare(text, search) < 0)
    {
         imin = i + 1;
    }
    else if(compare(text, search) > 0)
    {
         imax = i - 1;
    }
}

搜索本身运行良好,但我遇到的问题是如果文本不可读,如何避免无限循环。有人对此有耗时考验的方法吗?循环不应该只是在不可读时退出,而是应该绕过这个洞。

最佳答案

我在一个项目中有类似的任务 - 查找某些项目不可比较的序列。

我不确定这是最好的实现方式,在我的例子中它看起来像这样:

 int low = first_comparable(0,env);
 int high = last_comparable(env.total() - 1,env);
 while (low < high)
 {
     int mid = low + ((high - low) / 2);

     int tmid = last_comparable(mid,env);
     if( tmid < low ) 
     {
       tmid = first_comparable(mid,env);
       if( tmid == high )
         return high;
       if( tmid > high )
         return -1;
     }
     mid = tmid;
 ...
}

如果 vector.at(mid) 项是不可比较的,它会在其邻域中查找最接近的可比较对象。

first/last_comparable() 函数返回给定索引中第一个可比较元素的索引。方向不同。

  inline int first_comparable( int n, E& env)
  {
    int n_elements = env.total();
    for( ; n < n_elements; ++n )
      if( env.is_comparable(n) )
        return n;
    return n;
  }

关于c++ - 二进制搜索避免不可读的条目(列表中的漏洞),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33350833/

相关文章:

algorithm - 这个 "Werewolf Prob"有更好的算法吗?

algorithm - 火车轨道装配算法

java - 如何添加二叉树的特定部分但保持树完好无损(Java)?

algorithm - 使用分而治之是否会提高在数组中查找最大值和最小值的时间复杂度

C++ Windows - 填写系统密码字段 ("run as")

c++ - 如何在循环运行时停止以将数据存储在 vector 中

algorithm - 实现更快的算法

java - 用递归找到零点

c++ - 做一个循环 "slow down"

c++ - 循环列表 - 删除所有给定值