【问题标题】:Binary search - arrays二分查找 - 数组
【发布时间】:2023-03-12 18:25:02
【问题描述】:

我对算法世界很陌生,并不了解一切,所以我不得不问一些问题,最近我遇到了一个有趣的问题。作为我的任务,我正在开发一个程序,该程序必须计算数组中所有出现的数字,即 array[6] = {1, 2 , 2, 2, 3 ,3 };用户询问“2”,答案是 3。我通过两个并行二进制搜索来做到这一点,一个是寻找出现数字的最低索引,另一个是最高的。最后,我只是减去这两个值。问题来了:有没有更快/更有效的方法来只使用数组?提前谢谢你。

【问题讨论】:

  • 你的数组有排序值吗??
  • 是的,我的数组已排序。
  • 您的解决方案只有在对数组进行排序时才有效。即使这样,您也需要在highindex-lowIndex 的差值上加一,以获得正确的解决方案。如果数组未排序,则需要遍历整个数组并简单地计算数字 n 的出现次数。

标签: arrays search binary-search


【解决方案1】:

您可以按值分组并获取计数。

您可以将值字典保留为键和计数器,每次在数组中看到该值时,该值都会增加。

【讨论】:

  • 嗯,我不太明白你的想法。是不是类似于创建一个带有数字和计数的结构数组?
  • 是的,使用 hashmap(我认为这就是它在 c# 以外的其他语言中的名称)或字典,这将是 O(n)
【解决方案2】:

如果您对数据的内存布局有一定的控制权,您可能需要查看 Judy 数组。

或者说一个更简单的想法:二分搜索总是将搜索空间减半。可以通过插值找到最佳切点(切点不应该是预期关键所在的位置,而是最小化下一步搜索空间的统计期望的点)。这最大限度地减少了步骤的数量,但......并非所有步骤都具有相同的成本。如果可以保持局部性,分层存储器允许在单个测试的同时执行多个测试。由于二分搜索的前 M 步最多只涉及 2**M 个唯一元素,因此将这些存储在一起可以更好地减少每个缓存行获取(而不是每次比较)的搜索空间,这在现实世界中具有更高的性能。

n 叉树在此基础上工作,然后 Judy 数组添加了一些不太重要的优化。

底线:即使是“随机存取存储器”(RAM)在顺序访问时也比随机访问要快。搜索算法应该充分利用这一事实。

【讨论】:

  • 插值听起来不错,但我的数据是随机的。
  • 你也可以使用hashmap
【解决方案3】:

如果数组已经排序,那么你的方法是好的(即 O(log n))。我不确定您是否可以渐近地更快。

我不认为你可以并行化二分搜索(但我已经很久没有做过这种事情了)。无论如何,O(log n) 还不算太寒酸。

如果您的数组尚未排序,那么排序的开销 (O(nlog N)) 显然比通过数组进行简单的线性扫描要大。

【讨论】:

    【解决方案4】:

    如果数组已经从最低值到最高值排序,你的方法似乎并没有低效。如果没有排序,则必须从头到尾搜索所有数组,然后成本将是线性 O(n)

    【讨论】:

      猜你喜欢
      • 2010-09-19
      • 1970-01-01
      • 2011-12-25
      • 2011-06-08
      • 1970-01-01
      相关资源
      最近更新 更多