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

这里函数采用两个参数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) 
  
#include <bits/stdc++.h> 
using namespace std; 
  
// Returns value of Binomial Coefficient C(n, k) 
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 Code 
int main() 

    int n = 8, k = 2; 
    cout << "Value of C(" << n << ", " << k << ") is "
         << binomialCoeff(n, k); 
    return 0; 

  
// This is code is contributed by rathbhupendra

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

复杂度分析: 

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/41070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海思SD3403/SS928V100开发(14)WIFI模块RTL8821驱动调试

1.前言 芯片平台: 海思SD3403/SS928V100 操作系统平台: Ubuntu20.04.05【自己移植】 WIFI模块: LB-LINK的RTL8821 2. 调试记录 参考供应商提供的操作手册 2.1 lsusb查看设备 2.2 编译供应商提供的驱动 2.2.1 修改Makefile 2.2.2 编译报错 解决办法: 将Makefile中arm…

linux中 nginx+tomcat 部署方式 tomcat挂掉设置自动启动

在Linux环境下&#xff0c;要实现当Tomcat挂掉后自动重启&#xff0c;可以通过编写Shell脚本结合cron定时任务或者使用系统守护进程&#xff08;如Systemd、Upstart或SysVinit&#xff09;来完成。 使用Shell脚本和cron定时任务 编写检查并重启Tomcat的Shell脚本&#xff1a;首…

取证与数据恢复:冷系统分析,实时系统分析与镜像分析之间的过渡办法

天津鸿萌科贸发展有限公司是 ElcomSoft 系列取证软件的授权代理商。 ElcomSoft 系列取证软件 ElcomSoft 系列取证软件支持从计算机和移动设备进行数据提取、解锁文档、解密压缩文件、破解加密容器、查看和分析证据。 计算机和手机取证的完整集合硬件加速解密最多支持10,000计…

MMSC物料库位扩充

MMSC物料库位扩充 输入事务码MMSC&#xff1a; 回车后添加新的库位即可&#xff1a; 代码实现&#xff0c;使用BDC *&------------------------------------------------* *&BDC的定义 *&------------------------------------------------* DATA gt_bdcdata T…

ggrcs包4.0版本发布—重新对密度图宽度进行了设计

目前本人写的ggrcs包新的4.0版本已经在CRAN上线&#xff0c;目前支持逻辑回归&#xff08;logistic回归&#xff09;、cox回归和多元线性回归。 需要的可以使用代码安装 install.packages("ggrcs")如果原来安装了旧版本&#xff0c;重新在安装一次就可以升级到新版…

如何选择小红书矩阵系统

在内容营销领域&#xff0c;小红书已成为一个不可忽视的平台&#xff0c;尤其是对于品牌和个人创作者来说。小红书矩阵系统&#xff0c;指的是一系列策略和工具&#xff0c;它们可以帮助用户在小红书上高效地管理和分发内容。本文将探讨如何选择适合自己需求的小红书矩阵系统&a…

YOLOv8数据集可视化[目标检测实践篇]

