【问题标题】:Java- What is the best way to search for the last occurrence of an element in an array? [closed]Java-搜索数组中最后一次出现的元素的最佳方法是什么? [关闭]
【发布时间】:2013-10-13 09:10:26
【问题描述】:

我正在写这个方法: findLastOccurrence(对象项) {}

在已排序的对象数组中查找最后一次出现项之后的索引。此方法是较大数据结构的一部分,该数据结构将比较器传递给参数,因此对象始终是可比较的。我想以最有效的方式做到这一点,但我不确定线性方法或使用二进制搜索的方法是否会更快。如果有人能向我展示他们推荐的这种方法的实现,将不胜感激。

【问题讨论】:

  • 最好的方法是在进入stackoverflow之前首先编写尝试解决此问题的代码,然后如果这不起作用,请将您的尝试发布在stackoverflow上并提出您的问题.提示,使用从数组末尾开始并朝开头循环的 for 循环。
  • but I'm not sure if a linear method or a method using binary search would be faster 为什么不呢?你了解二分搜索的作用吗?

标签: java arrays big-o binary-search


【解决方案1】:

这取决于数组中数据的类型。如果项目经常重复并且更有可能最后一次出现在 (array.length - log_2(array.length)) 位置或更接近结尾 - 线性搜索会更好。否则 - 使用二进制搜索。

此外,您可以考虑数据局部性 - 二进制搜索需要访问数组中的随机元素,并且可以访问比线性搜索更多的缓存行 - 但它也取决于您要存储在那里的数据类型。

如果您不确定 - 使用二进制搜索。

编辑: 实际上,在更多地考虑这个问题之后,线性搜索(step = 1)会比每次迭代后步长增加的搜索更糟糕 - 就像二进制搜索向后运行 - 检查元素:(n-1)-1,(n-1)- (1+2),(n-1)-(1+2+4), ... (n-1)-(2^k) 如果找到较小的值,则在 (n-1)- 之间运行二进制搜索(2^k) 和 (n-1)-(2^(k-1))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多