Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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 - Fatal编程技术网

Algorithm 用平面向量表示的栅格扫描(遍历)

Algorithm 用平面向量表示的栅格扫描(遍历),algorithm,Algorithm,我有一个用平面向量表示的网格,即: ------------- | 6 | 7 | 8 | ------------- | 3 | 4 | 5 | ------------- | 0 | 1 | 2 | ------------- 我使用从0到grid.size()-1的索引访问元素。我想实现快速扫描方法。该方法的主要目的是进行扫描,即在特定方向上进行网格遍历。对于2D情况: 扫掠1:右上角 for [row = 0 : nrows-1] for [col = 0 : ncols-1]

我有一个用平面向量表示的网格,即:

-------------
| 6 | 7 | 8 |
-------------
| 3 | 4 | 5 |
-------------
| 0 | 1 | 2 |
-------------
我使用从0到
grid.size()-1的索引访问元素。我想实现快速扫描方法。该方法的主要目的是进行
扫描
,即在特定方向上进行网格遍历。对于2D情况:

扫掠1:右上角

for [row = 0 : nrows-1]
    for [col = 0 : ncols-1] --> Result: 0 1 2 3 4 5 6 7 8
扫掠2:左上角

for [row = 0 : nrows-1]
    for [col = ncols-1 : 0] --> Result: 2 1 0 5 4 3 8 7 6
扫掠3:右下角

for [row = nrows-1 : 0]
    for [col = 0 : ncols-1] --> Result: 6 7 8 3 4 5 0 1 2
扫掠4:左下角

for [row = nrows-1 : 0]
    for [col = ncols-1 : 0] --> Result: 8 7 6 5 4 3 2 1 0 
然后计算
idx=row*ncols+col

这种实现非常简单,而且在为
循环嵌套
时,它也可以推广到
n
维度。但是,我正在研究一个n维实现,我试图将其概括为两个循环:

while (keepSweeping)
    ++sweep;
    for (idx = init, idx == end, idx += inc)
         // Traverse the grid
计算
init
end
inc
非常具有挑战性。另外,
inc
依赖于
ncol
并动态变化。例如,对于扫描2
inc=-1
,但是每
ncols
inc=-1+2*ncols
,所以我实现从0到5

关于如何做有什么帮助吗?我首先关注2D案例

编辑:我看到这些线程建议递归地实现循环。既然我在寻找最佳表现,你认为这是个好主意吗


谢谢大家!

好的,这是我在2D案例中尝试回答您的问题的方法,只使用一个循环。希望这与您想要的不会太远:

//****初始化******
int ncols=4;//列数
int nrows=3;//行数
布尔右=真;//横轴上的扫描方向
布尔top=true;//垂直轴上的扫掠方向
int计数器=0;//探索的职位数量
如果(右){
共畸胎体=0;
}
否则{
共畸胎体=ncols-1;
}
如果(顶部){
行迭代器=0;
}
否则{
行迭代器=nrows-1;
}
//*******连续条件******
while(计数器!=nrows*ncols){
//做点什么******
System.out.println(行迭代器*ncols+colIterator);
//*******进展阶段******
计数器++;
//我们排完了吗?
如果((计数器%ncols)==0){
如果(顶部){
//我们必须前进
行迭代器++;
}
否则{
//我们得下楼了
行迭代器--;
}
如果(右){
共畸胎体=0;
}
否则{
共畸胎体=ncols-1;
}
}
否则{
//我们还没有完成一行
如果(右){
//我们必须向右移动
协同畸胎器++;
}
否则{
//还是离开
共畸胎体--;
}
}
}
注意:这段代码已经用Groovy进行了测试

一点高层解释:它适用于一个循环,因为在2D中,我们可以找到我们想要做的工作进展的全局度量(这里这个度量是
计数器
变量),并且可以在循环的每次迭代中使用该度量来确定我们是否完成了一行(或者没有)通过使用模运算

我认为,从数学上讲,用一个循环将该算法推广到高维(即2以上),是不可能的,因为没有数学运算符会告诉我们,我们是否已经完成了给定维上的部分工作,并且应该开始处理外维(这里,模数告诉我们必须修改
行迭代器
,因为我们已经到达了网格的边界,但是在维度3或3以上时,要使用什么数学运算符?)


祝你好运,请发布你的发现,这是一个有趣的挑战。

既然我在寻找最高性能,你认为这是个好主意吗?取决于语言和编写递归的方式。但是,只有当你通过测试确定这将成为瓶颈时,担心这一点才有意义。我用C编写代码++,并假设这些帖子是递归的(我不能以其他方式思考)。我同意寻找瓶颈,并不担心这一点……但我将针对其他已经通用的类似方法进行基准测试(它们没有这些扫描)因此,我会在算法中引入一个成本,这不是因为设计,而是因为实现。如果我理解正确,你是在试图找到一个通用算法来处理你描述的各种扫描?我不理解的是,你为什么说你要计算
idx=nrows*ncols+col
。是
col
的作用吗就像这里的迭代器一样?(在你的例子中,nrows=3,ncols=3,所以我们有
idx=9+col
,我想
col
是唯一的变量)我想找到一个通用算法,按照每次扫描所描述的顺序给出索引。是的,对于这个例子,
col
就像一个内部循环迭代器(并且
是outter循环的迭代器)关于索引计算,有一个错误,它是代码> IDX=行*NCOLs + COLL/CODE >。我编辑它,谢谢你捕捉到它。为什么你认为你可以用2个循环来扫描n维网格?我认为你需要n个循环的n维网格,也就是说,每个网格的每个维度和每个循环内都有一个循环。选择方向的测试。感谢您的回复。这看起来不错,但缺少对
top
right
的管理,这也不明显。到目前为止,我通过嵌套循环和限制最大维度数解决了这一问题。这不是一个很好的解决方案,但这个问题似乎比我想象的更复杂呃。你说的“管理
顶部
右侧
”是什么意思?你想让所有的扫描都自动化吗