欢迎访问宙启技术站
智能推送

如何使用Python编写一个二分查找函数?

发布时间:2023-05-28 15:32:49

二分查找是一种查找算法,它在已排序的集合中找出特定元素的位置。

该算法将查找范围逐步缩小,最终找到特定元素的位置或者确认该元素不存在于集合中。二分查找的时间复杂度为$O(log_2N)$,可以轻松地处理数百万条数据。

Python语言不仅功能强大,而且使用简便。下面,我们将使用Python编写一个简单的二分查找函数,介绍其基本操作和实现思路。

实现思路

二分查找的实现主要分为以下三种步骤:

1.确定查找范围

首先,在已排序的集合中确定查找范围。我们需要找到这个集合的中心元素。如果集合的长度是奇数,则取中间那个元素作为中心;如果集合的长度是偶数,则取中间两个元素的均值作为中心。

2.比较中心元素和待查元素

接下来,我们将待查元素与中心元素进行比较。如果它们相等,则已经找到了该元素并退出查找。如果待查元素小于中心元素,则将查找范围缩小到前半部分集合,否则将查找范围缩小到后半部分集合。可以使用递归或循环实现此过程。

3.退出查找

重复执行步骤1和步骤2,直到找到待查元素或者查找范围无法再缩小为止。如果集合中没有待查元素,则返回None。

实现代码

现在,让我们使用Python编写一个简单的二分查找函数。

def binary_search(arr, low, high, x):

    """

    arr: 待查找的有序数组

    low: 查找范围的下限

    high: 查找范围的上限

    x: 待查找的元素

    """

    # 如果查找范围已经缩小到1个元素以下,则退出查找

    if high >= low:

        mid = (high + low) // 2  # 计算集合的中心位置

        # 如果待查找元素小于中心元素,则查找前半部分

        if arr[mid] > x:

            return binary_search(arr, low, mid - 1, x)

        # 如果待查找元素大于中心元素,则查找后半部分

        elif arr[mid] < x:

            return binary_search(arr, mid + 1, high, x)

        # 如果待查找元素等于中心元素,则返回中心位置

        else:

            return mid

    # 如果查找范围为空,则返回None

    else:

        return None

该函数接收四个参数:已排序的集合arr、查找范围的下限low、查找范围的上限high和待查找的元素x。该函数首先判断查找范围是否缩小到了1个元素以下,如果是则退出查找,否则计算集合的中心位置。

接下来,比较中心元素和待查元素的大小关系。如果待查元素小于中心元素,则在前半部分集合中查找;如果待查元素大于中心元素,则在后半部分集合中查找。如果待查元素等于中心元素,则已找到该元素的位置并返回。

如果查找范围为空,则返回None。这意味着,已知的查找范围中没有待查元素。

测试代码

下面,我们编写一个测试函数,使用上述二分查找函数测试一些样例。

def test_binary_search():

    arr = [2, 3, 4, 10, 40]

    x = 10

    result = binary_search(arr, 0, len(arr) - 1, x)

    assert result == 3, f"测试失败,期望输出为3,实际输出为{result}"

    arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    x = 0

    result = binary_search(arr, 0, len(arr) - 1, x)

    assert result == 0, f"测试失败,期望输出为0,实际输出为{result}"

    arr = [1, 3, 5, 7, 9]

    x = 2

    result = binary_search(arr, 0, len(arr) - 1, x)

    assert result is None, f"测试失败,期望输出为None,实际输出为{result}"

test_binary_search()

该测试函数使用三个不同的样例测试了我们的二分查找函数。在 个样例中,该函数成功地找到了集合中的元素,并返回了其位置。在第二个样例中,查找的元素就在集合的 个位置,我们可以检查返回的结果是否正确。在第三个样例中,待查元素不在集合中,因此函数应该返回None。

总结

在本文中,我们介绍了Python编写一个简单的二分查找函数。二分查找是一种效率高、易于实现的查找算法,适用于处理数百万条数据。我们的函数使用递归实现,从集合的中心位置开始比较待查元素和中心元素的大小关系,根据比较的结果缩小查找范围。如果待查元素存在于集合中,则返回其位置,否则返回None。

如果你对本文的内容有任何疑问或建议,请随时在下方评论区提出。