【问题标题】:Binary Search with Strings使用字符串进行二分搜索
【发布时间】:2015-06-15 11:06:49
【问题描述】:

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

**编辑:我从文本文件中读取 SharesArray[mid].Date 值(和日期值),示例为:05/02/2015、14/10/2014。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;
    }

我还尝试了最后一个 else if 语句,就像 else 一样,这没有任何区别。

另外,string1 和 string2 在 String.Compare 部分中的方式有​​关系吗?

【问题讨论】:

  • String.Compare 中的字符串顺序无关紧要。
  • 您能否告诉我们DateSharesArray中是如何定义的,并举例说明searchString可能是什么值以及SharesArray[mid].Date可能是什么值?
  • 我也是这么想的,但是当我使用断点并观察控制流时,当我交换它们时,它会转到数组中的不同元素。
  • 我为你编辑了约翰
  • @Steve Compare 调用中的顺序绝对是不是不相关的,mid 的计算是正确的,尽管它可能容易溢出,所以@ 987654328@会更好

标签: c# binary-search


【解决方案1】:

在问题的 cmets 中总结问答的答案,并提供一些额外的上下文。

对于二分搜索,有一些你需要注意的因素

  1. 必须对二分查找函数的输入数组进行排序。
  2. 鉴于您已实现的算法,它们必须按升序排序。
  3. 你必须有一个三路比较函数,对于compare(lhs, rhs)返回:&lt; 0如果lhs &lt; rhs&gt; 0如果lhs &gt; rhs0如果lhs == rhs
  4. compare 函数中参数的顺序很重要,如果您切换它们,您将采用错误的分支并更改搜索上限而不是下限,或者相反。
  5. 对于您的实施,您的顺序正确,lhs : SharesArray[mid].Daterhs = searchString
  6. 因为要比较日期,所以需要使用DateTime.Compare 函数,并使用DateTime.ParseExact(myString, "dd/MM/yyyy", CultureInfo.InvariantCulture); 将日期字符串转换为DateTime 实例。通过字符串比较,您会得到错误的结果,例如 "05/02/2015" &lt; "14/10/2014"

然后还有一则轶事要说(请参阅here):

pivot 值mid 的计算容易出现整数溢出。如果计算为

mid = (low + high) / 2;

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

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

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

【讨论】:

  • @EmmaD 由于来自 cmets 的 Alex 的回答可能对您有用,为了后代的利益,值得接受此摘要作为答案。
【解决方案2】:

你考虑过 LINQ 吗?

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

【讨论】:

  • 我试图不在内置方法中使用 BinarySearch
  • @EmmaD 任何你想要达到的目标都应该在问题中提及。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
相关资源
最近更新 更多