Arrays 不同顺序的三维数组遍历
我有一个3D的节点数组,我想从数组的中间节点开始遍历它,然后移动到角落。。。像这样 等等。。。但为了可视化的目的,我在2D中展示了,但实际上它是3D的,所以当我们离开时,我们会在每一次偶数迭代中创建一个立方体,在每一次奇数迭代中创建一个球体。但是 它看起来就像在3D中一样 希望我已经用最好的方式表达了我的问题。。。请帮助我建立一个算法,我已经尝试了很多,但没有得到正确的路径。。。我熟悉C、C++、C、java,所以如果能用这些语言得到答案,我会很感激,否则,只需共享算法,我就可以实现它…p> 编辑: 下一次迭代Arrays 不同顺序的三维数组遍历,arrays,algorithm,multidimensional-array,3d,Arrays,Algorithm,Multidimensional Array,3d,我有一个3D的节点数组,我想从数组的中间节点开始遍历它,然后移动到角落。。。像这样 等等。。。但为了可视化的目的,我在2D中展示了,但实际上它是3D的,所以当我们离开时,我们会在每一次偶数迭代中创建一个立方体,在每一次奇数迭代中创建一个球体。但是 它看起来就像在3D中一样 希望我已经用最好的方式表达了我的问题。。。请帮助我建立一个算法,我已经尝试了很多,但没有得到正确的路径。。。我熟悉C、C++、C、java,所以如果能用这些语言得到答案,我会很感激,否则,只需共享算法,我就可以实现它…p
我很想做最明显的事情:一个连通图(可以通过数组位置隐式表示)和一个bucket排序 在每次迭代中,从编号最高的存储桶中提取任意单元格。对于每个未标记为已处理的邻居,将其从当前存储桶中移除,并插入到上一个存储桶中。然后将该单元格标记为已处理,并将其从桶中取出 如果您希望严格从内到外排序,请从编号最高的桶中选择距离中心最近的单元格。如果您要应用此测试,最好将桶中的内容大致有序;感觉就像在每个bucket中保留一个有序列表,再加上一个尚未插入到有序列表中的单元格列表,然后只在最后的合并步骤中使用已知的有序列表进行即时合并排序,这将是最明智的做法
我是否正确地理解了这个问题?其工作方式是创建一个图形,其中每个单元格都是一个节点。由于图形具有立方体的形状,因此每个节点都必须有到其X、Y和Z邻居的链接。要做的第一步是通过向程序提供相邻节点之间的关系来创建图形。例如,我们应该给程序一个输入,说明节点0连接到节点1,等等。。。在告诉程序如何连接节点以形成立方体后,很容易开始考虑遍历此图。一种流行的图遍历算法称为广度优先遍历(BFT),该算法允许以分布式方式遍历节点。例如,如果有一棵树,这是一种图,使用BFT遍历它将首先打印根,然后一次打印每个级别,因此它是从起点开始遍历树,在所有分支中公平传播。在您的示例中,从中间到角落遍历立方体正是BFT可以为您做的。在这种情况下,BFT将从中间开始,并开始逐面遍历节点,因为我们是从中间点开始,传播将呈现球形 什么是BFT
BFT需要使用名为Queue的数据结构,它是一个先进先出列表。首先,我们向队列提供起始点,并将其标记为已访问,这意味着它已进入队列,并且在稍后的遍历中不允许进入。然后,我们将应用一个proceeder来轮询头部节点,将其标记为已访问,并提供其未访问的邻居。同样的过程会一次又一次地执行,直到访问了所有节点,因此队列为空。我们在这里使用队列的原因是允许以平衡的方式遍历节点。在这个多维数据集遍历程序中,提供中间节点之后将从队列中轮询出来,并提供其6个邻居(在>=3x3x3多维数据集的情况下)。然后,将按入口顺序轮询这些邻居节点中的每一个,并在队列末尾提供它们的邻居。进程继续运行,直到没有未访问的邻居离开 代码解释:
首先我们需要知道立方体的大小。一个3x3x3的立方体意味着我们应该创建27个节点。我创建了一个名为
generateCeagraph()
的方法,该方法将生成输入字符串以通知程序相邻节点之间的关系。此方法的返回输出示例:
27 54
0 1
0 3
0 9
1 2
1 4
1 10
etc..
前两个值分别是节点数和相邻节点之间的链路/边数。其余的线是节点之间的连接。例如,第一行表示节点0连接到节点1,等等。。。请注意,这是一个无向图,因此当程序存储节点之间的链接时,它将从节点x存储到节点y,并从节点y存储到节点x生成输入后,
build()
方法将节点之间的链接存储在邻接列表中。创建另一个数组以计算为每个节点创建了多少条边存储链接后,我们需要做的就是使用BFT算法遍历立方体图。查看上面关于其工作原理的描述,并阅读实现以了解其工作原理。
打印方法是可选的,它们有助于实现和描述代码的工作方式 下图显示了我如何在一个由3x3个节点组成的立方体中对节点进行编号。此外,我还添加了一个示例来演示节点如何链接到其X、Y和Z邻居(在图片底部) 以下是JAVA中3x3x3节点立方体的代码:(您可以通过修改sideNode变量来更改每侧的节点数) 链接以验证其在3D中的工作方式(必须按节点处理顺序为节点着色,并且可以通过查看每个节点编号位置的图层输出来获得节点编号):
+1因为它看起来很有趣,但我真的不知道应该如何从中心开始遍历它。你能展示一下构建5x5网格后的下一步吗。2D可视化足以理解这个问题。是的,兄弟,这是als
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
/**
* Driver class: Build, traverse, print linkage
*/
public class CubeDriver {
public static void main(String[] args) {
// How many nodes per side
int sideNodes = 3;
Cube cube = new Cube();
cube.build(cube.generateCubeGraph(sideNodes));
System.out.println("Node execution order: ");
cube.BFT();
System.out.println("Nodes links:");
dcube.printAL();
System.out.println("Nodes on Layers:");
cube.printLayers(sideNodes);
}
}
/**
* Cube creator
*/
class Cube{
// Adjacency list (Hold node's neighbors)
int al[][];
// Degree array (Count how many neighbor per node)
int dl[];
int NODES;
int EDGES;
int MAX_LINKS = 6; // No node can have more than 6 links in all case
/**
* Create the links between nodes based on the input generated by generateCubeGraph() mehtod
*/
public void build(String input){
Scanner scan = new Scanner(input);
// Get #Nodes and #Edges
NODES = scan.nextInt();
EDGES = scan.nextInt();
// Initialize 2D Array and Degree array
al = new int[NODES][MAX_LINKS];
dl = new int[NODES];
// Store the link between nodes
for(int i=0; i<EDGES; i++){
int node1, node2;
node1 = scan.nextInt();
node2 = scan.nextInt();
int node1Neighbors = dl[node1]++;
int node2Neighbors = dl[node2]++;
al[node1][node1Neighbors] = node2;
al[node2][node2Neighbors] = node1;
}
}
/**
* Traverse using Breadth first traversal method
* Plug the middle node in a queue, then poll it and put it's neighbor, then poll each neighbor and put their neighbors if not visited already
*/
public void BFT(){
int visited[] = new int[NODES];
Queue<Integer> q = new LinkedList<Integer>();
int VISITED = 1;
// Plug the center node
int middle = NODES/2;
q.offer(middle);
visited[middle] = VISITED;
while(!q.isEmpty()){
int polledNode = q.poll();
System.out.print(polledNode + " ");
for(int i=0; i < dl[polledNode]; i++){
int neighbor = al[polledNode][i];
if(visited[neighbor] != VISITED){
q.offer(neighbor);
visited[neighbor] = VISITED;
}
}
}
System.out.println("\n");
}
/**
* Input generator for a cube
*/
public String generateCubeGraph(int n){
int SIDE = n; // Number of nodes in one side of the cube
String links = ""; // Holds the final output
int link = 0; // Counts the number of links
for(int row=0; row<SIDE; row++){
for(int col=0; col<SIDE; col++){
for(int depth=0; depth<SIDE; depth++){
int current = depth + (col * SIDE) + (row * SIDE * SIDE);
// If not last depth
if(depth != SIDE-1){
links += String.format("%d %d\n", current, current+1);
link++;
}
// If not last col
if(col != SIDE-1){
links += String.format("%d %d\n", current, current+SIDE);
link++;
}
// If not last row
if(row != SIDE-1){
links += String.format("%d %d\n", current, current+(SIDE*SIDE));
link++;
}
}
}
}
// return #Nodes, #Edges, links ...
return String.format("%d %d\n%s", SIDE*SIDE*SIDE, link, links);
}
/**
* Prints the links between each nodes. Used for debugging only
*/
public void printAL(){
for(int node = 0; node < NODES; node++){
System.out.print(String.format("Node %3d linked to nodes: ", node));
for(int neighbor = 0; neighbor < dl[node]; neighbor++){
System.out.print(String.format("%3d ", al[node][neighbor]));
}
System.out.println();
}
System.out.println();
}
/**
* Print 3D layers nodes number
* */
public void printLayers(int sideNode){
for(int layer=0; layer<sideNode; layer++){
System.out.println("Layer: " + layer);
for(int row = 0; row < sideNode; row++){
for(int col = 0; col < sideNode; col++){
int current = layer + (col * sideNode) + (row * sideNode * sideNode);
System.out.print(String.format("%3d ", current));
}
System.out.println();
}
System.out.println();
}
}
}
Node execution order:
13 4 10 12 14 16 22 1 3 5 7 9 11 19 15 21 17 23 25 0 2 6 8 18 20 24 26
Nodes links:
Node 0 linked to nodes: 1 3 9
Node 1 linked to nodes: 0 2 4 10
Node 2 linked to nodes: 1 5 11
Node 3 linked to nodes: 0 4 6 12
Node 4 linked to nodes: 1 3 5 7 13
Node 5 linked to nodes: 2 4 8 14
Node 6 linked to nodes: 3 7 15
Node 7 linked to nodes: 4 6 8 16
Node 8 linked to nodes: 5 7 17
Node 9 linked to nodes: 0 10 12 18
Node 10 linked to nodes: 1 9 11 13 19
Node 11 linked to nodes: 2 10 14 20
Node 12 linked to nodes: 3 9 13 15 21
Node 13 linked to nodes: 4 10 12 14 16 22
Node 14 linked to nodes: 5 11 13 17 23
Node 15 linked to nodes: 6 12 16 24
Node 16 linked to nodes: 7 13 15 17 25
Node 17 linked to nodes: 8 14 16 26
Node 18 linked to nodes: 9 19 21
Node 19 linked to nodes: 10 18 20 22
Node 20 linked to nodes: 11 19 23
Node 21 linked to nodes: 12 18 22 24
Node 22 linked to nodes: 13 19 21 23 25
Node 23 linked to nodes: 14 20 22 26
Node 24 linked to nodes: 15 21 25
Node 25 linked to nodes: 16 22 24 26
Node 26 linked to nodes: 17 23 25
Nodes on Layers: // Check the picture above to know what the below layers are.
Layer: 0
0 3 6
9 12 15
18 21 24
Layer: 1
1 4 7
10 13 16
19 22 25
Layer: 2
2 5 8
11 14 17
20 23 26