学习常见的 Python 编程算法?

121 阅读5分钟

为了更好地理解计算机编程中的算法概念,让我们想象一下,我们有一组各种形状的图形。你可能有一些圆形、椭圆形、正方形、长方形、三角形,等等。你的目标是将这些不同的形状分成几个不同的集合。为了用计算机程序来组织这些形状,也许你可以设置一个循环,在所有的形状上进行迭代,并在每次迭代中确定它是什么形状。当它的形状被确定后,它被分配到一个特定的组。一旦所有的迭代完成,那么你就会有一定数量的组,每个组都有类似的形状。完成这个问题所需的完整步骤清单就是所谓的算法。在本教程中,我们将学习一些关于 Python 中的算法。


算法的特征

算法有各种特质,我们可以用它们来描述。例如,算法有时间复杂性和空间复杂性。

时间复杂度

时间复杂度描述了一个算法相对于给它工作的输入的大小来说有多高效。

空间复杂度

空间复杂度描述了一个算法需要多少内存和存储空间来完成它被分配的任务。

串行、并行、精确和近似

算法在本质上可以是串行的,也可以是并行的,产生精确的结果,或者产生近似的结果。一些算法可能以顺序的方式处理数据,这意味着它们在本质上是串行的。另一方面,并行算法可以将数据分解成更小的片段,然后同时对每个片段进行处理。一个算法可能是精确的,也可能是近似的。精确型在每次运行时都会产生一个已知的可预测值。一个近似的算法试图找到一个可能是或不可能是精确的答案。算法有时会以精确的决定来执行每一步。这被称为确定性的算法。一个算法也可能试图使用连续的猜测来产生一个解决方案,随着时间的推移,猜测会变得更加准确。这种类型的算法被称为非决定性算法。


欧几里德的算法

寻找两个数字的最大公分母是一项常见的任务。我们可以用欧几里德算法编写一个Python程序来完成这项任务。两个数的最大公分母是两个数相除不留余数的最大整数。考虑到我们有num1和num2。该算法的工作方式是用num1除以num2,然后再看余数。为此,我们可以使用modulo运算符。如果余数为零,那么我们就停止,因为我们找到了最大的共同分母。否则,我们将num1设为num2,然后将num2设为余数,然后重复第一步,直到余数为零。下面是Python中的内容。

def greatest_common_denominator(num1, num2):
    while (num2 != 0):
        temp = num1
        num1 = num2
        num2 = temp % num2

    return num1


print(greatest_common_denominator(27, 75))
print(greatest_common_denominator(55, 20))
3
5

大-O算法的性能

Big-O符号是用来描述算法性能的。它描述了算法的性能,因为输入的大小随着时间的推移而增长。使用字母O是因为一个算法的时间复杂度的增长率也被称为操作顺序。数据结构通常可以执行多种类型的操作,如插入或搜索值。每个人都可能有自己的操作顺序。

一些常见的大O术语

符号说明例子
O(1)恒定时间查询一个数组中的单个元素
O(log n)对数用二进制搜索在一个排序的数组中寻找一个项目
O(n)线性时间在一个未排序的数组中搜索一个特定的值
O(n log n)对数线性复杂的排序算法,如堆和合并排序
O(n2)二次方简单的排序,如冒泡排序、选择排序和插入排序。

上表是一些按时间复杂度升序排列的大O术语。它从恒定时间开始,它的Big-O值为1。这意味着有关操作不取决于给定数据集中的元素数量。一个例子可能是检查一个数字是偶数还是奇数,或者在一个数组中查找一个特定的元素索引。那么我们就有了log n,也被称为对数时间。使用二进制搜索在一个排序的数组中寻找一个值就是对数时间的一个例子。接下来是线性时间,对应于n的大O。这方面的一个例子是在一个未排序的数组中搜索一个项目。在我们的表格中,最后一个是n的平方的顺序,这被称为四次方时间复杂性。这意味着随着数据集中项目数量的增加,处理这些项目所需的时间以该数字的平方增加,所以它的效率不高。


一些常见的编程算法有哪些?

在本教程中,我们看了计算机科学中各种算法的概述。整本书都是关于这个主题的,所以虽然不能在这里深入介绍每一种算法,但我们确实提供了计算机科学中最常见的每一种算法的有用链接。另一个很好的算法资源可以在[可汗学院]找到,他们涵盖了二进制搜索、渐进符号、选择排序、插入排序、递归算法、河内塔、合并排序、快速排序、图形表示和宽度优先搜索。