【问题标题】:C#: Efficient algorithm to find greatest m elements in an N x N matrixC#:在 N x N 矩阵中找到最大 m 个元素的高效算法
【发布时间】:2009-05-02 05:07:25
【问题描述】:

我想知道是否有一种有效的算法可以在 N x N 矩阵中找到最大的 m 个元素,方法头如下:

double[] greatestValues(double[][] matrix, int numberOfElements);

有什么想法吗?

【问题讨论】:

    标签: c# algorithm matrix


    【解决方案1】:

    如果您将 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

    【讨论】:

    • +1,很好的答案。我不知道 O(n + klog k) 算法——听起来很酷!
    猜你喜欢
    • 2012-05-18
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多