在算法复杂度优于线性的列表中查找第一个偶数



我有第一个奇数元素的列表,然后是偶数元素,所以奇数元素首先出现在列表中,然后是偶数元素。例如:

list = [5,99,3,7,111,13,4,24,4,8]

因此,偶数元素在数字为 4 的奇数元素之后开始。以线性复杂性执行此操作很简单,但它必须具有更好的复杂性,因此想到了二进制搜索,但我不知道如何在这种情况下实现它。感谢您的帮助。

由于值已经组织好了,只需取集合的中间(数组、列表(并检查它是偶数值还是奇数值。

是偶数吗?然后,第一个偶数值位于集合的前半部分,您可以丢弃后半部分或当前值。

奇怪吗?然后第一个偶数值还没有到来,丢弃前半部分,保留第二个作为你的新收藏,并继续这样做,直到你找到它。

一些视觉指南: https://www.freecodecamp.org/news/binary-search-in-python-visual-introduction/

Rayner Fernandez在另一个答案中得到了正确的答案:二进制搜索在O(log n(时间内完成此操作。这样做的原因是输入列表有效地按奇偶校验降序排序。因为你关心的只是奇偶校验,这对于二叉搜索来说已经足够了;就二叉搜索而言,您的输入等效于所有 0 和 1。您可以将其视为运行二叉搜索查找 1/2,并返回在找不到目标之前查看的最后一个索引二叉搜索。

总之:检查列表中间的值。如果它是偶数,你知道最后一个奇数元素在左边;否则,如果它是奇数,你知道最后一个奇数元素是这个元素或其右侧。然后,在确定最后一个奇数元素存在的最小子阵列上重复相同的过程。

我们知道二进制搜索何时起作用的标准。由于数组具有 000..0111..1 属性,因此我们可以轻松地在此处使用二叉搜索。

在二分搜索中有两个边界,假设它们低和高,其中低 = 数组的第一个索引和高 = 最后一个索引。在每个迭代器中,我们使用(低 + 高(/2 从低到高找到中间元素。那么,当我们找到一个中间元素来检查时,我们能在这里做什么呢?我们可以检查它是否均匀。如果数字是奇数,我们可以忽略从低到中指数的元素,因为从低到中指数的所有元素都是奇数。在这种情况下,我们可以将下边界 low 更改为 midium + 1。现在,如果中指数是偶数,那么中指数可以是我们的答案,但答案也可以在低到中指数之间 - 1 指数。因此,我们将我们的较高边界降低到 midium - 1。

因此,我们可以得到偶数的最小索引。

法典:

ans = len(list)
low = 0, high = len(list) - 1
while low <= high:
mid = (low + high) // 2
if list[mid] % 2:
low = mid + 1
else:
ans = mid
high = mid - 1
# here ans is the index of the first even number

Python 的bisect 模块带有非常简单但经过良好测试的源代码。

尝试通过将a[mid] < x测试替换为偶数/奇数测试a[mid] % 2 == 1来修改该代码。

这应该可以帮助您解决问题,但无需我们实际为您编写代码。

祝你好运:-(

最新更新