max()或min()函数进行多少次比较?

时间:2018-10-07 09:11:10

标签: python performance max time-complexity min

给定一个n数字列表,python中的min()max()函数的比较数字是多少?如果这不是最佳选择,我该如何设计执行比较最少的功能?

1 个答案:

答案 0 :(得分:9)

内置的min()max()遍历列表一次,执行n-1比较(第一个元素与第二个元素比较,然后前两个元素中较大的一个与第三个元素比较,依此类推)。这是big-O notation中的O(n)

除非您对列表有所了解(例如以某种方式订购),否则您做不到比O(n)更好的事情:任何元素都可以是最小或最大,因此需要查看

这里是min()max()都使用的循环的简化和注释版本:

it = PyObject_GetIter(v); /* v is the list */
maxitem = NULL; /* the result */
maxval = NULL;  /* the value associated with the result, always
                   the same as maxitem in this simplified version */
while (( item = PyIter_Next(it) )) {
    /* maximum value and item are unset; set them */
    if (maxval == NULL) {
        maxitem = item;
        maxval = item;
    }
    /* maximum value and item are set; update them as necessary */
    else {
        int cmp = PyObject_RichCompareBool(val, maxval, op); /* op is Py_LT or Py_GT */
        if (cmp > 0) {
            maxval = val;
            maxitem = item;
        }
    }
}

source code。)

如果您需要反复查找和删除集合中最小或最大的元素,而这在整个算法的运行时间中占主导地位,那么也许值得研究除列表以外的数据结构。

一个立即出现的数据结构是binary heap。它提供O(n logn)插入和O(n logn)最小(最大)元素的删除。 Python的heapq module中有一个实现。