所以,我想更多地了解二分查找,因为我不太理解。二分查找需要一个前提条件,即数组已排序。我理解对了吗?看起来好像该方法应该检查此前提条件,并在未满足时抛出异常。但是,为什么检查前提条件是个坏主意呢?
所以,我想更多地了解二分查找,因为我不太理解。二分查找需要一个前提条件,即数组已排序。我理解对了吗?看起来好像该方法应该检查此前提条件,并在未满足时抛出异常。但是,为什么检查前提条件是个坏主意呢?
这是一个不好的想法,因为检查数据是否已排序需要n
个步骤。整个搜索只需要log(n)
个步骤。
如果您要检查,最好进行线性搜索。
是的,二分查找需要0(log n)步骤,验证整个序列已排序需要0(n)步骤。从我的角度来看,在DEBUG模式下验证它是很好的,而不是在发布时。
二分查找假设输入数据已排序。所以在这里你是正确的。
现在一般情况下,检查数据是否已排序需要一些时间。因此,在每次搜索之前执行此操作会使搜索变得非常低效。
假设“n”是您的数据量。
二分搜索在最坏情况下需要O(log(n))
操作才能找到一个元素。确保数据已排序需要O(n)
操作。
因此,如果我们每次都为非常大的n
检查前提条件,我们将开始花费大部分时间来检查前提条件,而不是进行实际搜索。
而且很容易说出什么时候会出现这种效果。我只是计算了您将花费多少时间进行预检查与实际搜索。
等等。在每种情况下,其余的时间都花费在前置条件检查上。
除了其他人提到的运行时间(O(n)检查所有项,与O(log(n))运行二分搜索相比),
我认为你误解了前置条件的概念。前置条件和后置条件是一种契约。如果你的前置条件成立,并且你运行你的算法,那么你的后置条件将成立。如果你的前置条件不成立,那么你对后置条件不做任何保证。
因此,基本上,二分搜索说的是:如果你给我的数据已经排序好了,那么我可以通过执行大约log(n)次检查来告诉你特定数据的位置,或者如果不存在,我也可以告诉你。如果数据没有排序,我对我的答案不做任何保证。
从前置条件到后置条件所需的工作就是你的算法。在这种情况下,是二分搜索。
原始问题假设您正在对数据集执行二分查找。但并非总是如此。很多时候,您只是尝试计算某个区间内的数字。
假设您正在尝试计算风扇的最佳速度设置。由于某种原因,您找不到一个闭合形式表达式,因此您模拟了不同速度设置下的气流。
假设风扇可以从0RPM到5000RPM的任何速度运行,您实际上不需要生成可能速度的列表。您只需在二分搜索的每个步骤中找到先前最小值和最大值的平均值即可。