【问题标题】:Divide and Conquer Algorithms分而治之的算法
【发布时间】:2013-02-02 11:32:15
【问题描述】:

我们开始在我的数据结构课程中使用分而治之的算法,但我很难完全理解我应该做什么。下面是基本上要求我编写一个对数组求和的程序,但它必须划分并征服它,直到基数为 4,我认为这意味着将数组以 4 的块加在一起,然后将所有块在一起。我什至不知道从哪里开始。我只需要一点解释和理解。老师帮不上什么忙。该数组包含一行数字,其数量为 2 的次方,小于 1000

问题 编写一个分而治之的算法,对一个包含 n 个 in- 的数组求和 整数。该算法的基本情况是当 子问题小于或等于 4 在这种情况下,您将使用 迭代循环对子问题的整数求和。你需要做 以下:

【问题讨论】:

    标签: divide-and-conquer


    【解决方案1】:

    我猜你打算编写一个递归方法,将数组 A 拆分为两个(或更多)子数组,每个子数组的一半,然后将结果数组传递给它自己,以便继续拆分,直到你有一个数组4号;然后您可以执行求和并返回这 4 个单位的总和。

    【讨论】:

    • 这就是我的想法,但我不确定如何跟踪所有拆分的数组。如果我递归调用 120 个数字,我最终会得到 30 个基本大小的数组组
    • 这就是递归的重点:你不跟踪。该方法所做的只是传递它,然后等待返回值。因此,例如,在“结束”时,当您有 4 个项目时,假设它们的总和为 9。这将返回给调用方法。该方法拆分的其他 4 项总和为 13。好的,9+13=22。这已经传递到前面的电话了。 22. 好,现在我们下另一棵树;它里面有 5 和 8,所以 13. 22+13=35。好的,这已经通过了。等等。
    • 哦,我现在明白了。我觉得这种类型的课程应该在学校早期教授。它
    【解决方案2】:

    让我们暂时不要考虑编程语言,而是考虑抽象的方法。


    想象一下,如果你在一个有二十叠纸的房间里,每叠纸上都有一个数字。您愿意将所有数字的总数汇总在一起,但您意识到逐个计算将花费很长时间。所以,你打电话给一个朋友,你们每个人都得到了十个堆栈来工作。通过打电话你的朋友,你的工作量减少了一半。

    你们都意识到,如果有十叠纸,你们将无济于事,所以你们每个人都打电话给另一个朋友伸出援助之手,让你们四个人每人拿了五叠纸。有道理,但还是压倒性的。因此,每个人再次召集另一个朋友过来,将他们的堆栈与其他朋友减半 - 让每个人都有 2.5 叠带有数字的纸。

    你们都同意这是由一个人完成的合理数量的工作,因此您可以将这些数字加在一起。从最后一组到你自己的人开始工作,每个人都会返回他们所拥有的数字的总和,直到你得到其他人的总和,而你有自己的总和。将这两者相加即可得出结果。

    这是分而治之的原则:您的工作堆栈被分成一些工作部分,然后您可以调用其他方法来完成这些工作。

    这是一个 Python 中的伪示例。

    def sum(*args):
        if len(args) == 0:  # Nothing in my list, so I'm done
            return 0
        elif len(args) == 1:  # One thing in my list, return that
            return args[0]
        else:  # Too much for me to handle; call in the Calvary!
            return args[0] + sum(args[1:])
    

    【讨论】:

    • 这是一个很好的表达方式。我的书应该是这样写的。
    猜你喜欢
    • 1970-01-01
    • 2012-01-01
    • 2013-02-03
    • 2017-06-08
    • 1970-01-01
    • 2013-01-12
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多