- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 3D 计算机图形学方面做过一些工作,但对图形有些陌生理论。特别是我一直在寻找并尝试使用深度优先搜索 (DFS),如 Mastering Algors w/Perl (Jarkko埃塔涅米)。到目前为止我还没能得到它:-(但我很确定 DFS是我想要的。
它不必使用 Perl(只是想学习这门语言),但 Java 或 C++ 会很好。
我有 53 个位置向量,即 (x,y,z),我表示为
(x1,y1,z1)
(x2,y2,z2)
.
.
.
(x53,y53,z53)
然后我运行我编写的 Perl 程序来生成随机链接节点,分配一些最大值。跳数,比如 6。所以拓扑可能看起来像这个
5 <-- node 1 has 5 links to
18 4 23 6 48, <-- node 18, node 4, node 23, node 6, node 48
2 <-- node 2 has 2 links to
14 5, <-- node 14, node 5
0 <-- node 3 is a leaf since it has no links
.
.
.
2 <-- node 18 has 2 links to
3 17 <-- node 3, node 17
.
.
.
4 <-- node 53 has 4 links to
10 46 49 22 <-- node 10, node 46, node 49, node 22
我想确定“运行”的路径,直到我碰到一个水槽,即 0。例如节点 1 到节点18 到节点 3,...这条路已经走完了。...
我想我想要DFS;这似乎是一个递归练习。
如果有人理解并可以给我代码,那就太好了。我不是学生,而是 51 岁!也许这与我没有得到这个有关 :-)
我看了看我的 q,出于某种原因(可能是我 :-( 它是“乱码”
拓扑应该是这样的5 <-- 节点 1 有 5 个链接; 18 4 23 6 48 <-- 节点 18、节点 4、节点 23、节点 6、节点 482 <-- 节点 2 有 2 个链接; 14 5, <-- 节点 14, 节点 50 <-- 节点 3 是一片叶子,因为它没有链接...2 <-- 节点 18 有 2 个链接; 3 17 <-- 节点 3,节点 17...4 <-- 节点 53 有 4 个链接; 10 46 49 22 <-- 节点 10、节点 46、节点 49、节点 22
只是想说清楚,以防有人可以提供代码(Perl、Java、c++/C ...)
谢谢。
最佳答案
深度优先搜索的思想是先为您的查询搜索尽可能“深”的内容,然后再遍历整个序列。这很容易从数据树的角度来思考:
搜索将从节点 1 -> 53 开始,搜索顺序为1 -> 18 -> 3 -> 17 -> 4 -> 23 -> 6 -> 48 -> 2 -> 5 -> 14 ....
它转到节点 1,查看它的第一个链接:节点 18,然后是节点 18 的第一个链接节点 3,找到一个没有链接的节点。然后返回以相同的深度级别搜索到节点 17 等。在您的情况下,您只需要到此为止。
下面是Java的完整解决方案,抱歉我不熟悉perl所以我把伪代码逻辑写出来了。
除了存在可能导致无限循环的循环链接的情况外,问题相当简单,因此我添加了一个以前访问过的节点列表并对此进行检查以避免冗余或无限搜索。
depthFirstSearch(node) { // call to search a node
result = depthFirstSearch(node, empty list for previously searched list);
if (the result is null) {
print "No leaf node found"
} else {
"Found: " + result info
}
return result;
}
depthFirstSearch(node, previouslySearchedList) { // method with a list of previously visited nodes
// if the node is null, return null
// add the node to the list of searched nodes
if (// the node has 0 links) {
// we have found a leaf, return it.
} else {
for (each of the links the current node has) {
for (each of the previously searched links) {
if (the current node has been searched) {
set a null return value
break the loop
} else {
set the return value to this node
}
}
// recursively search the next node, passing the previously searched list along
last_node = depthFirstSearch(next,previouslySearchedList);
if (the last recursive call returned a null value move on to the next child) {
break the loop
}
}
return the last node found // could be a null, could be a result.
}
}
这是一个完整的工作解决方案:
class Node {
int default_size = 10;
ArrayList<Node> links = new ArrayList<Node>();
int numberOfLinks = 0;
int x, y, z, index;
public Node(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
this.index = -1;
}
public Node(int x, int y, int z, int index) {
this.x = x;
this.y = y;
this.z = z;
this.index = index;
}
public void addNodeLink(Node node) {
this.links.add(node);
}
public int getIndex() {
return this.index;
}
public int getNumberOfLinks() {
return links.size();
}
public ArrayList<Node> getLinks() {
return this.links;
}
public String getInfo() {
String info = "";
if (index < 0) {
info += "Unindexed node ";
} else {
info += "Node " + index + " ";
}
info += "with " + this.getNumberOfLinks() + " links\n ";
for (int i = 0; i < this.getNumberOfLinks(); i++) {
info += this.getLinks().get(i).getIndex() + " ";
}
return info;
}
public String toString() {
return getInfo();
}
public static Node depthFirstSearch(Node node) {
Node result = depthFirstSearch(node, new ArrayList<Node>());
if (result == null) {
System.out.println("\nNo leaf node found");
} else {
System.out.println("\nFound: " + result);
}
return result;
}
public static Node depthFirstSearch(Node node, ArrayList<Node> searchList) {
if (node == null) { return null; }
searchList.add(node);
if (node.getNumberOfLinks() == 0) {
System.out.println(" -> Node " + node.getIndex());
return node;
} else {
System.out.print((searchList.size() > 1 ? " -> " : "Path: ") + "Node " + node.getIndex());
Node last_node = null, next = null;
int i, j;
for (i = 0; i < node.getNumberOfLinks(); i++) {
for (j = 0; j < searchList.size(); j++) {
if (node.getLinks().get(i).getIndex() == searchList.get(i).getIndex()) {
next = null;
break;
} else {
next = node.getLinks().get(i);
}
}
last_node = depthFirstSearch(next,searchList);
if (last_node != null) {
break;
}
}
return last_node;
}
}
public static void main(String[] args) {
Node[] graph = new Node[53];
// set up your nodes
int randomNum = 0 + (int)(Math.random()*100);
for (int i = 0; i < graph.length; i++) {
randomNum = 0 + (int)(Math.random()*100);
graph[i] = new Node(randomNum,randomNum,randomNum,i+1);
}
System.out.println("Example given in question");
// Example given in question
graph[0].addNodeLink(graph[17]);
graph[0].addNodeLink(graph[3]);
graph[0].addNodeLink(graph[22]);
graph[0].addNodeLink(graph[5]);
graph[0].addNodeLink(graph[47]);
graph[1].addNodeLink(graph[13]);
graph[1].addNodeLink(graph[4]);
graph[17].addNodeLink(graph[2]);
graph[17].addNodeLink(graph[16]);
graph[52].addNodeLink(graph[9]);
graph[52].addNodeLink(graph[45]);
graph[52].addNodeLink(graph[48]);
graph[52].addNodeLink(graph[21]);
for (int i = 0; i < graph.length; i++) {
if (graph[i].getNumberOfLinks() != 0) {
System.out.println(graph[i]);
}
}
depthFirstSearch(graph[0]);
// reset the nodes
randomNum = 0 + (int)(Math.random()*100);
for (int i = 0; i < graph.length; i++) {
randomNum = 0 + (int)(Math.random()*100);
graph[i] = new Node(randomNum,((59+3*randomNum)%100),((19+17*randomNum)%100),i+1);
}
// circular reference example
System.out.println();
System.out.println();
System.out.println("Circular reference");
graph[0].addNodeLink(graph[1]);
graph[1].addNodeLink(graph[2]);
graph[2].addNodeLink(graph[0]);
for (int i = 0; i < graph.length; i++) {
if (graph[i].getNumberOfLinks() != 0) {
System.out.println(graph[i]);
}
}
depthFirstSearch(graph[0]);
System.out.println();
System.out.println();
System.out.println("Circular reference, with a leaf node added");
graph[0].addNodeLink(graph[3]);
for (int i = 0; i < graph.length; i++) {
if (graph[i].getNumberOfLinks() != 0) {
System.out.println(graph[i]);
}
}
depthFirstSearch(graph[0]);
}
}
关于depth-first-search - Perl 中的 DFS(或 Java 或 C++ ...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3101117/
cv2.phase() 函数有问题。我编写了以下代码: img = cv2.imread("1.jpg", 0) cv2.imshow("image", img) img_dx = cv2.Sobel
我正在尝试在 OpenCV 中处理一些图像。具体来说,使用以下函数交换颜色 Pane 。 def green_ble_swap(image) im_rgb = cv2.cvtColor(ima
在Unreal 4.24编辑器中,Actor's Detail面板上的“Rendering”部分中,有一个“Render CustomDepth Pass”复选框,以及一个“CustomDepth S
当我尝试在 Visual Studio 2010 中从 here 运行此代码时.我收到以下错误 OpenCV Error: Assertion failed ((img.depth() == CV_8
我有一个计算旋转和平移矩阵的代码如下: matrix Matrix rt = new Matrix(3, 4); if (positiveCount[0] > positiveCount[1])
我是初学者。我尝试使用Tensorflow进行图像分类,并收到以下错误。我在网上发现了类似的问题,但我听不懂。错误是什么意思?我应该怎么做?请给我一些建议。我使用100个文件(png/15pix,15
我在 this website 上找到了以下代码: import os import os.path import cv2 import glob import imutils CAPTCHA_IMA
这是虚拟更衣室的代码 因此,基本上是为了运行此代码ubuntu 12.04,python 2.7.3,gtk2和opencv 2。它删除背景屏幕,在几乎任何光线条件下检测T恤,替换T恤颜色。编写用于替
我从上面得到这个错误,不知道如何避免它。我的目的是获取屏幕截图,然后对其进行模板匹配,以查看此时屏幕上是否显示图标。到目前为止,它只是图标的位置。我的代码: #include "opencv2/hig
我正在尝试获取使用开放姿势检测到的点的像素坐标值。有人可以告诉我这是识别像素坐标的正确方法吗?还是有其他特定方法可以获取下图中表示为 2 和 5 的像素坐标? 代码: for pair in POSE
我正在尝试使用代码阅读多项选择测试反馈中的答案,但出现以下错误消息: error: (-215:Assertion failed) npoints >= 0 && (depth == CV_32F |
我有一个 Python 算法,它基本上可以帮助找到函数的“深度”: f(a) has a depth of 1 f(g(h(a,b,c),d)),e) has a depth of 3 伪算法是这样的
我正在使用 d3 编写动画,但我似乎无法找到一种方法来轻松确保图形始终出现在其他图形“后面”。 具体来说,我正在处理直线和圆(想象一个有向图),有些线位于圆的顶部,而其他线位于圆的下方,看起来有点糟糕
我正在研究爬虫,需要准确理解“链接深度”的含义。以nutch为例:http://wiki.apache.org/nutch/NutchTutorial depth indicates the link
当做 depth first search在 Directed Graph pre 是什么意思和 post数字? 例如: 如果您从节点 A 开始并按字母顺序排列 Depth First Search你
我在尝试为 Vulkan 构建投影矩阵时遇到了矛盾,并且还没有找到关于投影矩阵如何将 Z 从输入向量映射到输出的解释。映射 x 和 y 很简单。我的理解是 OpenGL 投影矩阵应该将近视锥平面映射到
boolean backtrackDFS(v) { If (SolutionFound(v)) return true; Mark vertex v as reached. f
根据 AIMA(人工智能:现代方法)中的 Norvig 的说法,深度优先算法并不完整(不会总是产生解决方案),因为在某些情况下,下降的子树将是无限的。 另一方面,如果分支因子不是无限的,则广度优先方法
我正在使用谷歌标签管理器对当前站点进行谷歌分析。 现在,我们想知道人们在我们的网站上滚动了多远。 所以我使用了一个名为jquery.scrollDepth.js的插件 $(document).r
我正在用 smallcheck 做我的第一项真正的工作, 我对如何使用 Depth 有点困惑范围。在开始之前,让我先说明我在使用什么 smallcheck为了。 在工作中,我们正在我们自己的内部数据库
我是一名优秀的程序员,十分优秀!