Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何快速修改稀疏表?_Algorithm_Dynamic Programming_Sparse Matrix - Fatal编程技术网

Algorithm 如何快速修改稀疏表?

Algorithm 如何快速修改稀疏表?,algorithm,dynamic-programming,sparse-matrix,Algorithm,Dynamic Programming,Sparse Matrix,我的问题如下: 对于表a(MxN) 表的行从0到M-1进行编号,表的列从0到N-1进行编号。行i和列j的交点称为单元(i,j)。表格的单元格(i,j)包含a[i][j](>0)的点数 假设机器人在盒子里(i,j)。移动一次,机器人将从此单元格移动到列(j+1)%N中最大的3个单元格,行坐标为(i-1)%M、i和(i+1)%M。 *最初,机器人在盒子里(0,0) 有两种操作: ● 移动k:告诉机器人移动k(1)每个条目都有一个脏标志如何?当您遇到更改时,请使所有变为无效的条目无效。当您计算解决方案

我的问题如下:

对于表a(MxN) 表的行从0到M-1进行编号,表的列从0到N-1进行编号。行i和列j的交点称为单元(i,j)。表格的单元格(i,j)包含a[i][j](>0)的点数

假设机器人在盒子里(i,j)。移动一次,机器人将从此单元格移动到列(j+1)%N中最大的3个单元格,行坐标为(i-1)%M、i和(i+1)%M。

*最初,机器人在盒子里(0,0)

有两种操作:


● <代码>移动k:告诉机器人移动k(1)每个条目都有一个脏标志如何?当您遇到
更改时,请使所有变为无效的条目无效。当您计算解决方案时,请重新计算所有脏的条目?顺便问一下,为什么您的矩阵稀疏?在我看来非常密集。我同意@NicoSchertler的观点,即矩阵看起来并不稀疏。也许您可以提供e该程序在N、M、Q和总时间上的限制?我认为有一个更简单的解决方案,在O(QNM)中运行:通过直接修改O(1)中的矩阵来执行更新,对于移动,请天真地执行这些操作,直到您点击本次漫游中已经访问过的单元格,该单元格给出了周期L的长度,然后取K%L并转到该周期中处于(K%L)位置的单元格。如果您最终访问了漫游中的每个单元格,则这是O(NM)最坏的情况。如果O(QNM)如果足够快,我可以更详细地解释这一点。我知道稀疏表是一个衰变表,分解段或间隔,以便能够以很高的复杂性回答每个问题。但我想知道的是,在我们创建这样一个稀疏表之后,每当有变化因素时,我们能否快速修改该表?因此我给出了一个答案我需要你的帮助来改进或想出一个好的解决方案。谢谢!@eldar我想读你的解决方案!每个条目都有一个脏标志怎么样?当你遇到一个
更改
,使所有无效的条目无效。当你计算解决方案时,重新调用计算所有脏的条目?顺便说一句,为什么你的矩阵稀疏?在我看来非常密集。我同意@NicoSchertler的观点,即矩阵看起来并不稀疏。也许你可以提供N,M,Q的限制,以及这个程序执行的总时间?我想有一个更简单的解决方案,以O(QNM)为单位运行:通过直接修改O(1)中的矩阵来执行更新,对于移动,请天真地执行更新,直到您点击本次行走中已访问过的单元格,这将给出循环L的长度,然后取K%L并转到此循环中位于(K%L)位置的单元格。这是O(NM)最坏的情况是,如果您在步行时访问了每个单元。如果O(QNM)如果足够快,我可以更详细地解释这一点。我知道稀疏表是一个衰变表,分解段或间隔,以便能够以很高的复杂性回答每个问题。但我想知道的是,在我们创建这样一个稀疏表之后,每当有变化因素时,我们能否快速修改该表?因此我给出了一个答案n的例子,并谈到了我的蛮力想法,我需要你的帮助来改进或提出一个好的解决方案。谢谢!@eldar我想阅读你的解决方案!
input
----------------
3 4
10 20 30 40
50 60 70 80
90 93 95 99
3
move 4
change 1 0 100
move 4
-----------------
output
-----------------
2 0
1 0
for (int k = 1; k <30; k ++) {
        for (int i = 0; i <m; i ++)
            for (int j = 0; j <n; j ++) {
                nxt (i, j, k) = nxt (nxt (i, j, k-1), k-1);
            }
    }
for (int i = 0; i <30; i ++) {
        if (x >> i & 1) {
            now = nxt (now, i);
        }
    }