Arrays 分治算法(二进制搜索的应用?!)

Arrays 分治算法(二进制搜索的应用?!),arrays,algorithm,binary-search,divide-and-conquer,Arrays,Algorithm,Binary Search,Divide And Conquer,我是新来的。作为一名研究生,我对算法进行头脑风暴已经有一段时间了。我感谢您对以下问题提供的任何帮助。我已经找够了,找不到任何解决这个问题的办法 我们有一个无限长的排序不同的数字数组。前n个数是大于0但小于1的分数。所有剩余的元素都是“1”s,并且没有给您n的值。您需要开发一个算法来检查用户给定的分数F是否出现在该数组中。将算法的时间复杂度作为n的函数进行分析。(n=8的示例,其中1从数组的第8个位置开始) 我的做法: 我猜解决这个问题的最好办法是采用二进制搜索。每次我们都可以将数组的大小减少一半

我是新来的。作为一名研究生,我对算法进行头脑风暴已经有一段时间了。我感谢您对以下问题提供的任何帮助。我已经找够了,找不到任何解决这个问题的办法


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

我的做法: 我猜解决这个问题的最好办法是采用二进制搜索。每次我们都可以将数组的大小减少一半,最后得到要查找的分数。假设数组中有m个元素,包括1个。分数元素的数量为n。 对整个数组执行二进制搜索的时间复杂度为O(log(m))。因为我被要求用n表示时间复杂度,m=n+k(假设数组中1的数量为k) 所以这个问题的时间复杂度是O(log(n+k))


请把你的想法说出来。谢谢

对于无限数组,也就是说,不知道m,通过指数搜索确实可以解决这个问题

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

k的值是无关的


这种方法在现实世界中是有意义的,即对于大小有限但未知的数组,前提是数组中至少有一半填充了1,因此搜索在边界内终止。

二进制搜索适用于排序数组。如果分数在0到1之间,数组会被排序,所以可以对整个数组进行二进制搜索,它的复杂度为O(lg(n+k)),其中n和k是问题中所述的值。无论如何,数组可能非常大,分数的数量也非常小。因此,不管时间复杂度如何,在这种情况下,顺序搜索将更快


所以,在你的例子中,我建议简单的顺序搜索,它的复杂性为O(n)

“我们有一个无限长的排序不同的数字数组。”停在那里。马上离开计算机科学系,去隔壁的数学系。@MikeNakis为什么?某些计算机科学算法需要假定未绑定的值。不能有无限长的数组。你可以说是源源不断的项目,但不是无限的数组。当然,你不能在流上执行二进制搜索,因为你需要知道项目的总数,这样你就可以计算中间的项目,等等。这些数字排序了吗?我一定错过了什么,图灵机器不再是计算机科学的一部分了吗?实际上,在指数搜索中你甚至不会到1,只对>F的第一个元素进行搜索,并且只在该位置和前一个位置之间进行二进制搜索。当然,这不会影响最坏情况的时间复杂度,但它可以为您提供更好的平均情况。谢谢。有道理:)@biziclop:对。复杂性实际上是O(lgi),其中i是搜索元素的索引。另外,我没有说必须从第一个元素开始进行二进制搜索:),但是这种优化并没有改善平均情况,仍然是O(Lg n)或O(Lg I),它只需要进行一次测试。问题是你不知道n。试着理解。是的。但是,如果值在间隔内并已排序,并且数组中的“空”元素的值为1,那么当您到达第一个具有值1的元素时,您就会知道何时停止!因此,顺序搜索的复杂性仍然是O(n),其中n是数组中的元素数。