arrays - 使用动态规划和一维数组的二项式系数

标签 arrays algorithm dynamic-programming combinatorics binomial-coefficients

大多数使用动态规划的二项式系数计算的实现都使用二维数组,如以下示例所示: http://www.csl.mtu.edu/cs4321/www/Lectures/Lecture%2015%20-%20Dynamic%20Programming%20Binomial%20Coefficients.htm

http://www.geeksforgeeks.org/dynamic-programming-set-9-binomial-coefficient/

我的问题是,为什么不使用像这样的一维数组来计算它:

def C(n, r):
    memo = list()
    if (r > int(n/2)):
        r = n - r
    memo.append(1.0)
    for i in range(1,r+1):
        now = ((n-i+1)*memo[i-1])/i
        memo.append(now)
    return memo[r]

基本上使用递归公式: C(n,r) = ((n-r+1)/r) * C(n,r-1)

这具有 O(r) 的复杂性,而二维逻辑具有 O(nr) 的复杂性。

我是不是漏掉了什么?

最佳答案

如果你想要所有的值,那么二维逻辑肯定更有效。二维逻辑对于某些硬件上的某些参数可能更有效,例如,缺少硬件乘法和除法。在除法之前乘法时必须小心整数溢出,而二维循环中的整数加法总是没问题的。除此之外,不,一维递归更好。

关于arrays - 使用动态规划和一维数组的二项式系数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41153718/

相关文章:

c# - 如何从数组中随机选择一行?

c++ - 默认构造一个整数数组会对其进行零初始化吗?

c++ - 从数组中抽取非重复随机元素的有效算法

.net - 在应用程序中添加动态数据透视表的最佳方式

algorithm - 多边形包装 2D

algorithm - 动态规划 : Why Knuth's improvement to Optimal Binary Search Tree O(n^2)?

algorithm - 最大子数组iii(来自lintcode)动态规划求解

c - 尝试从文件中打印数组

javascript - 如何将多维数组中的单个对象推送到数组?

c++ - std::priority_queue 和 make_heap API 设计