C#,初学琼林(06)——组合数的算法、数据溢出问题的解决方法及相关C#源代码

news2024/10/7 16:24:08

1 排列permutation

排列,一般地,从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(permutation)。特别地,当m=n时,这个排列被称作全排列(all permutation)。

注:当且仅当两个排列的元素完全相同,且元素的排列顺序也相同,则两个排列相同。例如,abc与abd的元素不完全相同,它们是不同的排列;又如abc与acb,虽然元素完全相同,但元素的排列顺序不同,它们也是不同的排列

排列可分选排列与全排列两种,在从n个不同元素取出m个不同元素的排列种,当m<n时,这个排列称为选排列;当m=n时,这个排列称为全排列。

重复排列(permutationwith repetiton)是一种特殊的排列。从n个不同元素中可重复地选取m个元素。按照一定的顺序排成一列,称作从n个元素中取m个元素的可重复排列。当且仅当所取的元素相同,且元素的排列顺序也相同,则两个排列相同。

2 组合 combination

组合(combination)是一个数学名词。一般地,从n个不同的元素中,任取m(m≤n)个元素为一组,叫作从n个不同元素中取出m个元素的一个组合。我们把有关求组合的个数的问题叫作组合问题。

组合总数(total number of combinations)是一个正整数,指从n个不同元素里每次取出0个,1个,2个,…,n个不同元素的所有组合数的总和。

重复组合(combination with repetiton)是一种特殊的组合。从n个不同元素中可重复地选取m个元素。不管其顺序合成一组,称为从n个元素中取m个元素的可重复组合。当且仅当所取的元素相同,且同一元素所取的次数相同,则两个重复组合相同。

3 组合数(组合总数)的计算方法C#源代码


using System;

namespace Legalsoft.Truffer
{
    public static partial class XMath
    {
        /// <summary>
        /// 计算组合数C(M,N) M>=N
        /// </summary>
        /// <param name="M"></param>
        /// <param name="N"></param>
        /// <returns></returns>
        public static int Combine(int M, int N)
        {
            ulong ret = 1L;
            for (int i = M - N + 1; i <= M; i++)
            {
                ret *= (ulong)i;
            }
            for (int i = 2; i <= N; i++)
            {
                ret /= (ulong)i;
            }
            return (int)ret;
        }
    }
}

4 计算组合数的数据溢出问题

上述的代码,计算 C(12,5) 是没有问题的。但是,如果计算 C(100,50)!

结果 = 0 !!!

这是因为太多的数相乘,超过了 ulong 允许的最大数,这就是数据超界的问题。

5 组合总数递归算法的C#源程序

namespace Legalsoft.Truffer
{
    public static partial class XMath
    {
        /// <summary>
        /// 计算组合数C(M,N) M>=N
        /// </summary>
        /// <param name="M"></param>
        /// <param name="N"></param>
        /// <returns></returns>
        public static int Combine_Recursion(int M, int N)
        {
            if (M < N) return 0;
            if (M <= 0 || N <= 0) return 1;
            return Combine_Recursion(M - 1, N) + Combine_Recursion(M - 1, N - 1);
        }
    }
}

递归算法可解决数值溢出问题,但会带来堆栈溢出问题,可谓“按下葫芦浮起瓢”。

6 计算组合数的追溯法(BackTrack,亦称回溯法)C#源代码

using System;

namespace Legalsoft.Truffer
{

    public static partial class XMath
    {
        private static int num = 0;
        private static ulong bestnum = 0L;
        /// <summary>
        /// 追溯法计算组合数
        /// </summary>
        /// <param name="M"></param>
        /// <param name="N"></param>
        /// <returns></returns>
        public static ulong Combine_Backtrack(int M, int N)
        {
            num = 0;
            bestnum = 0L;
            BackTrack(1, M, N);
            return bestnum;
        }

        /// <summary>
        /// 内部递归函数
        /// </summary>
        /// <param name="k"></param>
        /// <param name="n"></param>
        /// <param name="m"></param>
        private static void BackTrack(int k, int n, int m)
        {
            if (k > n)
            {
                if (num == m)
                {
                    bestnum++;
                }
            }
            else
            {
                for (int i = 0; i <= 1; i++)
                {
                    if (i == 0)
                    {
                        BackTrack(k + 1, n, m);
                    }
                    else
                    {
                        if (num <= m)
                        {
                            num = num + 1;
                            BackTrack(k + 1, n, m);
                            num = num - 1;
                        }
                    }
                }
            }
        }
    }
}

