首页 > 编程语言 >Java 空间和时间高效的二项式系数(Space and time efficient Binomial Coefficient)

Java 空间和时间高效的二项式系数(Space and time efficient Binomial Coefficient)

时间:2024-07-05 10:57:25浏览次数:3  
标签:Coefficient nk Java Space int res 复杂度 .... 空间

这里函数采用两个参数n和k,并返回二项式系数 C(n, k) 的值。 

例子: 

输入: n = 4 和 k = 2

输出: 6

解释: 4 C 2 等于 4!/(2!*2!) = 6

输入: n = 5 和 k = 2

输出: 10

解释: 5 C 2 等于 5!/(3!*2!) = 10

        在本文中,我们讨论了 O(n*k) 时间和 O(k) 额外空间算法。C(n, k) 的值可以在 O(k) 时间和 O(1) 额外空间内计算出来。

方法:

1、如果 r 大于 nr,则将 r 更改为 nr,并创建一个变量来存储答案。

2、从 0 到 r-1 运行循环

3、在每次迭代中更新 ans 为 (ans*(ni))/(i+1),其中 i 是循环计数器。

4、所以答案将等于 ((n/1)*((n-1)/2)*…*((n-r+1)/r),等于 nCr。

C(n, k) 
= n! / (nk)! * k! 
= [n * (n-1) *....* 1] / [ ( (nk) * (nk-1) * .... * 1) * 
                            ( k * (k-1) * .... * 1 ) ]
简化后,我们得到
C(n, k) 
= [n * (n-1) * .... * (n-k+1)] / [k * (k-1) * .... * 1]

另外,C(n, k) = C(n, nk)   
// 如果 r > n-r,则 r 可以更改为 n-r

以下实现中利用上述公式计算C(n,k):

// Program to calculate C(n, k) in java 
class BinomialCoefficient { 
    // Returns value of Binomial Coefficient C(n, k) 
    static int binomialCoeff(int n, int k) 
    { 
        int res = 1; 
  
        // Since C(n, k) = C(n, n-k) 
        if (k > n - k) 
            k = n - k; 
  
        // Calculate value of 
        // [n * (n-1) *---* (n-k+1)] / [k * (k-1) *----* 1] 
        for (int i = 0; i < k; ++i) { 
            res *= (n - i); 
            res /= (i + 1); 
        } 
  
        return res; 
    } 
  
    /* Driver program to test above function*/
    public static void main(String[] args) 
    { 
        int n = 8; 
        int k = 2; 
        System.out.println("Value of C(" + n + ", " + k 
                           + ") "
                           + "is"
                           + " " + binomialCoeff(n, k)); 
    } 

// This Code is Contributed by Saket Kumar

输出:
C(8, 2) 的值为 28

复杂度分析: 

时间复杂度: O(r)循环必须从 0 运行到 r。因此,时间复杂度为 O(r)。

辅助空间:O(1),因为不需要额外的空间。

标签:Coefficient,nk,Java,Space,int,res,复杂度,....,空间
From: https://blog.csdn.net/hefeng_aspnet/article/details/139959088

相关文章

  • JavaWeb—jsp篇
    概述JavaServerPages:java服务器端页面      可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码      用于简化书写 原理jsp实际就是一个servletjsp就是java代码  脚本<% 代码%>:定义的java代码,在service方法中。......
  • java分批读取excel中数据处理
     java分批读取excel中数据处理在Java中,可以使用ApachePOI库来读取和处理Excel数据。以下是一个简单的例子,展示了如何分批次读取Excel文件中的数据。importorg.apache.poi.ss.usermodel.*;importorg.apache.poi.xssf.usermodel.XSSFWorkbook;importjava......
  • qt 入门常用类理解(涉及QMessageBox,Layout,Spacers,Splitter,Buuddy,LoginApp,QFile,
    1.QMessageBoxQMessageBox::Yes QApplication::quit();QMessageBox::exec用于在模态(阻塞式)对话框中显示一个消息框,并等待用户的响应。这个函数通常用于在应用程序中显示消息、警告或询问对话框,并等待用户采取适当的操作后继续执行。int QMessageBox::exec()exec 函数没有......
  • 邮件显示统计图表echarts-java+phantomjs实现
    邮件显示统计图表echarts-java+phantomjs实现项目背景是产品业务上的订阅推送,纯java后端实现,通过邮件将统计报表发送给用户。这里会涉及一些关键点:首先是统计图表的生成,我们采用常见的echarts,简单易用,支持图表类型丰富美观;java后端实现可使用echarts-java来实现图表的生成......
  • BeanUtil复制时,两对象中数据类型不一致导致的问题Can not set java.time.LocalDateTim
    @DatapublicclassAVo{privateLongendTime;privateStringname;privateStringid;}@DatapublicclassABVo{privateLocalDateTimeendTime;privateStringname;privateStringid;}AVoaVo=newAVo();......
  • 一些java中记忆的问题
    什么是封装封装是将对象的属性和方法(或称为成员)结合成一个独立的单元,隐藏对象的属性和实现细节,仅对外公开接口(方法)与对象进行交互。链表数据结构链表是一种常见的数据结构,它由一系列节点(Node)组成,每个节点包含数据和一个或多个指向其他节点的引用(即指针)。与数组不同,链表中......
  • Java程序基础
    类名要求:类名必须以英文字母开头,后接字母,数字和下划线的组合习惯以大写字母开头要注意遵守命名习惯,好的类命名:HelloNoteBookVRPlayer不好的类命名:helloGood123Note_Book_World注意到public是访问修饰符,表示该class是公开的。不写public,也能正确编译,但是这个类......
  • Java_MyBatis框架:MyBatis框架
    MyBatis的执行流程先加载配置文件再通过SqlSessionFactoryBuilder创建SqlSessionFactory对象获取SqlSession生成代理对象执行Excutor匹配执行SQL语句MyBatis的一级缓存和二级缓存一级缓存:也叫SqlSession级缓存,无需手动开启,可直接使用,为每个SqlSession单独分配的缓存空间,......
  • Java_多线程:线程池
    1、线程池优点:降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一......
  • 基于Java+SpringBoot+Vue的学生宿舍管理系统的设计与开发(源码+lw+部署文档+讲解等)
    文章目录前言项目背景介绍技术栈后端框架SpringBoot前端框架Vue数据库MySQL(MyStructuredQueryLanguage)具体实现截图详细视频演示系统测试系统测试目的系统功能测试系统测试结论代码参考数据库参考源码获取前言......