在小于 O(n)的时间中查找数组中数字的频率。
Array 1,2,2,3,4,5,5,5,2
Input 5
Output 3
Array 1,1,1,1
Input 1
Output 4
答案 0 :(得分:1)
如果您的仅信息是未排序的数组(正如您的测试数据似乎表明的那样),那么 在查找时不能比O(n)
更好给定值的频率。没有解决这个问题。
为了实现更好的时间复杂性,有多种方式。
一种方法是保持数组排序(如果你不想改变顺序,则保持平行排序的数组)。这样,您可以使用二进制搜索来查找具有给定值的第一个项目,然后依次扫描该部分以获取计数。虽然最差案例(所有项目相同且该值是您正在寻找的内容)仍然是O(n)
,但它会倾向于O(log n)
平均情况。< / p>
请注意,每次在查找值之前对数据进行排序都不会起作用,因为这几乎肯定会使高于 O(n)
限制。我们的想法是只对项目插入进行排序。
如果您的域(可能的值)有限,另一种方法是分别维护这些值的实际频率。例如,如果域限制为1到100的数字,则使用包含每个值的频率的单独数组。
当列表为空时,所有频率都为零。无论何时添加或删除项目,都要增加或减少该值的频率。这将使频率提取快速O(1)
操作。
但是,如上所述,这两种解决方案都需要维护额外/修改的数据。如果没有这个,你就不能比O(n)
做得更好,因为你需要检查数组中的每个项目,看它是否与你正在寻找的值相匹配。