世界上没有十全十美的人,也没有十全十美的事!

回溯算法同样存在大问题,而且是致命问题:

(1)计算效率太低,速度太慢!

(2)另外会导致堆栈溢出问题。

大数的组合 有其他计算方法,以后再介绍。

本文暂且做个了解。

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

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

相关文章

vs code c语言断点调试window版解决方案

序&#xff1a; 1、这一步不懂劝退多少人&#xff0c;博主搜到了多少博文都是mac的&#xff0c;结果发现都对不上&#xff01; 先看最终效果演示 接下去我每个步骤&#xff0c;你都仔细看&#xff0c;漏看一个环境都对不上&#xff01; 正文 1、先去看博主的c/c运行环境配置图…

10-vue3动画

文章目录1.vue的transition动画1.1transition的基本使用1.2transition组件的原理1.3过渡动画的class1.4class的命名规则和添加时机1.5显示的指定过渡时间1.6过渡的模式mode1.7动态组件的切换1.8.appear初次渲染2、animation动画2.1同时设置animation和transition3.结合第三方库…

【Bard】来自谷歌的“吟游诗人”

个人主页&#xff1a;【&#x1f60a;个人主页】 文章目录前言Bard与相关产品的对比Bard VS 弱智吧来自对手的评论ChatGPT文心一言总结&#xff1a;前言 相比较ChatGPT的话题不断&#xff0c;谷歌的“Bard”显然低调了许多&#xff0c;在“画大饼”失败一个多月后&#xff0c…

【Python开发手册】深入剖析Google Python开发规范:规范Python注释写作

&#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是Zeeland&#xff0c;全栈领域优质创作者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 我的博客&#xff1a;Zeeland&#x1f4da; Github主页: Undertone0809 (Zeeland) (github.com)&…

高通开发系列 - linux kernel内核升级msm-4.9升级至msm-4.19(2)

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 MDSS PLL驱动问题msm-4.19内核适配nand flashMDSS PLL驱动问题 | /home/peeta/sc262R_private_rl/build-msm8909/tmp/work-shared/ms…

第01章_Java语言概述

第01章_Java语言概述 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 1. Java知识脉络图 1.1 Java基础全程脉络图 1.2 本章专题与脉络 2. 抽丝剥茧话Java 2.1 当前大学生就业形势 麦可思研究院…

C++之红黑树

文章目录前言一、概念二、性质三、结点的定义四、红黑树的结构五、插入操作1.插入代码2.左单旋3.右单旋4.插入新结点的情况分析与总结第一步、按照搜索二叉树的规则插入新结点第二步、分析插入结点后红黑树的性质是否被破坏动态演示&#xff1a;六、验证红黑树1.检测是否满足二…

口令暴力破解--Telnet协议暴力破解、数据库暴力破解与远程桌面暴力破解

Telnet协议暴力破解 Telnet Telnet协议是TCP/IP协议族中的一员&#xff0c;是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。要开始一个telnet会话&#xff0c;必须输入用户名和密码来登录服务器。而一般服务器不会对用户名…

【数据结构】6.4 AVL树(C++)

【数据结构】——6.4 AVL树 没有学过二叉搜索树&#xff08;也叫二叉排序树或二叉查找树&#xff09;的小伙伴们建议先学习一下&#xff0c;这样阅读会更轻松哦 点我学习二叉搜索树 目录一、AVL树的概念1. 二叉搜索树的问题2. AVL树的性质二、AVL树实现平衡的方法1. 更新平衡因…

【音视频第11天】GCC论文阅读(2)

A Google Congestion Control Algorithm for Real-Time Communication draft-alvestrand-rmcat-congestion-03论文理解 看中文的GCC算法一脸懵。看一看英文版的&#xff0c;找一找感觉。 目录Abstract1. Introduction1.1 Mathematical notation conventions2. System model3.Fe…

