给定一个n
数字列表,python中的min()
或max()
函数的比较数字是多少?如果这不是最佳选择,我该如何设计执行比较最少的功能?
答案 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中有一个实现。