我尝试使用2个儿子创建二叉搜索树。如果找到了搜索的元素,它们将返回1,否则返回0。
#define m_index 16
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int fork_search(int a[], int search, int start, int end) {
if (start == end) {
if (*(a + end) == search) {
return 1;
}
return 0;
} else{
pid_t child = fork();
if (child == 0)
return fork_search(a, search, start, (start+end)/2);
else {
// creating the second son here
pid_t child2 = fork();
if (child2 == 0)
return fork_search(a, search, (start + end)/2+1, end);
}
}
}
int main(int argc, char* argv[]) {
int a[m_index] = {1, 12, 11, 5, 10, 6, 4, 9, 13, 2, 8, 14, 3, 15, 7};
printf("%d\n", fork_search(a, 12, 0, m_index-1));
return 0;
}
如何创建第二个儿子来搜索上半部分?如果它是父亲我只能写return fork_search(a, search, (start + end)/2+1, end);
,但是,我需要第二个儿子来做这件事。谢谢!
答案 0 :(得分:0)
您对fork()
的工作原理感到困惑。还有关二进制搜索的工作原理。
fork()
只是启动当前进程的副本(技术上是一个写时复制副本)。因此,如果fork成功,它将返回成功。
实际上,它会在成功时返回两次,一次返回子项,一次返回父项。从手册页:
成功时,子进程的PID将在父进程中返回,并且 孩子返回0。失败时,在父级中返回-1, 没有创建子进程,并且正确设置了errno。
所以,首先你需要检查fork()
没有失败(没有返回-1)。如果是,则中止搜索。
如果fork()
返回0,则您是孩子,因此您可以搜索树的一个肢体。否则你是父母,在这种情况下你需要做第二个fork()
,然后wait()
让两个孩子完成。然后使用exit()
(return
将结果传回去,只会导致每个孩子将该行打印到stdout
中的main()
。
请注意,这种遍历二叉树的方式将为树中的每个节点(或带有子节点的树中的每个节点)生成一个进程。这可能实际上是一个二叉炸弹,即你可以使用自己的电脑。因此,您可能希望限制所使用的fork()
级别(例如,当您的级别超过n
时,请切换到传统搜索。)
这里的第二个问题是二分搜索(而不是树)的整个要点是你在搜索范围的一半检查项目,然后只搜索一个方面它,即你不需要处理双方。这消除了对fork()
的需求。
此处您正在搜索的数组的内容不按顺序排列,因此您不进行二进制搜索。您(实际上)遍历树,其中根节点位于中间位置,下一个节点位于两端和根节点之间,等等。