返回

时间复杂度——快速入门指南

见解分享

对于那些对算法运行时间好奇却难以理解时间复杂度的同学来说,这篇文章将为你拨开迷雾。

要评估程序的运行时间,我们通常会计算其执行的基本操作的次数。在此过程中,我们假定 CPU 的每个操作单元运行所消耗的时间是相同的。

算法导论等经典著作对时间复杂度进行了详细的介绍,但对于初学者来说,这可能会有点艰涩难懂。在这篇指南中,我们将采用更加通俗易懂的方式,从面试的角度阐述时间复杂度。

时间复杂度是对算法效率的度量,它反映了算法随输入规模变化时运行时间增长的速度。为了这种增长模式,我们使用“大 O 表示法”。

大 O 表示法通过使用渐近符号(例如 O(n)、O(n^2))来表示算法在输入规模趋于无穷大时执行所需的时间。这些符号的含义如下:

  • O(1) :算法在所有输入规模下执行的时间都是常数。
  • O(n) :算法的执行时间与输入规模 n 成线性关系。
  • O(n^2) :算法的执行时间与输入规模 n 的平方成二次关系。
  • O(log n) :算法的执行时间与输入规模 n 的对数成对数关系。
  • O(n!) :算法的执行时间与输入规模 n 的阶乘成阶乘关系。

了解这些基本概念后,让我们通过一些简单的示例来学习如何计算时间复杂度:

示例 1:线性搜索

def linear_search(array, target):
    for element in array:
        if element == target:
            return True
    return False

在这个示例中,线性搜索算法对一个数组中的每个元素进行一次比较。当输入规模 n 增大时,比较次数也会呈线性增长。因此,其时间复杂度为 O(n)。

示例 2:二分查找

def binary_search(array, target):
    low = 0
    high = len(array) - 1

    while low <= high:
        mid = (low + high) // 2
        if array[mid] == target:
            return True
        elif array[mid] < target:
            low = mid + 1
        else:
            high = mid - 1

    return False

二分查找算法通过反复将搜索范围减半来找到目标元素。由于每次比较都会将搜索范围减半,因此比较次数以对数增长。因此,其时间复杂度为 O(log n)。

掌握时间复杂度的技巧不仅对面试有帮助,而且对于理解算法的效率和优化代码也至关重要。通过遵循本文中概述的步骤,你将能够自信地计算和解释算法的时间复杂度,从而为你的编程技能增色不少!