Language agnostic 逻辑矩阵。。。。解决方案

Language agnostic 逻辑矩阵。。。。解决方案,language-agnostic,matrix,Language Agnostic,Matrix,假设你有一个NxN矩阵,你必须检查它是否是上对角矩阵。有没有通用的方法来解决这个问题 我正在详细说明我的问题: 有些事情是这样的: 假设有NXN矩阵,其值为N=4 那么矩阵将如下所示: |5 6 9 2| |1 8 4 9| |5 8 1 6| |7 6 3 2| |5 6 9 2| |1 8 4 0| |5 8 0 0| |7 0 0 0| 它是一个4X4的正方形矩阵,如果它是上三角形矩阵,它看起来像这样: |5 6 9 2| |1 8 4 9| |5 8 1 6| |7 6 3 2|

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

我正在详细说明我的问题: 有些事情是这样的: 假设有NXN矩阵,其值为N=4 那么矩阵将如下所示:

|5 6 9 2|
|1 8 4 9|
|5 8 1 6|
|7 6 3 2|
|5 6 9 2|
|1 8 4 0|
|5 8 0 0|
|7 0 0 0|
它是一个4X4的正方形矩阵,如果它是上三角形矩阵,它看起来像这样:

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

我需要用任何语言生成一个通用程序,以检查平方矩阵是否为上列。

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

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

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

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

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

在任何情况下,算法都是
O(N^2)
不管怎样,我认为--您必须对
N*(N-1)/2中的所有
N*(N-1)/2
行>列中可能为零的条目做些什么。您只需逐步遍历它们,看看它们是否为零——当然,您应该以最有效的方式遍历矩阵,这取决于它是以列为主还是以行为主的方式存储的

另外,你的矩阵是真的充满了整数,还是你需要检查是否接近零

基本上你需要检查一下

for col = 2, n 
   for row = col+1, n
      if matrix(row, col) != 0
         return false
      endif
   endfor
endfor

尽管@paxdiablo的角落案例检查是个好主意。

假设这在您的案例中是可行的,您可以选择以时间换取空间的经典策略

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

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

因此,您所代表的是:

|5 6 9 2|
|1 8 4 0|
|5 8 0 0|
|7 0 0 0|
将成为(或存储为)

如果这是可行的,您还可以将此集合分成两部分(上对角线和下对角线)

因此,对于第一个矩阵:

|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-映射一起存储为数组,如果矩阵不是不变的,则必须提供更改“单元格”值的方法

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

更极端的方法是:


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

您是否在寻找除O(n**2)之外的其他简单解决方案,即检查所有较低的条目是否为0?我已编辑了我的问题,请看一看!不,这不是家庭作业,我为人工智能算法工作。我需要以最好的方式解决这个问题,高度优化。这对我的项目很有帮助,如果你有什么想法请告诉我。。提前感谢…我并不完全明白为什么这是“社区维基”。这是一个普遍的问题吗?