划分和征服算法(二进制搜索的应用?!)

时间:2015-02-08 15:46:29

标签: arrays algorithm binary-search divide-and-conquer

我是新来的。作为一名研究生,我现在已经在算法上集思广益了一段时间。我感谢任何可以解决以下问题的帮助。我搜索得足够多,我找不到任何解决这个问题的方法。

我们有一组排序的不同数字,这些数字是无限长的。前n个数字是大于0但小于1的分数。所有剩余的元素都是“1”,并且没有给出n的值。您需要开发一种算法来检查该数组中是否出现用户给定的分数F.将算法的时间复杂度分析为n的函数。 (n = 8的示例,其中1从数组的第8个位置开始)

我的方法: 我猜测解决这个问题的最佳方法是使用二进制搜索。每次我们可以将数组的大小减半,最后到达要找到的分数。我们假设数组中有m个元素,包括1。分数元素的数量是n。 在整个阵列上执行二进制搜索的时间复杂度是O(log(m))。因为我被要求用n表示时间复杂度,m = n + k(假设数组中1的数量是k) 所以这个问题的时间复杂度是O(log(n + k))。

请投入你的想法。感谢

2 个答案:

答案 0 :(得分:8)

你确实可以通过指数搜索解决无限数组,即不知道m。

尝试第一个元素并将索引加倍,直到得到1.这将采用O(Lg n)步。然后切换到二进制搜索并以额外的O(Lg n)步骤获得答案。

k的值无关紧要。

这种方法在现实世界中是有意义的,即具有有限但未知大小的数组,前提是至少有一半的数组用1填充,以便搜索终止入界。

答案 1 :(得分:-1)

二进制搜索适用于排序的数组。如果您的分数在0到1之间,则对数组进行排序,因此可以对整个数组进行二进制搜索,并且复杂度为O(lg(n + k)),其中n和k是您所声明的值在你的问题。无论如何,您的数组可能很大,而分数的数量却很小。因此,无论时间复杂度如何,在这种情况下顺序搜索都将更快。

因此,在您的情况下,我建议进行简单的顺序搜索,其复杂度为O(n)。