1.3 对关键操作进行计数
由于最大值实际上肯定包含在A
中,因此程序清单1-2中正确的largest()
函数先选择A
的第1个值作为my_max
,再对其他值进行检查,查找是否有其他值比它更大。
程序清单1-2 在列表中查找最大值的正确函数
def largest(A):
my_max = A[0] ❶
for idx in range(1, len(A)): ❷
if my_max < A[idx]:
my_max = A[idx] ❸
return my_max
❶ 把my_max
设置为A
中位于索引位置0的第1个值。
❷ idx
取1
~len(A)
(不包括后者)的整数。
❸ 如果A[idx]
的值更大,就更新my_max
。
如果对空列表调用largest()
或max()
,将会触发一个异常“ValueError:List index out of range exception”。这类运行时异常是程序员所犯的错误,说明他们没有理解largest()
所操作的列表至少要包含一个值。
既然我们已经拥有了这个算法的一种正确的Python实现,能不能确定这个新算法调用小于操作的次数呢?能!就是N−1次。我们修正了算法的缺陷,并提高了它的性能(当然,只是提高了微不足道的一点)。
为什么对小于操作的使用进行计数很重要呢?因为它是对两个值进行比较时所使用的关键操作。其他所有程序语句(例如for
或while
循环)在不同的实现中可以根据实际所使用的编程语言任意选择。我们将在第2章对这个思路进行扩展,目前只要对关键操作进行计数就足够了。