二进制搜索字符串

时间:2015-04-09 21:30:05

标签: c# binary-search

我有一个对象数组,我想通过二进制搜索来搜索日期/日期属性(用户决定)。

**编辑:我从文本文件中读取SharesArray [mid] .Date值(和日期值),示例为:05/02/2015,2014年8月14日.searchString值将从用户,但格式与日期值相同。 **

这是我的第一次尝试,所以我只是尝试日期属性:

int high, low, mid;
high = SharesArray.Length - 1;
low = 0;

while (low <= high)
{
    mid = (low + high) / 2;
    if (String.Compare(SharesArray[mid].Date, searchString, true) == 0)
    {
        break;
    }
    else if (String.Compare(SharesArray[mid].Date, searchString, true) > 0)
    {
        high = mid - 1;
    }
    else if (String.Compare(SharesArray[mid].Date, searchString, true) < 0)
    {
        low = mid + 1;
    }

我还尝试了最后的if if语句,但没有任何区别。

此外,String.Compare部分中string1和string2的循环方式是否重要?

2 个答案:

答案 0 :(得分:1)

在问题的评论中总结问答的答案,并附上一些额外的背景。

对于二元搜索,您需要处理一些成分

  1. 必须对二进制搜索功能的输入数组进行排序。
  2. 根据您实施的算法,它们必须按升序排序。
  3. 您必须拥有三向比较功能,compare(lhs, rhs)返回:< 0 lhs < rhs> 0 lhs > rhs0 } if lhs == rhs
  4. compare函数中参数的顺序很重要,如果你切换它们,你将采用错误的分支并改变上部搜索范围而不是更低,或者相反。
  5. 对于您的实施,您的订单是正确的,lhsSharesArray[mid].Daterhs = searchString
  6. 由于您要比较日期,因此需要使用DateTime.Compare函数,并使用DateTime将日期字符串转换为DateTime.ParseExact(myString, "dd/MM/yyyy", CultureInfo.InvariantCulture);个实例。使用字符串比较,您会得到错误的结果,例如"05/02/2015" < "14/10/2014"
  7. 然后还有一个轶事评论(见here):

    透视值mid的计算容易出现整数溢出。如果你把它计算为

    mid = (low + high) / 2;
    

    然后low + high可能变得大于整数。

    因此,计算mid的首选方式是

    `mid = low + ((high - low) >> 1);`.
    

答案 1 :(得分:0)

你考虑过LINQ吗?

var searchIndex = SharesArray
    .Select(s => s.Date)
    .ToList()
    .BinarySearch(searchString);