我正在写这个方法: findLastOccurrence(Object item){}
在排序的对象数组中最后一次出现项之后查找索引。此方法是更大的数据结构的一部分,该结构将比较器传递给参数,因此对象始终具有可比性。我想以最有效的方式做到这一点,但我不确定线性方法或使用二进制搜索的方法是否会更快。如果有人能告诉我他们推荐的这种方法的实现,我将不胜感激。
答案 0 :(得分:0)
这取决于数组中的数据类型。如果项目经常重复并且更可能最后一次出现(array.length - log_2(array.length))位置或更接近结尾 - 线性搜索会更好。否则 - 使用二进制搜索。
此外,您可以考虑数据位置 - 二进制搜索需要访问数组中的随机元素,并且可以访问比线性搜索更多的缓存行 - 但它还取决于您想要存储在那里的数据类型。
如果您不确定 - 请使用二进制搜索。
编辑: 实际上在仔细考虑这个问题之后,线性搜索(步骤= 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))。