【发布时间】:2014-05-13 22:12:44
【问题描述】:
我正在准备考试,发现了这个问题。
例如,给定一个排序的整数数组:
{-5, -5, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 67, 67, 99}
写一个方法:
Public static int count (int[] a, int x)
返回次数,数字'x'在数组中。
例如:
x = -5, it returns 2
x = 2, it returns 5
x = 8, it returns 0
我要写得尽可能高效,请不要给我答案 (或者如果你愿意就写,但我不会看),我的想法是做一个二进制搜索,然后 走到我找到的值的两个边缘(向后和向前)并使用索引号,返回正确答案,我的问题是:
- 这是最有效的方法吗?
- 在最坏的情况下不会是 O(n) 吗? (当数组填充单个数字时)-
如果是这样 - 那我为什么要进行二分搜索?
【问题讨论】:
-
@ambigram_maker 这可能是一个“修改过的”二进制搜索,如果你找到你的密钥,你仍然会继续搜索。
-
如果允许,请检查数组中是否存在该数字。如果没有,请返回。否则,我会说使用过早返回尽快退出该方法。
-
一定有办法低于 O(n),这是一个关于复杂性的问题,他们不会给我一个问题,我可以去 O(n) 次,然后当我找到时数数它,在我看来是二分搜索的一种变体。
-
@SethKeno 显然您的算法必须查看数组中的每个元素。我认为它不会比 O(n) 更好。我能想到的天真的方法宁愿是 O(n^2) [对于每个元素,查看它,然后遍历数组,计算那个元素]
-
@fstd 你读过这个问题吗?即使是最简单的实现(计算一个数组中 ONE 值的出现次数也不超过 O(n)!鉴于数组已排序,这当然可以使用一些除法在 O(log(n)) 中解决和征服的方法。
标签: java algorithm time-complexity binary-search