我试图在空间和时间复杂度方面以最有效的方式找到数组中的第二个最大值,但我有两个主要问题:
天真或蛮力方法需要两次才能找到最小元素,因此O(n)复杂度,如果我对数组进行排序则需要O(n 2 )。
我总是可以使用BST进行O(log(n))排序,但是它们需要额外的空间来维护树,我也可以创建一个堆并做两次删除,我会得到第二大元素,但这里也是堆创建并存储在内存中。
我有什么选择?
答案 0 :(得分:4)
您可以一次完成此操作。只保留两个变量,最大值和第二个最大值。 每次更新最大值时,旧最大值将成为新的第二个最大值。
这推广到Top-k算法,您可以使用一个通道和O(k)空间找到k
最大(或最小)元素。在您的情况下k=2
。
答案 1 :(得分:0)
查找列表中第n个最大项称为选择问题,并且有许多算法可以解决它。 http://en.wikipedia.org/wiki/Selection_algorithm
您可以实现的最低复杂度是O(n),因为您需要至少查看一次列表中的每个项目。例如,从n列表中查找前k个项目可以使用部分插入排序在O(kn)时间内完成(遍历列表并跟踪前k个元素)。
有一种名为quickselect的算法可以在O(n)时间内找到前k项,与k无关。我建议查找它,但是为了找到前2名,一次扫描列表的简单方法就足够了。