获取线性时间列表中的第二大数字

获取线性时间列表中的第二大数字,第1张

获取线性时间列表中的第二大数字

由于@OscarLopez和我对第二大含义是什么有不同的看法,因此我将根据自己的解释并按照发问者提供的第一种算法发布代码。

def second_largest(numbers):    count = 0    m1 = m2 = float('-inf')    for x in numbers:        count += 1        if x > m2: if x >= m1:     m1, m2 = x, m1  else:     m2 = x    return m2 if count >= 2 else None

(注意:此处使用负无穷大,而不是None因为None在Python2和3中具有不同的排序行为-请参阅Python-查找第二个最小的数字;检查其中的元素数numbers可确保当实际的负无穷大时不会返回答案是不确定的。)

如果最大值多次出现,那么它可能也是第二大最大值。关于这种方法的另一件事是,如果元素少于两个,则它可以正常工作;那么没有第二大的。

运行相同的测试:

second_largest([20,67,3,2.6,7,74,2.8,90.8,52.8,4,3,2,5,7])=> 74second_largest([1,1,1,1,1,2])=> 1second_largest([2,2,2,2,2,1])=> 2second_largest([10,7,10])=> 10second_largest([1,1,1,1,1,1])=> 1second_largest([1])=> Nonesecond_largest([])=> None

更新资料

我对条件进行了重组,以大大提高性能。在我对随机数的测试中几乎达到了100%。原因是在原始版本中,elif总是在下一个数字不是列表中最大数字的情况下对进行评估。换句话说,对于列表中的几乎每个数字,都进行了两次比较,而一次比较就足够了–如果该数字不大于第二大数字,那么它也不大于第二大数字。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5666668.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存