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

时间:2019-07-18 05:54:57

标签: python matrix

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

  1. 排名应从1开始
  2. 应为同一行或同一列中的相同元素提供相同的排名
  3. 如果相同元素根据其特定的行或列排名位于不同的行或列中,则它们可能具有不同的排名
  4. 最高等级应尽可能小

假设给定的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或任何编程语言编写此代码,或者解决该问题的算法是什么?

3 个答案:

答案 0 :(得分: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]]

答案 1 :(得分:0)

您可以用不同的方法来做。 我提供了一种简单的方法。

步骤:

  1. 为每个元素创建一个具有(值,行编号,列编号)的元组并将其存储在列表中。
  2. 按值升序排列元组
  3. 遍历列表。在每次迭代中,您将得到一个tuple。现在,对于每个tuple,您都有该值的rowcolumn号。然后,我们将排名(row, col)。迭代到当前的rowcolumn并找到该行和该列的 maximum 值。现在,当前职位的排名将在该特定row and column + 1 (在某些情况下为 0 )之间最高您可以维护两个数组以优化搜索
  4. 按照前面的步骤进行操作,直到完成所有元素的任务为止。

在软件工程采访中有人问我这个问题。

答案 2 :(得分:0)

从法鲁克·侯赛因的答案中汲取灵感。您可以从创建元组开始。

  1. 为每个元素创建一个具有(值,行编号,列编号)的元组,并将它们存储在列表中。

  2. 按值升序对元组进行排序

  3. 现在基于每个元组的值进行迭代,从已排名的元素(即value <= current value的元素)中的d列中找到最大排名的元素,现在将当前元素的值固定为这两个数的最大值,如果最大值不等于当前元素,则加1。

  4. 还请注意,如果行和列的最大值都恰好等于当前元素的值,那么我们需要执行一个附加步骤,我们需要递归更新等于的元素等级。

要表示第四步的重要性,请采用矩阵

3 2 4
5 1 3
2 6 4

在这里,如果我们首先填充底部4,然后将其排名为3,但是接下来将顶部4排名为4,则会产生矛盾。

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