C#,排列组合的堆生成法(Heap’s Algorithm for generating permutations)算法与源代码

1 排列组合的堆生成法

堆生成算法用于生成n个对象的所有组合。其思想是通过选择一对要交换的元素,在不干扰其他n-2元素的情况下,从先前的组合生成每个组合。

下面是生成n个给定数的所有组合的示例。

示例:

输入:1 2 3

输出:1 2 3

2 1 3

3 1 2

1 3 2

2 3 1

3 2 1

2 算法

算法生成(n-1)!前n-1个元素的排列,与其中每个元素相邻的最后一个元素。这将生成以最后一个元素结尾的所有置换。

如果n为奇数,则交换第一个和最后一个元素,如果n为偶数,则交换第i个元素(i是从0开始的计数器)和最后一个元素,并重复上述算法,直到i小于n。

在每次迭代中,算法将生成以当前最后一个元素结尾的所有组合。

3 源程序

using System;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    public static partial class Algorithm_Gallery
    {
        public static void Heap_Permutation(ref int[] a, int size, int n)
        {
            if (size == 1)
            {
                return;
            }

            for (int i = 0; i < size; i++)
            {
                Heap_Permutation(ref a, size - 1, n);
                if (size % 2 == 1)
                {
                    int temp = a[0];
                    a[0] = a[size - 1];
                    a[size - 1] = temp;
                }
                else
                {
                    int temp = a[i];
                    a[i] = a[size - 1];
                    a[size - 1] = temp;
                }
            }
        }
    }
}
 

相关文章摘要:

摘要来源icon-default.png?t=N7T8https://cdmd.cnki.com.cn/Article/CDMD-10269-1012434174.htm

堆是最基本的数据结构之一,对堆进行枚举,可以作为堆各类算法复杂性分析的有力工具,有着重要的意义。
堆的枚举一方面是计数,另一方面是生成。计数即推导公式计算出具有某种特征的堆的总数目;生成即一个一个地产生所有的具有某类特点的堆。堆是一种重要的二叉树,在数据排序、优先级队列、最短路径和最小生成树的求解以及一些网络优化问题上都有广泛的应用。
本文先对已有的枚举算法进行研究,分析不同算法的时间复杂度和空间复杂度,这包括二叉树的枚举和最大值堆的枚举以及左倾堆的枚举,在已有的堆枚举生成算法基础上,本文主要完成了以下工作: 首先结合对堆中各子树结点数以及堆结构的研究,以提高堆枚举生成算法的空间复杂度为目的,本文提出了“基于排列”的最大值堆的枚举生成算法。即在给定数中,通过排列组合算法,生成所有的排列,对排列进行判断,选出能够成为最大值堆中序序列的排列,运用此排列构造对应的最大值堆。考虑到最大值堆结构的递归性质,本文继续将判断的过程递归化,即以排列中的最大值为分界点(最大值作为堆的根结点),递归判断左排列(排列中最大值左边的序列)和右排列(排列中最大值右边的序列),是否能够分别构成堆左子树和右子树的中序序列。递归化的判断过程则是将已有排列划分成更多、更小的排列来判断。较之以往的最大值堆生成算法,基于排列的生成算法避免了以往两个互动栈所需O(n)的存储空间。 其次,本文在已有的“单个数判断法”和“层次判断法”的基础上,提出了“至下而上”的最大值堆的枚举生成算法。即该算法通过“单个数判断法”,先生成堆中最深层次中的结点;当已经生成堆中完整的一层时,通过“层次判断法”来判断是否满足堆中的一层,如果满足,则继续生成堆中往上一个层次的结点,不满足则重新生成该层,即由深层次向低层次构造一个堆。在以往的生成堆的过程中,主要考虑的是整个堆的生成,它从根结点开始,一层层往下生成一个完整的堆,只有在生成整个堆的时候,才可以知道堆的最后一层的元素及叶子结点的值。而“至下而上”的堆的生成改进了上述的不足,在生成堆的过程中,提前知道底层结点的值。为今后堆研究过程中,对底层结点的运用提供了一个可靠的方法。相比较“基于排列”的枚举算法,本算法在空间复杂度上,增加了O(n)的存储空间。但是“至下而上”的最大值堆的枚举生成算法,采用“单个数判断法”和“层次判断法”两个基本方法减少了冗余步骤的生成。实验表明,本算法的生成时间开销相比较“基于排列”的枚举算法平均减少了80%。 本文的最后,对所有堆的枚举算法进行了总结,并且提出了对堆枚举生成算法的改进方法和展望。以上这些工作为进一步研究堆的性质提供了有力的帮助,也为今后进一步的研究奠定了基础。