Shader 海面/水面

首先用Terrain在场景中随便做个地形&#xff0c;当作海底 上面加个Plane作为海面 实现海水效果要考虑海水深度对颜色的影响&#xff0c;法线移动形成波浪&#xff0c;菲涅尔&#xff0c;高光等效果 深度 海水深的地方颜色深&#xff0c;浅的地方颜色浅&#xff0c;所以海边和…

fastDFS文件管理系统在linux下部署

1.概述 fastDFS分布式文件系统包括三个中要部分&#xff1a;追踪器、存储节点、客户端&#xff0c;可以使用文件存储&#xff0c;文件同步&#xff0c;文件访问等功能&#xff0c;用来存储大容量数据 存储节点集群&#xff1a; 横向扩容&#xff1a;增加存储容量 纵向扩容&…

liunx系统(VMware Workstation Pro)详细安装配置docker

​ 安装东西前要知道docker是什么,以及docker能都干什么,文章都是本人亲测然后写的过程. http://t.csdn.cn/iqbGg 博客文章链接详细介绍docker,以及部署MySQL,nginx等配置 一. liunx系统(VMware) 安装Docker 1. Docker中文网地址: Docker中文网 官网 (p2hp.com) 2. 打开VM…

50 Projects 50 Days - Progress Steps 学习记录

50 Projects 50 Days不使用任何前端框架&#xff0c;适合初学者练手&#xff0c;巩固前端基础&#xff0c;在这里记录一下学习过程&#xff0c;尤其是一些细节上的问题。 项目地址 Progress Steps 展示效果 Progress Steps 实现思路 进度条和结点分开处理&#xff1a; 1…

深入理解计算机系统第九章知识点总结

第九章 一些术语 PA(physical address)&#xff1a;物理地址VA(virtual address)&#xff1a;虚拟地址MMU(memory management unit)&#xff1a;内存管理单元VP(virtual page)&#xff1a;虚拟页PP(physical page)&#xff1a;物理页/页帧SRAM&#xff1a;表示位于CPU和主存之…

详解Spring事务

目录 1.声明式事务 1.1.概述 1.2.使用 1.2.1.建表 1.2.2.maven依赖 1.2.3.配置 1.2.4.业务 1.2.5.测试 2.事务的传播行为 1.声明式事务 1.1.概述 spring中事务分为两种&#xff1a; 1.编程式事务&#xff0c;通过写代码来实现&#xff0c;每一步。 2.声明式事务&am…

华为手表开发:WATCH 3 Pro(15)传感器订阅加速度计

华为手表开发&#xff1a;WATCH 3 Pro&#xff08;15&#xff09;传感器订阅加速度计初环境与设备加速度传感器介绍与说明鸿蒙开发文件夹&#xff1a;文件重点新增展示的文本标记index.hmlindex.cssindex.js初 希望能写一些简单的教程和案例分享给需要的人 鸿蒙可穿戴开发 环…

Elasticsearch:索引状态是红色还是黄色?为什么?

在我之前文章 “Elasticsearch&#xff1a;如何调试集群状态 - 定位错误信息” 中&#xff0c;我有详细介绍如何调试集群状态。在今天的文章中&#xff0c;我将详细介绍如何故障排除和修复索引状态。 Elasticsearch 是一个伟大而强大的系统&#xff0c;特别是创建一个可扩展性极…

C++、STL标准模板库和泛型编程 ——关联式容器 (侯捷)

C、STL标准模板库和泛型编程——关联式容器 &#xff08;侯捷&#xff09;&#xff08; 持续更新&#xff01;&#xff01;&#xff01;&#xff09; 关联式容器rb_tree 容器set、multiset 容器map、multimap容器C、STL标准模板库和泛型编程——序列式容器 &#xff08;侯捷&am…

go+vue——go入门

govue技术选择入坑理由需要搭建前后端&#xff0c;Java 0 基础 &#xff0c;环境容易出现问题&#xff1b;GO上手快&#xff0c;问题少推荐&#xff1a;【七米】代码博客搭建Go语言开发环境下载 并 安装检查是否安装好&#xff1f;GOPROXY 非常重要&#xff08;帮你下载国外、G…