Arrays 数组中数字的频率快于线性时间

Arrays 数组中数字的频率快于线性时间,arrays,big-o,frequency,Arrays,Big O,Frequency,在小于O(n)的时间内查找数组中某个数字的频率 Array 1,2,2,3,4,5,5,5,2 Input 5 Output 3 如果您仅有的信息是一个未排序的数组(如测试数据所示),那么在查找给定值的频率方面,您无法比O(n)做得更好。这是绕不开的 为了获得更好的时间复杂度,有多种方法 一种是保持数组排序(如果不想更改顺序,则使用并行排序数组)。这样,您可以使用二进制搜索找到具有给定值的第一项,然后依次扫描该部分以获得计数。虽然最坏的情况(所有项目都相同,并且该值就是您要查找的)仍然是O(

在小于O(n)的时间内查找数组中某个数字的频率

Array 1,2,2,3,4,5,5,5,2
Input 5
Output 3
如果您仅有的信息是一个未排序的数组(如测试数据所示),那么在查找给定值的频率方面,您无法比
O(n)
做得更好。这是绕不开的

为了获得更好的时间复杂度,有多种方法


一种是保持数组排序(如果不想更改顺序,则使用并行排序数组)。这样,您可以使用二进制搜索找到具有给定值的第一项,然后依次扫描该部分以获得计数。虽然最坏的情况(所有项目都相同,并且该值就是您要查找的)仍然是
O(n)
,但它将趋向于
O(logn)
平均情况

请注意,每次在查找值之前对数据进行排序都不起作用,因为这几乎肯定会使您超出
O(n)
限制。这样做的目的是只在项目插入时进行排序


如果您的域(可能值)有限,另一种方法是单独保持这些值的实际频率。例如,如果域限制为数字1到100,则使用包含每个值的频率的单独数组

当列表为空时,所有频率均为零。无论何时添加或删除项目,都可以增加或减少该值的频率。这将使频率提取成为一种快速的
O(1)
操作



但是,如上所述,这两种解决方案都需要维护额外/修改的数据。如果没有这一点,你就不能做得比O(n)更好,因为你需要检查数组中的每一项,看看它是否与你要查找的值匹配。

如果数组没有排序,你需要至少看一次每个数字,无论你如何找到频率,在随机排列的阵列中,不查看每个元素就无法找到频率
Array 1,1,1,1
Input 1
Output 4