4 源代码

using System;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{public static partial class Algorithm_Gallery{public static void Heap_Permutation(ref int[] a, int size, int n){if (size == 1){return;}for (int i = 0; i < size; i++){Heap_Permutation(ref a, size - 1, n);if (size % 2 == 1){int temp = a[0];a[0] = a[size - 1];a[size - 1] = temp;}else{int temp = a[i];a[i] = a[size - 1];a[size - 1] = temp;}}}}
}

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

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

相关文章

docker安装ES、LogStash、Kibana

文章目录 一、安装Elasticsearch1. 安装Elasticsearch2. 安装IK分词器3. elasticsearch-head 监控的插件4. 配置跨域 二、安装LogStash三、安装kibana四、SpringBoot集成LogStash&#xff0c;将日志输出到ES中五、 启动项目&#xff0c;监控项目运行 提示&#xff1a;以下是本篇…

用这几个工具,写一份简单的产品说明书

产品说明书是任何产品必不可少的一部分。在这个高速运转的消费市场&#xff0c;一份清晰、明了的产品说明书可以让你的产品在同类产品中脱颖而出。然而&#xff0c;制作一份专业级别的产品说明书可能看起来是个挑战。幸运的是&#xff0c;有很多强大的工具可以帮助你轻松制作产…

深入理解Rem适配:移动端网页设计的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Flutter学习9 - http 中 get/post 请求示例

1、配置 http pubspec.yaml dependencies:http: ^0.13.4flutter:sdk: flutterhttp 库最新插件版本查看&#xff1a;https://pub.dev/packages/http不一定要用最新版本 http&#xff0c;要使用项目所能支持的版本 .dart import package:http/http.dart as http;2、示例 &a…

【粉丝福利第四期】:《低代码平台开发实践:基于React》(文末送书)

文章目录 前言一、React与低代码平台的结合优势二、基于React的低代码平台开发挑战三、基于React的低代码平台开发实践四、未来展望《低代码平台开发实践&#xff1a;基于React》五、粉丝福利 前言 随着数字化转型的深入&#xff0c;企业对应用开发的效率和灵活性要求越来越高…

【C++】手撕string类(超实用!)

前言 一、标准库中的string类 1.1 string类介绍 1.2 string的常用接口 1.2.1 常用的构造函数 1.2.2 容量操作接口 &#xff08;1&#xff09;size &#xff08;2&#xff09;capacity &#xff08;3&#xff09;empty &#xff08;4&#xff09;clear &#xff08…

gRPC-第二代rpc服务

在如今云原生技术的大环境下&#xff0c;rpc服务作为最重要的互联网技术&#xff0c;蓬勃发展&#xff0c;诞生了许多知名基于rpc协议的框架&#xff0c;其中就有本文的主角gRPC技术。 一款高性能、开源的通用rpc框架 作者作为一名在JD实习的Cpper&#xff0c;经过一段时间的学…

(vue)适合后台管理系统开发的前端框架

(vue)适合后台管理系统开发的前端框架 1、D2admin 开源地址&#xff1a;https://github.com/d2-projects/d2-admin 文档地址&#xff1a;https://d2.pub/zh/doc/d2-admin/ 效果预览&#xff1a;https://d2.pub/d2-admin/preview/#/index 开源协议&#xff1a;MIT 2、vue-el…

计算机网络——概述

计算机网络——概述 计算机网络的定义互连网&#xff08;internet&#xff09;互联网&#xff08;Internet&#xff09;互联网基础结构发展的三个阶段第一个阶段——APPANET第二阶段——商业化和三级架构第三阶段——全球范围多层次的ISP结构 ISP的作用终端互联网的组成边缘部分…

嵌入式学习36-TCP要点及http协议

