小编stz*_*zz1的帖子

使用数组来改善递归二项分布算法的执行时间?

作为一名初学程序员,我最近买了Robert Sedgewick/Kevin Wayne的书"算法 - 第四版",我非常感谢每一章末尾的练习.然而,有一个练习(看起来很简单)让我疯狂,因为我无法找到解决方案.

你必须采用这种递归算法,找出在n次试验中获得准确k次成功的概率,其中p是一个事件成功的可能性.给出的算法基于递归二项分布论坛.

public static double binomial(int n, int k, double p) {
    if (n == 0 && k == 0)
        return 1.0;
    else if (n < 0 || k < 0)
        return 0.0;
    return (1 - p) * binomial(n - 1, k, p) + p * binomial(n - 1, k - 1, p);
}
Run Code Online (Sandbox Code Playgroud)

本练习的目的是通过在数组中保存计算值来加快此算法的速度.通过使用另一种获得二项分布[p(x)= nCr*p ^ k*(1 - p)^(n - k)]的方法,我已经使这个算法变得更快了,它使用迭代方法来寻找阶乘.但是,我不明白如何使用数组来改善此上下文中的执行时间.

任何帮助将不胜感激!

......在有人问之前,这不是作业!

java arrays algorithm math

4
推荐指数
1
解决办法
937
查看次数

嵌套循环到数学模型中以计算操作次数

我正在阅读Sedgewick和Wayne的书"算法 - 第四版",我必须承认"算法分析"一章中的某些部分让我感到困惑!这可能是由于我缺乏数学知识......反正!

在本书的某处,有一个程序的例子,其中内循环被称为精确地执行N(N-1)(N-2)/ 6次.这里是:

    public static int count(int[] a) {
        int count = 0;

        for (int i = 0; i < a.length; i++) {
            for (int j = i + 1; i < a.length; j++) {
                for (int k = j + 1; k < a.length; k++) {
                    if (a[i] + a[j] + a[k] == 0) {
                        count++; 
                    } 
                }
            }
        }
        return count;
    }
Run Code Online (Sandbox Code Playgroud)

我熟悉大O符号,但是当计算循环中的确切数量时,我迷失了.我理解N(N-1)(N-2)部分,但为什么我们必须除以6?它背后的逻辑是什么?

任何帮助将不胜感激!

java algorithm math

4
推荐指数
1
解决办法
1862
查看次数

良好的编程习惯和return语句

我是一名学习计算机科学的初学程序员,我多次被告知在循环中使用return语句不是一个好的编程习惯,应该避免.现在,我在Java库中阅读了很多代码来了解一切是如何工作的,我很惊讶地发现循环中的return语句无处不在.

有没有人能解释为什么应该避免在循环中使用return语句?

谢谢!

java

2
推荐指数
2
解决办法
4081
查看次数

<=(或> =)运算符的日期和重载

我不知道我是否真的累了,但这段代码在运行单元测试时给了我(逻辑?)的问题.以下代码中是否有任何错误?

bool Date::operator <= (const Date& d) const {
    if (this != &d) {         
        if (day > d.day)
            return false;
        if (hour > d.hour)
            return false;
        if (minute > d.minute)
            return false;
        if (second > d.second)
            return false;
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)

仅仅为了测试,我用这个(丑陋的)版本替换它并且所有测试都通过了......

bool Date::operator <= (const Date& d) const {
    if (this != &d) {
        long a = (86400 * day) + (3600 * hour) + (60 * minute) + second;
        long b = (86400 * d.day) + (3600 …
Run Code Online (Sandbox Code Playgroud)

c++

0
推荐指数
1
解决办法
829
查看次数

标签 统计

java ×3

algorithm ×2

math ×2

arrays ×1

c++ ×1