【问题标题】:Binary search with fork()使用 fork() 进行二分查找
【发布时间】:2018-03-17 10:15:11
【问题描述】:

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

【问题讨论】:

  • 你混淆了二叉搜索和二叉搜索树..!!
  • 分叉后,您必须通过 exit() 以状态 0 或 1 传递状态,父进程等待(wait()waitpid())子进程并报告复合状态从孩子们那里。此外,这看起来总是会搜索所有内容,而不是一直消除一半的搜索范围。您必须等待第一个孩子完成,只有当它报告失败时,您才会启动第二个孩子。

标签: c fork


【解决方案1】:

您对fork() 的工作方式感到困惑。还有关于二分搜索的工作原理。

使用 fork() 遍历树

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

事实上,它在成功时返回两次,一次给孩子,一次给父母。从手册页:

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

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

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

请注意,这种遍历二叉树的方式将为树中的每个节点(或树中的每个具有子节点的节点)生成一个进程。这实际上可能是一个分叉炸弹,即您可以对自己的计算机进行 DoS。因此,您可能希望限制使用的 fork() 级别(即,当您的级别超过 n 级别时,切换到常规搜索)。

二分查找和遍历树之间的混淆

这里的第二个问题是二分搜索的全部意义(与树相反)是您在搜索范围的一半处检查项目,然后只搜索到 one 一侧它,即您不需要处理双方。这样就不需要fork()

这里你正在搜索的数组的内容不是按顺序排列的,所以你没有进行二分搜索。您(实际上)正在遍历一棵树,其中根节点在中间,下一个节点在末端和根节点之间的中间,等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    相关资源
    最近更新 更多