TCP发送文件的粘包问题 1. 例&#xff1a; 发端 1.flv-------->收端 1.flv csfga 2.解决 1. sleep&#xff08;1&#xff09; 延时发送 2.自…

服务器又被挖矿记录

写在前面 23年11月的时候我写过一篇记录服务器被挖矿的情况&#xff0c;点我查看。当时是在桌面看到了bash进程CPU占用异常发现了服务器被挖矿。 而过了几个月没想到又被攻击&#xff0c;这次比上次攻击手段要更高明点&#xff0c;在这记录下吧。 发现过程 服务器用的是4090…

【文档智能】再谈基于Transformer架构的文档智能理解方法论和相关数据集

前言 文档的智能解析与理解成为为知识管理的关键环节。特别是在处理扫描文档时&#xff0c;如何有效地理解和提取表单信息&#xff0c;成为了一个具有挑战性的问题。扫描文档的复杂性&#xff0c;包括其结构的多样性、非文本元素的融合以及手写与印刷内容的混合&#xff0c;都…

ai语音克隆:用AI大模型开发点亮你的创作天地!

在当今快速发展的科技时代&#xff0c;人工智能技术已经深入到我们生活的方方面面。AI语音克隆作为其中的一种应用&#xff0c;正在逐渐走进人们的视野&#xff0c;为人们的创作提供了全新的可能性。 人类创作的过程往往是一个灵感迸发、思绪飞扬的过程。但有时候&#xff0c;…

实现QT中qDebug()的日志重定向

背景&#xff1a; 在项目开发过程中&#xff0c;为了方便分析和排查问题&#xff0c;我们需要将原本输出到控制台的调试信息写入日志文件&#xff0c;进行持久化存储&#xff0c;还可以实现日志分级等。 日志输出格式&#xff1a; 我们需要的格式包括以下内容&#xff1a; 1.…

eclipse搭建java web项目

准备条件 eclipsejdk1.8 &#xff08;配置jdk环境&#xff09;apache-tomcat-8.5.97&#xff08;记住安装位置&#xff09; 一 点击完成 开始创建javaweb项目 import java.io.IOException; import java.io.PrintWriter;import javax.servlet.ServletException; import javax.s…

Neo4j安装 Linux:CentOS、openEuler 适配langchain应用RAG+知识图谱开发 适配昇腾910B

目录 Neo4j下载上传至服务器后进行解压运行安装JAVA再次运行在windows端打开网页导入数据 Neo4j下载 进入Neo4j官网下载页面 向下滑动找到 Graph Database Self-Managed 选择 社区版&#xff08;COMMUNITY&#xff09; 选择 Linux / Mac Executable Neo4j 5.17.0 (tar) 单机下…

Android Studio编译及调试知识

文章目录 Android Studio编译kotlin项目Android Studio编译Java和kotlin混合项目的过程gradle打印详细错误信息&#xff0c;类似这种工具的使用Android apk 从你的代码到APK打包的过程&#xff0c;APK安装到你的Android手机上的过程&#xff0c;最后安装好的形态&#xff0c;以…

【Kotlin】类和对象

1 前言 Kotlin 是面向对象编程语言&#xff0c;与 Java 语言类似&#xff0c;都有类、对象、属性、构造函数、成员函数&#xff0c;都有封装、继承、多态三大特性&#xff0c;不同点如下。 Java 有静态&#xff08;static&#xff09;代码块&#xff0c;Kotlin 没有&#xff1…

Python算法题集_搜索二维矩阵

Python算法题集_搜索二维矩阵 题74&#xff1a;搜索二维矩阵1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【矩阵展开为列表二分法】2) 改进版一【行*列区间二分法】3) 改进版二【第三方模块】 4. 最优算法5. 相关资源 本文为Python算法题集之…

二分/树上第k短路,LeetCode2386. 找出数组的第 K 大和

一、题目 1、题目描述 给你一个整数数组 nums 和一个 正 整数 k 。你可以选择数组的任一 子序列 并且对其全部元素求和。 数组的 第 k 大和 定义为&#xff1a;可以获得的第 k 个 最大 子序列和&#xff08;子序列和允许出现重复&#xff09; 返回数组的 第 k 大和 。 子序列是…