我的书说:
假设您有一组N个数字,并且想确定第k个最大数字。这就是选择问题。大多数上过一两个程序设计课程的学生都不会为解决这个问题而编写程序。有很多“显而易见的”解决方案。解决此问题的一种方法是将N个数字读入数组,然后按降序对数组进行排序。
它说以降序对数组排序是有意义的。这有什么意义?如果我有一个{1,9,3,7,4,6}
数组,并且想要最大的元素,那么我将以递增的顺序对其进行排序,因此{1,3,4,6,7,9}
然后返回最后一个元素。这本书为什么要降序排列?
答案 0 :(得分:1)
书中说,因为您可能不需要最大的元素
想确定第k个最大
如果按升序对其进行排序,您如何知道第3个最大的数字而没有先找出数组的大小呢?
如果数组降序,这样做会更容易,因为第3个最大的元素将只是第3个元素。
答案 1 :(得分:1)
顺序本身并不重要,但是如果要 k 个第 largest 个元素,则以降序排序,则位于< em> k -th元素(如果从索引0开始,则为 k-1 ),而如果我们以升序排序,则它位于索引 n-k + 1 (如果索引从0开始,则为 nk )。
对于 lazy 排序算法(就像Haskell和C#Linq的.OrderBy
中的算法一样),这实际上可能会影响时间复杂度。如果我们实现了 lazy 选择排序算法(即生成器),那么它将在 O(k×n)中运行,而不是 O(n 2 )。例如,如果我们使用QuickSort的 lazy 变体,则将需要 O(n + k log n)来获得第一个 k 元素。
在像Haskell这样的语言中,懒惰实际上是一个关键功能,人们通常不仅希望最大程度地减少生成整个结果的算法的时间复杂性,而且还要生成结果的子集。