根据行和列对矩阵中的所有元素进行排名

Posted

技术标签:

【中文标题】根据行和列对矩阵中的所有元素进行排名【英文标题】:Rank all the elements in a matrix with respect to their row and column 【发布时间】:2019-07-18 05:54:57 【问题描述】:

假设我有一个矩阵(Python 中的二维列表),我想创建另一个矩阵,其中所有元素的排名基于它们所在的行和列。条件是:

    排名应该从 1 开始 应为同一行或同一列中的相同元素提供相同的排名 如果根据特定的行或列排名,相同元素位于不同的行或列中,它们可能具有不同的排名 最大排名应尽可能小

假设给定的 5X5 矩阵为:

18, 25, 7, 11, 11
33, 37, 14, 22, 25
29, 29, 11, 14, 11
25, 25, 14, 14, 11
29, 25, 14, 11, 7

预期的输出是:

3, 4, 1, 2, 2
6, 7, 3, 4, 5
5, 5, 2, 3, 2
4, 4, 3, 3, 2
5, 4, 3, 2, 1

如何用 Python 或任何编程语言编写此代码,或者解决此问题的算法是什么?

【问题讨论】:

【参考方案1】:

尝试使用这个嵌套列表推导:

print([[sorted(set(i)).index(x) + 1 for x in i] for i in l])

输出:

[[3, 4, 1, 2, 2], [4, 5, 1, 2, 3], [3, 3, 1, 2, 1], [3, 3, 2, 2, 1], [5, 4, 3, 2, 1]]

【讨论】:

【参考方案2】:

从 Faruk Hossain 的回答中汲取灵感。您可以从创建元组开始。

    为每个元素创建一个包含 (value, row_number, col_number) 的元组,并将它们存储在一个列表中。

    按值升序对元组进行排序

    现在基于每个元组的值进行迭代,从已经排名的元素(即值

    还要注意,如果行和列的最大值恰好都等于当前元素的值,我们需要做一个额外的步骤,我们需要递归更新元素的等级相等。

为了表示第四步的重要性,取矩阵

3 2 4 5 1 3 2 6 4

在这里,如果我们先填充底部 4,那么如果我们将其排名为 3,但接下来当我们将顶部行 4 排名为 4 时,我们会遇到矛盾。

时间复杂度 - O(n^4)

【讨论】:

【参考方案3】:

你可以用不同的方式来做到这一点。 我提供了一种简单的方法来做到这一点。

步骤:

    为每个元素创建一个包含 (value, row_number, col_number) 的元组,并将它们存储在一个列表中。 按值升序对元组进行排序 遍历列表。在每次迭代中,您都会得到一个tuple。对于每个tuple,现在您拥有该值的rowcolumn 编号。我们将排名这个位置(row, col)。迭代到当前的rowcolumn 并找到该行和列的 最大值 值。现在,当前位置的排名将在特定row and column + 1 (或在某些情况下为 0)之间最大你可以维护两个数组来优化这个搜索。 按照前面的步骤,直到我们完成所有元素的任务。

我在一次软件工程面试中被问到这个问题。

【讨论】:

以上是关于根据行和列对矩阵中的所有元素进行排名的主要内容,如果未能解决你的问题,请参考以下文章

对矩阵按行和按列进行排序

如何删除 C++ 给定矩阵中的特定行和列?

在MATLAB中,如何找出矩阵的非零元素。并且输出它所在的行和列。只要非零就为真。输出1。。

在MATLAB中,如何找出矩阵的非零元素。并且输出它所在的行和列。只要非零就为真。输出1。。

查找矩阵最小元素的 2 个或多个索引(行和列)

从 Java 中的二维数组矩阵中获取行和列