繁体   English   中英

二进制搜索-数组

[英]Binary search - arrays

我对算法世界还很陌生,不了解所有内容,所以我不得不问些什么,最近我遇到了一个有趣的问题。 作为我的任务,我正在研究一个程序,该程序必须计算数组中数字的所有出现次数,即array [6] = {1、2、2、2、3、3}; 用户询问“ 2”,答案是3。我正在通过两个并行的二进制搜索来执行此操作,一个正在寻找该数字出现的最低索引,另一个正在寻找最高的索引。 最后,我只减去这两个值。 问题来了:是否有任何更快/更有效的方法仅使用数组呢? 先感谢您。

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

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

如果您可以控制数据的内存布局,则可能需要查看Judy数组。

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

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

底线:顺序访问时,甚至“随机访问存储器”(RAM)都比随机访问要快。 搜索算法应充分利用这一事实。

如果数组已经排序,则您的方法正常(即O(log n))。 我不确定您可以渐近地更快。

我认为您无法并行执行二进制搜索(但是自从我做了这种事情已经很长时间了)。 无论如何,O(log n)不太简陋。

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

如果数组已经从最低值到最高值排序,则您的方法似乎效率不高。 如果未订购,则必须从头到尾搜索所有数组,然后代价将是线性O(n)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM