以不同顺序遍历 3D 数组

2023-12-27

我有一个 3D 节点数组,我想通过从数组的中间节点开始,并向角落移动来遍历它......就像这样

and So on ... but for visualization purposes I've shown in 2D but actually it is 3D, so when we move away we will creating a Cube on every even iteration and creating a sphere on every odd iteration. but enter image description here

It will look like in 3D as enter image description here

希望我已经以最好的方式陈述了我的问题...请帮助我构建一个算法,我已经尝试了很多,但没有找到正确的路径...我熟悉 C,C++,C# ,JAVA,所以如果我能用这些语言得到答案,我将不胜感激,否则只需分享我将实现它的算法......

EDITED:

下一次迭代


其工作方式是创建一个图表,其中每个单元格都是一个节点。由于图具有立方体的形状,因此每个节点必须有到其 X、Y 和 Z 邻居的链接。第一个要做的事情是通过向程序提供邻居节点之间的关系来创建图。例如,我们应该给程序一个输入,说明节点 0 连接到节点 1,等等……在告诉程序节点如何连接以形成立方体之后,很容易开始考虑遍历该图。一种流行的图遍历算法称为广度优先遍历(BFT),该算法允许以分布式方式遍历节点。例如,如果你有一棵树,它是一种图,使用 BFT 遍历它会首先打印根,然后一次打印每个级别,所以它是一种从起点遍历树的方式,在所有节点中公平传播分支机构。在您从中间开始到角落遍历立方体的示例中,这正是 BFT 可以为您做的事情。在这种情况下,BFT将从中间开始并开始逐面遍历节点,并且由于我们是从中间点开始,因此传播将呈球形。

什么是拜占庭容错
BFT 需要使用一种称为队列的数据结构,它是先进先出列表。首先,我们向队列提供起点,并将其标记为已访问,这意味着它已进入队列,并且不允许在遍历中的任何时间进入。然后我们将应用一个进程来轮询头节点,将其标记为已访问,并提供其未访问的邻居。一遍又一遍地执行相同的过程,直到所有节点都被访问,因此队列为空。我们这里使用队列的原因是为了允许节点以平衡的方式遍历。在此立方体遍历程序中,提供中间节点后,将从队列中轮询它并提供其 6 个邻居(在 >= 3x3x3 立方体的情况下)。然后,每个邻居节点将按进入顺序进行轮询,并且它们的邻居将在队列末尾提供。进程继续运行,直到没有未访问过的邻居为止。

代码解释:
首先我们需要知道立方体的大小。 3x3x3 的立方体意味着我们应该创建 27 个节点。我创建了一个名为generateCubeGraph()它将生成输入字符串来告知程序邻居节点之间的关系。此方法的返回输出示例:

27 54
0 1
0 3
0 9
1 2
1 4
1 10
etc..

前两个值分别是节点数和邻居节点之间的链接/边的数量。其余的线是节点之间的连接。例如,第一行告诉节点 0 连接到节点 1,等等...请注意,这是一个无向图,因此当程序存储节点之间的链接时,它存储从节点 x 到节点 y 以及从节点 y 到节点 x。
生成输入后,build()方法将把节点之间的链接存储在邻接列表中。创建另一个数组来计算为每个节点创建了多少条边。
存储链接后,我们需要做的就是使用 BFT 算法遍历立方图。检查上面关于它如何工作的描述,并阅读实现以更好地了解它如何工作。
打印方法是可选的,它们有助于实现和描述代码如何工作。

下图显示了我如何对 3x3x3 节点立方体中的节点进行编号。此外,我还添加了一个示例来展示节点如何链接到其 X、Y 和 Z 邻居(在图片底部)。

下面是 JAVA 中 3 x 3 x 3 节点的立方体的代码:(您可以通过修改 sideNode 变量来更改每边的节点数)

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();
        }
    }
}

Output

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 

验证其在 3D 中如何工作的链接(您必须按照节点处理顺序对节点进行着色,并且可以通过查看每个节点编号位置的层输出来获取节点编号):

5 x 5 x 5 立方体的 3D 模型 https://tinkercad.com/things/5hMvum5NFgI

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以不同顺序遍历 3D 数组 的相关文章

  • C++ 通过引用传递动态分配的二维数组

    这个问题是基于之前提出的问题而提出的 通过已知大小的引用多维数组传递 https stackoverflow com questions 529109 c pass by reference multidimensional array w
  • 计算序列而无法存储值?

    问题陈述 here http www spoj com problems EC SER 令 S 为无限整数序列 S0 a S1 b Si Si 2 Si 1 对于所有 i gt 2 你有两个整数 a 和 b 您必须回答有关序列中第 n 个元
  • 如何在 PHP 中比较两个数组并列出差异?

    我正在构建一个表单来执行以下操作 打印从 MySQL 获取的用户和权限表 用户拥有的每一项权限都是一个复选框 而他们缺少的每一项权限都是一个未选中的复选框 允许管理员选中和取消选中复选框以授予或删除权限 提交表单后 显示一个确认页面 其中仅
  • 通过链接导航多个对象而不重复

    我正在尝试浏览一堆带有其他对象链接的对象 我想从 id 1 开始并浏览每个对象 有些对象会循环回到之前的对象 所以我想确保每个对象只查看一次 否则我会陷入无限循环 我还希望能够通过链接导航来判断哪些对象无法访问 我认为导航顺序并不重要 这是
  • 大 ר 符号到底代表什么?

    我真的很困惑大 O 大 Omega 和大 Theta 表示法之间的区别 我知道大 O 是上限 大 Omega 是下限 但是大 theta 到底代表什么 我读过这意味着紧束缚 但是 这是什么意思 首先我们来了解一下什么是大O 大Theta和大
  • Java 中旅行商问题的暴力算法

    我正在学校的数学课上做一个项目 我选择做旅行商问题 这是我一直想进行更多研究的问题 但是 我的暴力求解算法遇到了问题 请前往底部更新查看最新版本代码 如果您知道旅行推销员问题是什么 请跳过本段 尽可能概括地说 TSP 是这样的 您是一名推销
  • 如何发布数组多维角度js

    我在 angularjs 中有一个数组 示例如下 scope order qty 20 scope order adress Bekasi scope order city Bekasi 这个数组可以用这个代码发布 http method
  • 动态二维数组非连续内存C++

    假设我将二维数组的地址及其二维数组的行和列传递给函数 该函数会将二维数组的地址视为一维数组 例如 int Matrix 如果我执行下面的代码 int arr arr new int row for int i 0 i lt row i ar
  • 对 Java 中 *any* 类的所有实例进行全排序

    我不确定以下代码是否能确保 Comparator 的 Javadoc 中给出的所有条件 class TotalOrder
  • PHP 数组到 JavaScript 数组

    假设我在 php 中有这个数组 cities array Caracas gt array air gt array 4 3 5 Working Days Saturday sea gt array 18 3 5 Days Wednesda
  • PHP—array_merge_recursive() - 相同键没有数组

    php a php gt data1 tag gt div classes gt 1 2 3 php gt data2 tag gt section classes gt 2 3 4 5 6 php gt result array merg
  • 将数组转换为具有默认值的对象的更简洁方法? (洛达什可用)

    我有一个数组 比如说 a b c 我想将其转换为一个对象 该对象以数组值作为键和我可以设置的默认值 所以如果默认值是true 我希望我的输出是 a true b true c true 下面的代码是否有更简洁的版本来实现此目的 var my
  • JavaScript 中最长的通用前缀

    我正在尝试解决 Leet Code 挑战14 最长公共前缀 https leetcode com problems longest common prefix 编写一个函数来查找字符串数组中最长的公共前缀字符串 如果没有公共前缀 则返回空字
  • 如何构建 if 语句并与各种值进行比较?

    我该怎么写这个if以更好的方式声明条件 if data in 8 downto 1 x 70 or data in 8 downto 1 x 69 or data in 8 downto 1 x 72 or data in 8 downto
  • 在 C 中将字符追加到字符数组

    我想将一个字符附加到代表字符串的字符数组中 我正在使用结构来表示字符串 struct String char c int length int maxLength String realloc弄乱了我的数组 当我打印字符串时 它会从内存中打
  • 使用递归返回嵌套列表中第二小的数字

    我必须归还第二小的使用递归的 python 列表中的数字 以及no loops 我所做的是创建一个辅助函数 它返回列表中 最小 第二小的 值的元组 然后我只取tuple 1 in my second smallest func def s
  • 最小化代表性整数的误差之和

    Given n integers between 0 10000 as D1 D2 Dn where there may be duplicates and n can be huge I want to find k distinct r
  • 如何实现n个元素的查找和插入操作的动态二分查找

    这个想法是使用多个数组 每个长度为 2 k 根据 n 的二进制表示来存储 n 个元素 每个数组都是排序的 不同的数组没有以任何方式排序 在上述数据结构中 SEARCH是通过对每个数组进行一系列二分查找来进行的 INSERT 是通过一系列相同
  • 为什么这两种不同的构造数组的方式会产生不同的行为?

    当我以两种不同的方式构造一个 2 元素数组时 例如a and b 当我将一个元素添加到内部数组之一时 我得到两个不同的结果 这也会发生在append 根据构建每个之后的输出 我希望它们完全相同 julia gt a 2 element Ar
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该

随机推荐

  • 跨浏览器的日期不一致 - MVC 5 模型中的日期

    我在视图模型中有这个 Required Display Name Date of birth DataType DataType Date DisplayFormat DataFormatString 0 dd MM yyyy ApplyF
  • 使用 nx.draw_graphviz 在 python 中的 graphviz 布局中绘制图形会出现错误

    我正在尝试在python的networkx中的graphviz布局中绘制100个节点的多图G 所以到目前为止我做了两次试验 Trial 1 nx draw graphviz https networkx github io document
  • cordova Phonegap 在应用程序中使用外部网页,同时维护页眉/页脚(用于导航)

    到目前为止 我已经尝试过 inappbrowser 和 iframes iframe 可以工作 但我在使用 iframe 的实现中遇到了一些破坏应用程序的错误 是否有一种更类似于本机的解决方案可以在phonegap内显示外部网页 同时仍然保
  • Android 后退按钮无法返回到上一个 Activity

    我有一个有两个活动的应用程序 MainActivity 和 SettingsActivity MainActivity 有一个菜单 其中有一个 设置 菜单项 单击此菜单项时 它会有意启动 SettingsActivity 活动启动后 我单击
  • 如何避免独立android服务中的ANR

    您好 感谢您的帮助 我想将 java 系统移植到 Android 并且我想通过透明的独立服务将其提供给第三方应用程序 因此它将类似于系统库 该系统是一个 VoiceXML 解释器 它将解释由第 3 方应用程序处理的文档并将结果发送回它 这些
  • iPhone4 960x640 - 对应用程序有影响吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何适配iPhone 4不同的屏幕分辨率 https stackoverflow com questions 2992360 how to accommodate for the different
  • 来自 Java 的 CloudFlare(会员)post 请求产生 403 错误

    我正在尝试使用 Spring Boot 应用程序中的 Memberful 对用户进行身份验证 根据会员文档 https memberful com help integrate advanced oauth authorization co
  • Rails -TypeError:无法将 ActionController::Parameters 转换为文本

    我正在开发一个网站 使用 jQuery Preview 来获取任何链接的标题 描述或 favction url jQuery 预览 https github com embedly jquery preview https github c
  • 从多个 MPI 输出组成 VTK 文件

    对于盖驱动腔 CFD 的格子玻尔兹曼模拟 我将立方域分解为 也是立方 8 个子域 这些子域按 8 个等级独立计算 每个 MPI 等级都会为每个时间步生成一个 VTK 文件 并且由于我使用的是 ParaView 所以我希望将整个事物可视化为一
  • 直播视频延迟

    尝试确定造成延迟的 最大 原因 我的视频从编码器到服务器的往返行程 然后返回到浏览器中的播放器 我现在和我喜欢的球员的距离大约是 12 秒 它在我的播放器中缓冲吗 FMLE 退出时缓冲 我问的原因是我觉得我已经通过下面概述的小测试场景消除了
  • 使用 CSS 在嵌套 div 上重复一组颜色

    我有一组四种颜色 我想将它们应用到嵌套的 div 所以接下来的每个孩子都有不同的颜色 如果有第五层嵌套 我想从第一种颜色开始 并继续进行 即使我有无限深的嵌套 这是否可以仅使用 CSS 选择器来完成 避免 JavaScript 我目前陷入了
  • 如何在没有证书的情况下将 HTTPS 请求重定向到 HTTP (Apache VirtualHosts) 并避免证书警告

    我首先想说 这不是一个好的做法 我们应该努力让所有内容 100 都在 HTTPS 上 但在这种情况下 我对不保存敏感信息的系统提出了一系列尴尬的要求 当我还是初级学生的时候 当我问这个问题时 我对 HTTPS TLS 的工作原理一无所知 但
  • 使用CSS更改当前页面的链接颜色

    当前页面的一种样式链接与其他样式有何不同 我想交换文本和背景的颜色 li a color A60500 li a hover color 640200 background color 000000 ul li class a a href
  • 如何在ANTLR4中实现错误处理

    我有以下语法用于解析应用于图形的一阶逻辑公式 grammar Graph PARSER RULES input formula EOF formula TRUE FALSE formula AND formula formula OR fo
  • 搭建 dbcontext 时出现不明确的列名“name”错误

    我正在尝试从现有数据库构建脚手架 但该数据库有多个具有多个模式的表 并且某些表具有相同的名称但在不同的模式中 我 认为 这是我的问题的根源 我想知道您是否已经遇到过类似的情况吗 例如mySchema1 contacts and mySche
  • 如何从字符串中查找斜杠出现的次数

    如何使用 Excel VBA 宏查找字符串中正斜杠字符 的出现次数 老问题 但我想我会通过在 Excel 论坛上找到的答案来提高答案的质量 显然计数也可以使用找到 count Len string Len Replace string 答案
  • NodeJS:如何从文件中读取(最多)前 N 个字节?

    在 NodeJS 中 从文件中最多读取前 N 个字节的简洁 健壮且优雅的方法是什么 如果数据较少 那么我不希望抛出错误 如果有更多数据 那么我不希望将其读入内存 理想情况下无需安装外部软件包 也许涉及自 NodeJS 12 以来似乎是新的
  • 服务器在rails 3生产环境中找不到公用文件夹

    我正在使用最新的 Rails 3 beta 该应用程序在开发模式下工作正常 但是当我通过以下方式在生产模式下启动服务器时rails server e production 似乎public找不到文件夹 我收到如下错误消息 ActionCon
  • 在PHP中接收UDP数据包数据报

    我正在用 php 为 GPS 跟踪系统构建监听服务器 GPS 通过 UDP 数据包发送数据 我可以通过运行以下脚本来显示数据 然而 实际数据以符号形式出现 所以我猜我错过了转换 Reduce errors error reporting E
  • 以不同顺序遍历 3D 数组

    我有一个 3D 节点数组 我想通过从数组的中间节点开始 并向角落移动来遍历它 就像这样 and So on but for visualization purposes I ve shown in 2D but actually it is