Python 中最小值和最大值的大 O
Big O of min and max in Python
Python中min
和max
函数的大O是什么?他们 O(n)
还是 Python 有更好的方法来找到数组的最小值和最大值?如果它们是 O(n)
,使用 for 循环来查找所需的值不是更好吗?还是它们的工作方式与 for 循环相同?
是O(n)
。这是一个通用算法,一般情况下 max/min 不全部检查是找不到的。 Python 甚至没有内置的排序集合类型可以使检查易于专门化。
A for
循环将具有相同的算法复杂度,但在典型情况下 运行 会更慢,因为 min
/max
(在 CPython 无论如何)在 C 层 运行 宁一个等效循环,避免字节码解释器开销,for
循环会招致。
要找到序列的最大值或最小值,您必须查看每个元素一次,因此您不能比 O(n) 更好。
当然,Python min
和 max
也有 O(n):docs.
您可以使用 for 循环编写您自己的 min/max 函数,它具有相同的复杂性,但会更慢,因为它未在 C 中进行优化。
它们都是 O(n) 并且无法在数组中找到最小最大值。实际上 min/max 的底层实现是一个 for 循环。
正如在(理论上)一般情况中已经指出的那样,找到未排序的 collection 值的最小值或最大值需要您查看每个值(因此 O(N)
),因为如果您不不要看一个值,那个值可能比你的collection的所有其他值都大。
[..] isn't it better to use a for-loop to find the desired values or do they work the same as a for-loop?
没有。编程是关于抽象的:将实现(那个循环)的细节隐藏在一个花哨的名字后面。否则你可以用汇编写那个循环,不是吗?
现在是 "special" 的情况:我们通常不会处理任意大的数字。假设一个 2 位无符号整数:唯一可能的值是 0、1、2 和 3。只要您在某个(任意大的)collection 中找到 3,您就可以确定不会有更大的值。在这种情况下,进行一项特殊检查以了解是否已经找到最大(最小)可能值是有意义的。
对于时间复杂度 O(1) 你可以这样使用:
最小值 = y ^ ((x ^ y) & -(x < y)); // 最小值(x, y)
最大值 = x ^ ((x ^ y) & -(x < y)); // 最大值(x, y)
Python中min
和max
函数的大O是什么?他们 O(n)
还是 Python 有更好的方法来找到数组的最小值和最大值?如果它们是 O(n)
,使用 for 循环来查找所需的值不是更好吗?还是它们的工作方式与 for 循环相同?
是O(n)
。这是一个通用算法,一般情况下 max/min 不全部检查是找不到的。 Python 甚至没有内置的排序集合类型可以使检查易于专门化。
A for
循环将具有相同的算法复杂度,但在典型情况下 运行 会更慢,因为 min
/max
(在 CPython 无论如何)在 C 层 运行 宁一个等效循环,避免字节码解释器开销,for
循环会招致。
要找到序列的最大值或最小值,您必须查看每个元素一次,因此您不能比 O(n) 更好。
当然,Python min
和 max
也有 O(n):docs.
您可以使用 for 循环编写您自己的 min/max 函数,它具有相同的复杂性,但会更慢,因为它未在 C 中进行优化。
它们都是 O(n) 并且无法在数组中找到最小最大值。实际上 min/max 的底层实现是一个 for 循环。
正如在(理论上)一般情况中已经指出的那样,找到未排序的 collection 值的最小值或最大值需要您查看每个值(因此 O(N)
),因为如果您不不要看一个值,那个值可能比你的collection的所有其他值都大。
[..] isn't it better to use a for-loop to find the desired values or do they work the same as a for-loop?
没有。编程是关于抽象的:将实现(那个循环)的细节隐藏在一个花哨的名字后面。否则你可以用汇编写那个循环,不是吗?
现在是 "special" 的情况:我们通常不会处理任意大的数字。假设一个 2 位无符号整数:唯一可能的值是 0、1、2 和 3。只要您在某个(任意大的)collection 中找到 3,您就可以确定不会有更大的值。在这种情况下,进行一项特殊检查以了解是否已经找到最大(最小)可能值是有意义的。
对于时间复杂度 O(1) 你可以这样使用:
最小值 = y ^ ((x ^ y) & -(x < y)); // 最小值(x, y)
最大值 = x ^ ((x ^ y) & -(x < y)); // 最大值(x, y)