c - 在单调递增然后递减的序列cera中找到一个数字

标签 c algorithm binary-search

在单调递增然后单调递减的序列中找到最大值或最小值可以在 O(log n) 中完成。

但是,如果我想检查一个数字是否存在于这样的序列中,是否也可以在 O(log n) 中完成?

我认为这是不可能的。考虑这个例子:1 4 5 6 7 10 8 3 2 0。

在这个例子中,如果我需要查找序列是否包含'2',我没有任何条件将搜索空间划分为原始搜索空间的一半。在最坏的情况下,它将是 O(n),因为当我们尝试搜索 2 时,您需要检查两半。

我想知道,这个搜索是否可以在 O(log n) 时间内完成?

最佳答案

如您所述,您可以在 O(logn) 中找到最大值(及其位置)。然后你可以在每个部分进行二进制搜索,这也是 O(logn)。

在上面的示例中,您在位置 5 找到最大值 10。 然后在子序列 [0..5] (1, 4, 5, 6, 7, 10) 中进行二分查找。 由于找不到 2,您继续在另一部分(10、8、3、2、0)中进行二分查找。

要在 O(logn) 中找到最大值:查看中心的两个元素:7 < 10。因此我们仍处于递增部分,必须在序列的右半部分寻找最大值:( 10、8、3、2、0)。查看 8 和 3,然后继续左边的部分 (10, 8)。

关于c - 在单调递增然后递减的序列cera中找到一个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11536123/

相关文章:

Java 简单字符串差异工具

python - 在排序数组中查找目标范围的时间复杂度——这个解决方案在最坏的情况下是 O(N) 吗?

c - 结构/线程内的指针

c - 如何在 C/Objective-C 中获取数组的大小?

c - 使用写入功能打印扩展的 ascii

arrays - 查找具有相同数量的 0's and 1' 的最大子数组

c++ - SQL Server 从扩展存储过程捕获错误

algorithm - 确定一个数的所有倍数的特定算法

c++ - 处理递归二分搜索中的段错误

使用二分搜索检查排序的非顺序数组是否有重复项?