用叉子进行二进制搜索()

时间:2015-01-07 17:58:08

标签: c fork

我尝试使用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);,但是,我需要第二个儿子来做这件事。谢谢!

1 个答案:

答案 0 :(得分:0)

您对fork()的工作原理感到困惑。还有关二进制搜索的工作原理。

使用fork()遍历树

fork()只是启动当前进程的副本(技术上是一个写时复制副本)。因此,如果fork成功,它将返回成功。

实际上,它会在成功时返回两次,一次返回子项,一次返回父项。从手册页:

  

成功时,子进程的PID将在父进程中返回,并且   孩子返回0。失败时,在父级中返回-1,   没有创建子进程,并且正确设置了errno。

所以,首先你需要检查fork()没有失败(没有返回-1)。如果是,则中止搜索。

如果fork()返回0,则您是孩子,因此您可以搜索树的一个肢体。否则你是父母,在这种情况下你需要做第二个fork(),然后wait()让两个孩子完成。然后使用exit()return将结果传回去,只会导致每个孩子将该行打印到stdout中的main()

请注意,这种遍历二叉树的方式将为树中的每个节点(或带有子节点的树中的每个节点)生成一个进程。这可能实际上是一个二叉炸弹,即你可以使用自己的电脑。因此,您可能希望限制所使用的fork()级别(例如,当您的级别超过n时,请切换到传统搜索。)

二进制搜索和遍历树之间的混淆

这里的第二个问题是二分搜索(而不是树)的整个要点是你在搜索范围的一半检查项目,然后只搜索一个方面它,即你不需要处理双方。这消除了对fork()的需求。

此处您正在搜索的数组的内容不按顺序排列,因此您不进行二进制搜索。您(实际上)遍历树,其中根节点位于中间位置,下一个节点位于两端和根节点之间,等等。