逻辑矩阵....解决方案

时间:2010-04-16 04:45:13

标签: language-agnostic matrix

假设你有一个NxN矩阵,你必须检查它是否是一个上对角矩阵。有没有通用的方法来解决这个问题?

我正在详细阐述我的问题: 有些事情是这样的: 假设您的NXN矩阵的值为N = 4 矩阵将如下所示:

|5 6 9 2|
|1 8 4 9|
|5 8 1 6|
|7 6 3 2|

它是一个4X4方阵,如果它是上三角矩阵,它将看起来像这样:

|5 6 9 2|
|1 8 4 0|
|5 8 0 0|
|7 0 0 0|

我需要用任何语言生成一个通用程序来检查方形矩阵是否是上方跟踪。

3 个答案:

答案 0 :(得分:1)

如果您想要一个简单的解决方案(使用基于1的索引):

def isUpperDiag(matrix[][]):
    if matrix.height != matrix.width:
        return false                      # must be square
    if matrix.height == 1:
        return true                       # not sure how to treat 1x1
    for row = 2 to matrix.height:
        for col = matrix.width - row + 2 to matrix.width:
            if matrix[row][col] != 0:
                return false
    return true

这假设左上角允许零。如果没有,你也必须检查一下。

相当简单。在4x4矩阵上,它将行从2到4重复。对于第2行,它将列从4重复到4(包括4和4)。对于第3行,它将列从3迭代到4(包括3和4)。对于第4行,它将列从2到4迭代。

在每个单元格中,它只检查数字是否为零。如果没有,它不是左上角三角形。如果检查的所有单元格都为零,那么它就是。

答案 1 :(得分:1)

要检查,这些图中左下角是(1,1),右上角是(n,n)吗? (这不是通常编写矩阵的方式!)。

无论如何,算法都是O(N^2),无论如何,我认为 - 你必须使用{{1>}可能为零的条目 {1}}。你只需要逐步浏览它们,看看它们是否为零 - 当然,你应该以最有效的方式在矩阵中工作,这取决于它是存储在列式还是行式。

另外,你的矩阵是否真的用整数填充,或者你需要检查是否大约为零?

基本上你需要检查

n*(n-1)/2

虽然来自@paxdiablo的角落案例检查是个好主意。

答案 2 :(得分:0)

假设这在你的情况下是可行的,你可以采用经典的空间交易时间策略。

(我假设您使用的是OO语言 - 这个想法也适用于非OO语言,但需要更多的努力来确保同一矩阵的不同表示保持同步)。

不是将矩阵表示为数组(或与该表示一起),而是将其保持为一组非零值?

所以你所代表的是:

|5 6 9 2|
|1 8 4 0|
|5 8 0 0|
|7 0 0 0|

将成为(或也存储为)

1,1=5
1,2=6
1,3=9
...
4,1=7

如果这是可行的,你也可以将这个组分成两个(上下对角线)

所以对于你的第一个矩阵:

|5 6 9 2|
|1 8 4 9|
|5 8 1 6|
|7 6 3 2|

将是:

UpperMap -

1,1=5
1,2=6
1,3=9
...
4,1=7

Lower Map-

2,4=9
3,3=1
...
4,4=2

在这种情况下,您的测试将是“询问下方的hashmap是否为空”。

如上所述,如果你需要在矩阵上做更多的“传统”操作,你可以将它作为一个数组与2-maps一起存储,如果矩阵不是不可变的,你将不得不提供方法改变“细胞”值。

另一个权衡(除了空间)是创建一个新矩阵需要更多的CPU时间。但如果您不经常创建和修改这些并且必须经常测试较低的对角线,那么它是值得的。

更极端的方法:

对于每个矩阵构建一个位图表示(非零单元格为1,零单元格为0)并使用逻辑运算来检查节的“空白”。