分而治之的算法(二分搜索的应用?!)
Posted
技术标签:
【中文标题】分而治之的算法(二分搜索的应用?!)【英文标题】:Divide and Conquer Algorithms (Application of Binary Search?!) 【发布时间】:2015-04-08 09:00:00 【问题描述】:我是新来的。作为一名研究生,我对算法进行了一段时间的头脑风暴。我很感激可以就以下问题提供的任何帮助。我已经进行了足够多的搜索,但找不到任何解决此问题的方法。
我们有一个无限长的排序不同数字的数组。前 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))。
请提出您的想法。谢谢
【问题讨论】:
“我们有一个无限长的排序不同数字的数组。”停在那儿。马上离开计算机科学系,去隔壁的数学系。 @MikeNakis 为什么?一些计算机科学算法需要假设未绑定的值。 你不能有一个无限长的数组。您可能会说无穷无尽的项目流,但不是无穷无尽的数组。当然,您不能对流执行二进制搜索,因为您需要知道项目的总数,以便计算中间项,等等。 数字排序了吗? 我一定错过了什么,图灵机不再是计算机科学的一部分了吗? 【参考方案1】:您确实可以通过指数搜索解决无限数组的问题,即不知道 m。
尝试第一个元素并将索引加倍,直到得到 1。这将需要 O(Lg n) 步。然后你切换到二分搜索并在额外的 O(Lg n) 步骤中得到答案。
k 的值无关紧要。
这种方法在现实世界中是有意义的,即使用一个有限但未知大小的数组,前提是至少有一半的数组是用 1 填充的,这样搜索就会在边界内终止。
【讨论】:
在实践中,您甚至不会在指数搜索中找到 1,而只会找到第一个元素 >F。而且您只会在该位置和前一个位置之间进行二进制搜索。当然,这不会影响最坏情况的时间复杂度,但它可以为您提供更好的平均情况。 谢谢。有道理:) @biziclop:对。复杂度实际上是 O(Lg i),其中 i 是搜索元素的索引。另外,我没有说必须从第一个元素开始进行二分搜索:) 但是这种优化并没有改善平均情况,仍然是 O(Lg n) 或 O(Lg i),它只保留了一个测试.【参考方案2】:二分查找适用于已排序的数组。如果您有介于 0 和 1 之间的分数,则您的数组已排序,因此您可以对整个数组进行二进制搜索,它的复杂度为 O(lg (n+k)),其中 n 和 k 是您所说的值在你的问题中。无论如何,您的数组可能非常大,而分数的数量却很少。因此,无论时间复杂度如何,在这种情况下顺序搜索都会更快。
所以,在你的情况下,我建议简单的顺序搜索,它的复杂度为 O(n)。
【讨论】:
问题是你不知道n。尝试了解Yves Daoust's answer/exponential search。 是的。但是,如果值在区间 中并已排序,并且数组的“空”元素的值为 1,那么您就知道何时停止 - 当您到达第一个具有值 1 的元素时!因此,顺序搜索仍然具有 O(n) 复杂度,其中 n 是数组中元素的数量。以上是关于分而治之的算法(二分搜索的应用?!)的主要内容,如果未能解决你的问题,请参考以下文章