根据行和列对矩阵中的所有元素进行排名
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
,现在您拥有该值的row
和column
编号。我们将排名这个位置(row, col)
。迭代到当前的row
、column
并找到该行和列的 最大值 值。现在,当前位置的排名将在特定row and column
+ 1 (或在某些情况下为 0)之间最大。 你可以维护两个数组来优化这个搜索。
按照前面的步骤,直到我们完成所有元素的任务。
我在一次软件工程面试中被问到这个问题。
【讨论】:
以上是关于根据行和列对矩阵中的所有元素进行排名的主要内容,如果未能解决你的问题,请参考以下文章
在MATLAB中,如何找出矩阵的非零元素。并且输出它所在的行和列。只要非零就为真。输出1。。