【问题标题】:Divide and conquer algorith does not work分治算法不起作用
【发布时间】:2020-07-17 14:38:03
【问题描述】:

我正在尝试使用“分而治之”算法解决数字的平均值,但我编写的程序仅在元素数量为 2 的幂(2、4、8 等)时才有效。

代码是用python写的,如下

def averageDyC(ini, end, notes):
    if (ini == end):
        return notes[ini]

    mid = int((ini + end) / 2)

    x = averageDyC(ini, mid, notes)
    y = averageDyC(mid + 1, end, notes)
    
    return float((x + y) / 2)
    
notes = [1, 4, 7, 8, 9, 2, 4]
average = averageDyC(0, len(notas) - 1, notes)

此代码显示 3,75,但正确的平均值是 3,5

如何更改此代码以允许元素数量不同于 2 的幂?

【问题讨论】:

  • 从数学上讲,这个方法是错误的,你为什么不使用sum(notes)/len(notes)
  • 您是否尝试过使用调试器来检查您的程序是否按照它应该执行的操作?
  • 正如在其他答案中所指出的,您可以通过加权平均值来修复算法的逻辑:用return float((x*(mid-ini+1) + y*(end-mid)) / (end-ini+1)) 替换行return float((x + y) / 2)。然而,这会执行大量的中间除法和重乘,这有点低效,并且可能导致舍入和近似。正如 Roshin Raphel 指出的那样,您的整个算法可以用简单的行 sum(notes)/len(notes) 代替,它只执行一次除法。
  • @Stef,你的评论太棒了。我已经用提案线加权平均值更改了我的代码,结果是正确的,而不取决于元素的数量。

标签: python algorithm math average divide


【解决方案1】:

我实际上并不认为这种技术可以用于查找列表的平均值。

我们来看三个数字的列表:[1,2,3]

显然,平均值是 2。

但是,如果我们将列表一分为二,我们会得到[1,2][3]。他们各自的平均值是 1.5 和 3。

如果我们将这两个加在一起,然后将结果除以二,我们得到 2.25。

那是因为 1.5 是 两个 数字的平均值,而 3 是 一个 数字的平均值,所以我们真的应该用 2 加权 1.5,用 3 加权1.

所以正确的总和应该是(2(1.5) + 1(3)) / 3

当您尝试将奇数列表分成两半然后赋予两个平均值相等的权重时,也会出现同样的问题。

出于这个原因,我认为你不能使用这种方法,除非你有两个长度的列表。

编辑:还值得注意的是,有很多好方法可以获取列表的平均值(请参阅previous question)。我没有关注这些,因为我相信您的问题主要是询问您使用的特定算法,而不是实际找到平均值。

【讨论】:

    猜你喜欢
    • 2013-02-12
    • 2021-05-06
    • 2012-10-28
    • 2017-04-07
    • 1970-01-01
    • 2013-02-02
    • 2014-10-28
    • 2020-07-17
    • 1970-01-01
    相关资源
    最近更新 更多