先贴代码,后面再补充解析。 这个篇章主要是对标注好的标签进行可视化,虽然比较简单,但是可以从可视化代码中学习到YOLOv8是如何对标签进行解析的。 下面直接贴代码: import cv2 import numpy as np import osdef read_det_labels(label_file_path):with open(labe…

蓝桥杯开发板STM32G431RBT6高阶HAL库学习FreeRtos——完成第一个小项目点灯

一、配置LED引脚(注意引脚都配置为高电平) 二、新建两个任务&#xff0c;一个为动态创建&#xff0c;一个静态创建&#xff08;以后大多数情况进行动态创建&#xff09;//将两个优先级设置成一样 补充&#xff1a; 1.FreeRTOS创建静态任务和动态任务的各自优缺点 静态任务和动…

react框架,使用vite和nextjs构建react项目

react框架 React 是一个用于构建用户界面(UI)的 JavaScript 库,它的本质作用是使用js动态的构建html页面&#xff0c;react的设计初衷就是为了更方便快捷的构建页面&#xff0c;官方并没有规定如何进行路由和数据获取&#xff0c;要构建一个完整的react项目&#xff0c;我们需要…

3D技术赋能电商行业:“人-货-场”视角下的新变革!

在当今数字化时代&#xff0c;3D技术正以前所未有的方式赋能电商行业&#xff0c;在提升用户体验&#xff0c;优化商品展示&#xff0c;以及打造沉浸式的购。物场景上&#xff0c;重塑了电商行业的面貌&#xff0c;深刻改变着消费者的购物体验和商家的营销策略。 51建模网作为专…

视图库对接系列(GA-T 1400)九、视图库对接系列(本级)机动车数据推送

背景 在上几章中,我们已经可以将视图库的平台写到我们的数据库中了。 换句话说就已经接入我们的平台了,这几期的话,我们就对接设备, 将设备的数据接入到我们平台来。 机动车数据推送 接入机动车数据推送相对比较简单,我们只需要实现对应的接口就ok了。 具体如图: 有增…

RRStudio 下载及安装(详尽版)

R语言来自S语言&#xff0c;是S语言的一个变种。S语言、C语言、Unix系统都是贝尔实验室的研究成果。R 语言是一种解释型的面向数学理论研究工作者的语言&#xff0c;主要用于统计分析、绘图、数据挖掘。 R 语言自由软件&#xff0c;免费、开放源代码&#xff0c;支持各个主要计…

Emacs有什么优点,用Emacs写程序真的比IDE更方便吗?

Emacs 是一个功能强大的文本编辑器&#xff0c;它在开发者和程序员中非常受欢迎&#xff0c;主要优点包括&#xff1a; 可定制性&#xff1a;Emacs 允许用户通过 Lisp 编程语言来自定义编辑器的行为和界面&#xff0c;几乎可以修改任何方面。扩展性&#xff1a;拥有大量的扩展…

C++:类型转换

目录 一、C语言中的类型转换 二、为什么C要新的转换格式 三、 C强制类型转换 1.static_cast 2.reinterpret_cast 3.const_cast 4.dynamic_cast 一、C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&…

【高阶数据结构】B-数、B+树、B*树的原理

文章目录 B树的概念及其特点解析B树的基本操作插入数据插入数据模拟 分析分裂如何维护平衡性分析B树的性能 B树和B*树B树B树的分裂B树的优势 B*B*树的分裂 总结 B树的概念及其特点 B树是一颗多叉的平衡搜索树&#xff0c;广泛应用于数据库和 文件系统中&#xff0c;以保持数据…

等保2.0的具体技术要求有哪些重点?

在数字化浪潮汹涌澎湃的当下&#xff0c;网络安全犹如一座守护智慧之城的巍峨城墙&#xff0c;不可或缺。等级保护制度&#xff08;等保&#xff09;作为我国网络安全战略的基石&#xff0c;历经岁月沉淀&#xff0c;已演进至2.0时代&#xff0c;即《网络安全等级保护基本要求》…

算法思想总结:优先级队列

一、最后一块石头的重量 . - 力扣&#xff08;LeetCode&#xff09; 我们每次都要快速找到前两个最大的石头进行抵消&#xff0c;这个时候用优先级队列&#xff08;建大堆&#xff09;,不断取堆顶元素是最好的&#xff01;每次删除堆顶元素后&#xff0c;可以自动调整&#xf…

HarmonyOS - 通过.p7b文件获取fingerprint

1、查询工程所对应的 .p7b 文件 通常新工程运行按照需要通过 DevEco Studio 的 Project Structure 勾选 Automatically generate signature 自动生成签名文件&#xff0c;自动生成的 .p7b 文件通常默认在系统用户目录下. 如&#xff1a;C:/Users/zhangsan/.ohos/config/default…

JavaSE面试题(二)

目录 一.为什么会有Java内存模型&#xff1f; 二.什么样的情况下finally不会执行 三.钩子是什么&#xff1f; 四.编译时期的多态性和运行时期的多态性 五.谈谈反射机制 六.Java管道 本专栏全是博主自己收集的面试题&#xff0c;仅可参考&#xff0c;不能相信面试官就出这…

TCP报文校验和(checksum)计算

一. 原理 将TCP相关内容&#xff08;TCP伪头部TCP头部TCP内容&#xff09;转换成16比特的字符&#xff0c;然后进行累加&#xff0c;最后结果进行取反。TCP伪头部是固定的&#xff0c;下文有相关代码展示。 二. 源码 源码 #include <stdio.h> #include <stdlib.h&…