Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 求m最大数_Algorithm_Sorting_Heap - Fatal编程技术网

Algorithm 求m最大数

Algorithm 求m最大数,algorithm,sorting,heap,Algorithm,Sorting,Heap,这是Cormen文本中的一个问题,但我想看看是否还有其他解决方案 给定一个具有n个不同数字的数组,您需要找到数组中最大的m个数字,然后 按顺序排列。假设n和m很大,但增长不同。特别是,你需要 要考虑下面的情况,其中m=t*n,其中t是一个小数,表示0.1,然后 可能性m=√n 本书中给出的解决方案提供了3个选项: 对数组进行排序并返回顶部的m长段 将数组转换为最大堆并提取m个元素 选择第m个最大数字,对其周围的数组进行分区,并对较大的条目段进行排序。 这些都是有道理的,它们都有各自的优点和缺点,

这是Cormen文本中的一个问题,但我想看看是否还有其他解决方案

给定一个具有n个不同数字的数组,您需要找到数组中最大的m个数字,然后 按顺序排列。假设n和m很大,但增长不同。特别是,你需要 要考虑下面的情况,其中m=t*n,其中t是一个小数,表示0.1,然后 可能性m=√n

本书中给出的解决方案提供了3个选项:

对数组进行排序并返回顶部的m长段 将数组转换为最大堆并提取m个元素 选择第m个最大数字,对其周围的数组进行分区,并对较大的条目段进行排序。
这些都是有道理的,它们都有各自的优点和缺点,但我想知道,还有别的方法吗?它不一定要更好或更快,我只是想知道这是否是更多解决方案的常见问题,或者我们是否仅限于这三种选择。

您提到的三种方法的时间复杂性如下

登录n 在+m日志n上 关于+m log m
因此,在渐进复杂性方面,选项3肯定比其他方法好,因为您提到的三种方法的时间复杂性如下

登录n 在+m日志n上 关于+m log m 因此,选项3在渐近复杂性方面肯定优于其他选项,因为m是一种不同的方法

取前m个数字,并将它们转换为最小值堆。在数组中运行,如果其值超过顶部m的最小值,则提取最小值并插入新值。当到达数组的末尾时,可以将元素提取到数组中并反转

这个版本最糟糕的情况是在logm上,为了提高效率,把它放在第一个和第二个方法之间

一般情况更有趣。平均来说,只有Om logn/m个元素将通过第一次比较测试,每次都会产生Ologm工作,因此您将使用+m logn/m logm工作,这将其置于第二和第三种方法之间。但是,如果n比m大很多数量级,那么On-piece占主导地位,并且第三种方法中的On-median-select的常数比这种方法中每个元素的一个比较差,因此在这种情况下,这实际上是最快的

另一种方法

取前m个数字,并将它们转换为最小值堆。在数组中运行,如果其值超过顶部m的最小值,则提取最小值并插入新值。当到达数组的末尾时,可以将元素提取到数组中并反转

这个版本最糟糕的情况是在logm上,为了提高效率,把它放在第一个和第二个方法之间


一般情况更有趣。平均来说,只有Om logn/m个元素将通过第一次比较测试,每次都会产生Ologm工作,因此您将使用+m logn/m logm工作,这将其置于第二和第三种方法之间。但是,如果n比m大很多数量级,那么On-piece占主导地位,并且第三种方法中的On-median-select的常数比这种方法中每个元素的一个比较差,因此在这种情况下,这实际上是最快的

在阵列中走m次,跟踪上一个最大值,以获取最近的一个最大值,而无需经过。价格是正确的风格。Mb类似这样的东西。具有类似smth的优先级队列长度m,将其编号按顺序排列,因此在队列开始处是最大的编号,在队列结束处是最小的编号。然后你取下一个数字,如果它比最小的数字小,你根本不做smth,过大的,你就把它按顺序插入。它与第2点的最大堆相同。但是我们有一个有限的heapor队列,不确定会是什么better@C.B.if我在^2上太大了,使用quick对其进行排序更快sort@MikeMinaev你说C.B.是白痴吗?他知道他提供的方法很糟糕。OP表示,任何其他方法,即使速度较慢。将数字打印在纸上,将每个数字单独剪下,然后分别交给一群孩子,但将较大的数字交给较大的孩子。那就让我们决一死战吧。我还没有找出错误,但观看起来很有趣。在阵列中走m次,跟踪上一个最大值,以获取最近的一个,而无需经过。价格是正确的风格。Mb类似这样的东西。具有类似smth的优先级队列长度m,将其编号按顺序排列,因此在队列开始处是最大的编号,在队列结束处是最小的编号。然后你取下一个数字,如果它比最小的数字小,你根本不做smth,过大的,你就把它按顺序插入。它与第2点的最大堆相同。但是我们有一个有限的heapor队列,不确定会是什么better@C.B.if我在^2上太大了,使用quick对其进行排序更快sort@MikeMinaev你说C.B.是白痴吗?他知道他提供的方法很糟糕。报道说
任何其他方法,即使速度较慢。将数字打印在纸上,将每个数字单独剪下,然后分别交给一群孩子,但将较大的数字交给较大的孩子。那就让我们决一死战吧。我还没有找出错误,但看起来很有趣。不知道如何计算第三复杂度?不确定我们将如何选择第m个最大数字。那么,您能定义m小的时间吗?@njzk2算法,On,后跟一些Om log m sort,例如mergesort,这是我获得选项3复杂性的原因。@njzk2 When m小的意义可疑。这真的意味着尝试它,并分析它,看看它是否足够快,以满足您的需要。或者它可能意味着当m是一些小的固定常数,如10或100时。@stackoverflowuser2010基数排序对于已知大小的数字是开的,但是对于任何数字都是开的。logn。不确定如何计算第三个复杂度?不确定我们将如何选择第m个最大数字。那么,您能定义m小的时间吗?@njzk2算法,On,后跟一些Om log m sort,例如mergesort,这是我获得选项3复杂性的原因。@njzk2 When m小的意义可疑。这真的意味着尝试它,并分析它,看看它是否足够快,以满足您的需要。或者,这可能意味着当m是某个小的固定常数,如10或100时。@stackoverflowuser2010基数排序对于已知大小的数字是开的,但对于任何数字都是开的。logn。如果将从最小堆提取的值从最后一个索引插入到第一个索引的结果数组中,如果将从最小堆提取的值从最后一个索引插入到第一个索引的结果数组中,则甚至不需要将其反转。