2015-12-29 45 views

回答

1

一次扫描应该更快,因为您可以只保留两个分隔符变量最小和次小。您将在平均值上使用,每次迭代少于两次比较(与使用正好2倍数量的单循环比较的2次独立循环相比)。

在某种伪

smallest = Inf 
2ndSmallest = Inf 
for elem in array 
    if elem < smallest 
     2ndSmallest = smallest 
     smallest = elem 
    else if elem < 2ndSmallest 
     2ndSmallest = elem 
    end 
end 

凡这是假定你进入上面的,如果完全在至少两次(你可以轻松地添加一个修补程序的情况下,这可能并非如此)条款。然而,讨论是更喜欢的,所以我会留下写下实际的比较实施作为练习。

+1

你的算法是错误的。 – elias

+1

@Elias请给我一些更详细的反馈,我可以纠正这一点,以及自己学习一些东西。 – dfri

+0

现在,您的版本后,几乎是正确的。如果数组为[[1,1,2]],则“最小”和“2ndSmallest”将为“1”。 – elias

0

经验法则:避免多次循环

拇指的第二个规则:避免过早优化(可读性和可维护性第一)

这就是说,高效的算法

(请注意,你需要的伪代码以处理列表大小为空或一个的情况):

smallest = min(list[0],list[1]) 
second_smallest = max(list[0],list[1]) 
for el in list[2:]: 
    if el < second_smallest: 
     second_smallest = max(el,smallest) 
     smallest = min(el,smallest) 
+0

是不是避免多个循环过早优化的一个实例?我在计算机体系结构中阅读了它。他们说,如果迭代多次,你就会失去缓存。在进一步推进之前,关注一块阵列并尽可能多地做好工作。但是利用系统缓存是一个过早的优化,因此是不好的。 –

+0

是的,但多个循环也会影响可读性。所以,重点是首先关注可读性和可维护性。那么,如果你正在寻求优化,一般的经验法则是循环是昂贵的,然后...不是。 – Harrichael