【问题标题】:Why do a "Lazy Binary Search"?为什么要进行“惰性二分搜索”?
【发布时间】:2012-03-04 07:00:44
【问题描述】:

今天有人问到惰性二分搜索。不知道那是什么,我寻找它,发现了这篇文章:What is Lazy Binary Search? 本质上,惰性二分搜索是一种二分搜索,您首先比较不等式,然后只比较一次是否相等 - 最后。

有什么意义?在什么情况下检查A<B 是否容易,但检查A=B 是否那么困难你想尽可能避免它?

【问题讨论】:

  • 每次迭代少一个比较。
  • 以更多迭代为代价。
  • 确实如此。但有时您只关心最坏情况下的性能(考虑硬实时应用程序或流水线硬件实现)。
  • 为什么迭代次数会更多?
  • 迭代次数几乎是恒定的——序列大小的log2(向上或向下取整,可能取决于机会)

标签: algorithm binary-search lazy-evaluation


【解决方案1】:

每次迭代减少一次比较。

当然,这是以更差的平均运行时间为代价的(你没有机会提前返回)。1但有时你只关心最坏情况下的运行时间(考虑困难- 实时应用程序,或流水线硬件实现)。


1。虽然渐近复杂度没有改变。

【讨论】:

  • 我仍然保持“懒惰”是一个坏名字。它应该被称为 ConsistentBinarySearch 什么的。嗯,至少现在说得通了。谢谢。
【解决方案2】:

惰性搜索所做的一件事是在序列中找到与目标相等的 first 元素(假设目标在序列中)。

如果您有多个与目标匹配的元素,则非惰性搜索会为您找到其中任何一个。

因此,C++ 库的 binary_search 可以实现为非惰性(我想通常是这样),而 lower_bound 不能。

【讨论】:

  • 是的,这是一个很好的副作用,但是当他们将其命名为“Lazy”而不是“LowestAnswerBinarySearch”时,可能并不是他们想的那样。
  • 嗯,问题是“为什么要使用它”,而不是“为什么它被称为 Lazy”。即便如此,这些东西并不总是由结果的属性命名,但有时由它如何工作的属性命名。 “懒惰”更容易上手。
  • 另外,“惰性二分搜索”似乎不是一个广泛使用的术语。根据不是很彻底的谷歌搜索,我看到它使用的唯一地方是询问它是什么(这里是 SO)以及罗格斯大学特定课程的讲座和作业。
【解决方案3】:

嗯,只是在“LAZY”搜索中,每次比较元素 X 与中心元素时,都会跳过检查相等性。只有在最后才检查是否相等。我想你所做的只是将搜索减少一个== 条件。

【讨论】:

  • 但是您正在增加迭代次数。也许“懒惰”只是一个坏名字?
  • 我不明白。为什么说迭代次数会增加?
  • 因为你总是迭代到最后——log2(序列长度)次。即使在第一次迭代中找到了您要查找的项目,您也永远不会在此之前停下来。
  • 我不明白。如果我将第一次迭代中的中间元素与 X 进行比较,并且如果 <> 为假,我不会 break 循环吗? (我可能错了)
  • 您只需检查 A
猜你喜欢
  • 2011-08-22
  • 2020-09-17
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
相关资源
最近更新 更多