在算法复杂度比线性更好的列表中查找第一个偶数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在算法复杂度比线性更好的列表中查找第一个偶数相关的知识,希望对你有一定的参考价值。

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

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

因此,偶数元素从数字4的奇数元素开始。这样做很简单,但是具有线性复杂度,但是必须具有更高的复杂度,因此想到二进制搜索,但是我不知道如何在这种情况下实现它。感谢帮助。

答案

由于这些值已经组织好,所以只取集合的中间值(数组,列表),然后检查它是偶数还是奇数。

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

奇怪吗?然后第一个偶数值还没有出现,丢弃前半部分,将第二个保留为新集合,并继续进行直到找到为止。

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

另一答案

您可以分割列表并找到索引i,以使索引i处的元素为偶数,而前一个元素为奇数。

def first_idx_even(l):
    """Return the index of the first even element."""
    lo, hi = 0, len(l)
    while lo < hi:
        mid = (lo+hi)//2
        # mid equal 0 or sequence odd - even
        if not mid or (l[mid] + l[mid-1]) % 2 == 1:
            return mid
        # sequence even - even
        elif l[mid] % 2 == 0 and l[mid-1] % 2 == 0: 
            hi = mid
        # sequence odd - odd
        else:
            lo = mid+1



>>> first_idx_even([1,2,2,4,24,4,8])
1
>>> first_idx_even([5,99,3,7,111,13,4,24,4,8])
6
>>> first_idx_even([2,22])
0
>>> first_idx_even([21,3])
None

以上是关于在算法复杂度比线性更好的列表中查找第一个偶数的主要内容,如果未能解决你的问题,请参考以下文章

二分搜索 O(log n) 算法在顺序列表中查找重复项?

线性查找算法(BFPRT)

算法——二分查找

数据结构 线性表 用c语言

吃透二分查找—— LeetCode 第 333435 题记

第三周 项目4-顺序表应用