【发布时间】:2009-05-02 05:07:25
【问题描述】:
我想知道是否有一种有效的算法可以在 N x N 矩阵中找到最大的 m 个元素,方法头如下:
double[] greatestValues(double[][] matrix, int numberOfElements);
有什么想法吗?
【问题讨论】:
我想知道是否有一种有效的算法可以在 N x N 矩阵中找到最大的 m 个元素,方法头如下:
double[] greatestValues(double[][] matrix, int numberOfElements);
有什么想法吗?
【问题讨论】:
如果您将 N x N 矩阵视为 N x N 项的数组,则可以应用以下技术之一:
直接应用基于快速排序的选择算法 基于排序的选择算法可以是 用于查找 k 最小或 k 最大 元素。找到k个最小元素 使用找到第 k 个最小的元素 基于中位数快速排序的中位数 算法。分区后 找到第 k 个最小的元素,所有 小于第 k 个的元素 较小的元素将出现在左边 到第 k 个元素和所有元素 更大的将出现在 第 k 个最小元素。因此所有 从第 1 个元素到第 k 个元素 包含构成 k 最小的 元素。时间复杂度为 线性在 n 中,总数 元素。
基于数据结构的解决方案 另一种简单的方法是将每个 列表的元素变成有序的 设置数据结构,例如堆或 自平衡二叉搜索树, 最多有 k 个元素。每当 数据结构有超过k个 元素,我们删除最大的 元素,可以在 O(log k) 中完成 时间。每次插入操作也 花费 O(log k) 时间,导致 总共 O(nlog k) 时间。
可以转换列表 在 Θ(n) 时间内进入一个堆,然后 使用修改的遍历堆 广度优先搜索算法 将元素放在优先级中 队列(而不是普通的队列 通常在 BFS 中使用),以及 遍历后终止扫描 正好是 k 个元素。作为队列大小 在整个遍历过程中保持 O(k), 这将需要 O(klog k) 时间 完成,导致时间限制 这个算法的 O(n + klog k)。
来自here。
【讨论】: