搜索排序数组的最快搜索算法

Posted

技术标签:

【中文标题】搜索排序数组的最快搜索算法【英文标题】:fastest search algorithm to search sorted array 【发布时间】:2015-11-12 20:25:04 【问题描述】:

我有一个只有值 0 和 1 的数组。它们分别存储在数组中。例如,数组可能有前 40% 为 0,其余 60% 为 1。我想找出 0 和 1 之间的分割点。我想到的一种算法是二分搜索。由于性能对我来说很重要,所以不确定二分搜索是否能给我最好的性能。分裂点是随机分布的。该数组以 0 和 1 拆分的格式给出。

【问题讨论】:

为什么不只计算零和一的数量,而不是对数组进行排序和搜索? 如果你只有一个数组来存储,二分查找是你能得到的最快的。为什么你会认为这太慢了? 如果分割点的位置是随机分布的(即得到40/60分割的概率与得到1/99、99/1、50/50等分割的概率相同)那么二分查找是解决这个问题的最快方法。 嘿@Fuser97381,如果你有数组怎么办?这种方法变得次优。请看我的回答。 如果你只有一点点,为什么还要存储在数组中?将它们存储为 long,您将立即获得 0 的数量。数组在这里是错误的数据结构。 【参考方案1】:

当您给定数组时,保持计数的看似聪明的答案并不成立。

计数是O(n),线性搜索也是如此。因此,计数不是最优的!

二分搜索是您的朋友,可以在O(lg n) 时间完成工作,您可能知道是way better。

当然,如果您无论如何都必须处理数组(从文件读取、用户输入等),请利用这段时间计算1s0s 的数量并完成它(您甚至不必存储任何数据,只需保留计数即可。

为了说明这一点,如果你正在编写一个库,它有一个名为 getFirstOneIndex(sortZeroesOnesArr: Array[Integer]): Integer 的函数,它接受一个由 1 和 0 组成的排序数组并返回第一个 1 的位置,不要计算,二分查找.

【讨论】:

除非有问题的数组来自外部源,否则无论生成数组的任何代码,在不丢失信息和不浪费内存的情况下,都会保留计数。这听起来像是一个经典的 XY 问题。不过——你的答案很好,所以我会赞成。

以上是关于搜索排序数组的最快搜索算法的主要内容,如果未能解决你的问题,请参考以下文章

排序旋转整数数组,搜索算法[重复]

《图解算法》--快速排序哈希表图广度优先搜索算法

C中的递归未排序数组搜索算法?

在未排序数组中搜索元素的最快方法

算法leetcode|33. 搜索旋转排序数组(rust重拳出击)

算法leetcode|33. 搜索旋转排序数组(rust重拳出击)