- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我最近在研究数据结构,我在图方面遇到了麻烦。我读了这本书:Data Structures and Algorithm Analysis in C (2nd Edition) .
其实我也看了一些其他的算法书籍,我发现几乎没有一本书给我完整的图实现。尽管我可以阅读伪代码并理解 BFS 和 DFS 的运行方式,以及图形中用于解决问题的其他一些算法,但我仍然想要一个完整的实现来帮助我更好地理解它的工作原理。但是,在学习图的时候在这里写代码不重要吗?我不确定。
另外,我发现了一些关于 BFS 和 DFS 的 ACM 问题。不知道怎么表达,好像BFS和DFS只是解决思路,并没有写出标准的BFS代码。所以这让我很难学习数据结构。
不好意思表达不好,我现在是美国的留学生。
最后,我从Mastering Algorithms with C复制了这段代码并对其进行了分析。但我仍然无法理解其中的一部分。这是代码的一部分:
typedef struct BfsVertex_ {
void *data;
VertexColor color;
int hops;
} BfsVertex;
typedef struct AdjList_ {
void *vertex;
Set adjacent;
} AdjList;
typedef struct Graph_ {
int vcount;
int ecount;
List adjlists;
int (*match)(const void *key1, const void *key2);
void (*destroy)(void *data);
} Graph;
int BFS(Graph *graph, BfsVertex *start, List *hops) {
Queue queue;
AdjList *adjlist, *clr_adjlist;
BfsVertex *clr_vertex, *adj_vertex;
ListElem *element, *member;
/* init all of the vertices in the graph */
for (element = list_head(&graph_adjlists(graph));
element != NULL;
element = list_next(element)) {
clr_vertex = ((AdjList *)list_data(element))->vertex;
if (graph->match(clr_vertex, start)) {
clr_vertex->color = gray;
clr_vertex->hops = 0;
} else {
clr_vertex = white;
clr_vertex->hops = -1;
}
}
/* init the queue with the adjacency list of the start vertex */
queue_init(&queue, NULL);
if (graph_adjlist(graph, start, &clr_adjlist) != 0) {
queue_destroy(&queue);
return -1;
}
if (queue_enqueue(&queue, clr_adjlist) != 0) {
queue_destroy(&queue);
return -1;
}
/* perform Breadth-First Search */
while (queue_size(&queue) > 0) {
adjlist = queue_peek(&queue);
/* traverse each vertex in the current adjacency list */
for (member = list_head(&adjlist->adjacent);
member != NULL;
member = list_next(member)) {
adj_vertex = list_data(member);
/* determine the color of the next adjacent vertex */
if (graph_adjlist(graph, adj_vertex, &clr_adjlist) != 0) {
queue_destroy(&queue);
return -1;
}
clr_vertex = clr_adjlist->vertex;
/* color each white vertex gray and enqueue its adjacency list */
if (clr_vertex->color == white) {
clr_vertex->color = gray;
clr_vertex->hops = ((BfsVertex *)adjlist->vertex)->hops + 1;
if (queue_enqueue(&queue, clr_adjlist) != 0) {
queue_destroy(&queue);
return -1;
}
}
}
/* dequeue the current adjacency list and color its vertex black */
if (queue_dequeue(&queue, (void **)&adjlist) == 0) {
((BfsVertex *)adjlist->vertex)->color = black;
} else {
queue_destroy(&queue);
return -1;
}
}
queue_destroy(&queue);
/* pass back the hop count for each vertex in a list */
list_init(hops, NULL);
for (element = list_head(&graph_adjlists(graph));
element != NULL;
element = list_next(element)) {
/* skip vertices that were not visited (those with hop counts of -1) */
clr_vertex = ((AdjList *)list_data(element))->vertex;
if (clr_vertex->hops != -1) {
if (list_ins_next(hops, list_tail(hops), clr_vertex) != 0) {
list_destroy(hops);
return -1;
}
}
}
return 0;
}
我在这里遇到了麻烦:这个初始化是如何工作的?它遍历图的邻接表,并将彩色顶点分配给图中的每个顶点。但是着色后,clr_vertex 改变了它的对象,颜色和距离信息是如何保存的?
/* init all of the vertices in the graph */
for (element = list_head(&graph_adjlists(graph));
element != NULL;
element = list_next(element)) {
clr_vertex = ((AdjList *)list_data(element))->vertex;
if (graph->match(clr_vertex, start)) {
clr_vertex->color = gray;
clr_vertex->hops = 0;
} else {
clr_vertex = white;
clr_vertex->hops = -1;
}
}
感谢您阅读这么长的问题。
最佳答案
How to study graph data structures and BFS & DFS
一个词:抽象。
无论使用何种编程语言,您都需要理解它们。您只需要一支笔和一张纸。这将使实现变得非常清楚。图应该是抽象对象,其中选择了 prog。语言与概念无关。
I still want a full implementation helping me better understand how it works.
DFS 和 BFS 只是遍历(即遍历)图形的两种不同方式。不多不少。这种行走的结果就是文献中所谓的搜索树。完整实现如下:
在小图上手动运行 DFS 和 BFS。 (这将返回一个搜索树)
根据您的实现检查它。
当然,这些都是太笼统的技巧。说到练习,你可以结合其他技巧来修改它们,或者用它们做任何你想做的事。现在,您可以将它们视为 DFS=Stack,BFS=Queue
关于c - 如何研究图数据结构和 BFS & DFS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26901130/
我正在寻找我的代码的复杂度计算。简单来说就是DFS中的DFS(depth first search)。 DFS 从头到尾(向后搜索)在图(状态机)上运行。每当到达开始时,它都会累积使其到达开始的字符串
我通过实现堆栈编写了一个迭代 DFS。现在我试图递归地编写相同的 DFS,但我遇到了问题。 我的问题是,当我迭代编写它时,我可以保留某些全局变量,例如 paths=[] 并在找到新路径时添加到其中。
此程序用于图的 dfs 遍历,一个函数是迭代方法,另一个函数是递归方法,但两者给出的答案不同从迭代中我得到 01234从递归我得到 02341 谁能解释我为什么? NOTE -> User is en
这个问题在这里已经有了答案: Iterative DFS vs Recursive DFS and different elements order (4 个答案) 关闭 8 年前。 我试图了解 D
首先请原谅我的英语这可能不太可能,或者以前没有人经历过这种情况,我真的非常需要帮助。这可能是我第一次在这里提问 我正在尝试在 azure 订阅中的两台服务器(LIVE1 和 LIVE2)上设置 dfs
我以迭代方式和递归方式实现了深度优先搜索算法。它们对于小尺寸(小于 1 MB)的文件都可以正常工作。然而,当我尝试在 50 MB 的文件上运行它们时,递归 DFS(9 秒)似乎比使用迭代方法(至少几分
我正在解决这个 dfs/bfs问题。 我编写了 DFS 的迭代版本和递归版本。 节点访问的顺序不同,我不明白为什么。 迭代 DFS: static void DFS (Integer root, Gr
我遇到了一个问题,我要在图中寻找一种特殊类型的节点。该算法按以下方式工作: bool findSpecial(Node n) { if(isSpecial(n)) return
我写了一个递归DFS算法来遍历一个图: void Graph::DFS(Node n) { std::cout void Graph::IterativeDFS(Node n) {
在我的算法中,我将通过 DFS 方法创建频繁模式,例如,我生成 A-A, A-A-B, A-A-B-C, .. .顺序。(这三种模式为频繁子图模式,A,B,C为节点,- 表示两个节点之间存在一条边。)
我对 hadoop 中的 dfs 有疑问。有人知道如何解决我的问题吗? [hduser@evghost ~]$ start-dfs.sh Starting namenodes on [evghost]
据说在未加权的图中不能用DFS求最短路径。我已阅读多篇文章和博客,但并不满意,因为对 DFS 稍加修改就可以实现。 我认为如果我们以这种方式使用改进的 DFS,那么我们可以找到距源的最短距离。 Ini
考虑到一个具有 14,000 个顶点和 14,000 个边的图,我想知道为什么 GraphX 比图的 java 实现花费更多的时间来获取从顶点到叶子的所有路径? java 实现:几秒钟 Graphx
我已按照 Apache“单节点设置”说明在单节点上设置 dfs.replication。 但是后来我按照“Cluster Setup”进行操作,但它没有提到这个属性,所以我不知道这是要在 Nameno
有没有办法修改 pd.read_html 使其返回数据帧而不是数据帧列表? 语境: 我正在尝试使用 pandas read_html 从网站导入表格。我知道 pd.read_html 返回一个 dfs
为什么 hdfs dfs -ls 指向与 hdfs dfs -ls/ 不同的位置? 从下面的截图中可以清楚地看到两个命令给出不同的输出: 以上输出的主要原因是什么? 最佳答案 来自官方源码org.ap
我没有在 hdfs-site.xml 文件中设置 dfs.name.dir 和 dfs.data.dir 值没有设置。他们会怎样?有趣的是,他们默认接受什么值? (如何接收他们的当前值?) 最佳答案
我试图用一个名称节点和四个数据节点配置 hadoop。我能够在一台机器上成功配置名称节点和作业跟踪器并将其启动。 但是在我要配置数据节点的机器上,我做了以下操作: 我将 hadoop-2.0.0-cd
我正在尝试在 ec2-instance 上安装 Hadoop-2.6.0。 我下载并安装了 Hadoop。我还设置了环境变量。尝试启动 hdfs 服务时出现以下错误。 [ec2-user@ip-10-
我是 hadoop 框架的新手,目前我正在处理大数据项目,在 Windows 7 中使用 cygwin、hadoop-0.19.1、eclipse-3.3.1 (Europa)。现在我正在尝试从 ha
我是一名优秀的程序员,十分优秀!