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.hqwc.cn/news/527547.html

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

相关文章

解决Gradle下载过慢问题的有效方式:使用国内镜像站点

前言 在开发过程中&#xff0c;我们经常会遇到Gradle下载速度缓慢或超时的问题。作为一个强大而流行的构建工具&#xff0c;Gradle是许多项目中必不可少的一部分。然而&#xff0c;由于官方下载地址可能受网络限制影响&#xff0c;导致下载速度较慢。针对这个问题&#xff0c;…

数字化转型导师坚鹏:科技创新产业发展研究及科技金融营销创新

科技创新产业发展研究及科技金融营销创新 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚科技创新产业的发展现状&#xff1f; 不知道科技金融有哪些成功的案例&#xff1f; 不知道科技金融如何进行营销创新&#xff1f; 课程特色&#xff1a; 以案例…

如何在Mapbox GL中处理大的GEOJSON文件

Mapbox GL可以将 GeoJSON 数据由客户端(Web 浏览器或移动设备)即时转换为 Mapbox 矢量切片进行显示和处理。本文的目的是教大家如何有效加载和渲染大型 GeoJSON 源,并优化渲染显示速度,增强用户体验,减少客户端卡顿问题。本文以Mapbox 为例,至于其它框架原理大致相同,可…

【神经网络与深度学习】LSTM(Long Short-Term Memory)神经网络模型

概述 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种特殊的循环神经网络&#xff08;RNN&#xff09;结构&#xff0c;通常被用于处理和学习时间序列数据。因此&#xff0c;LSTM属于深度学习领域中的一种神经网络模型。 在深度学习中&#xff0c;LSTM被广泛应用于…

Redis基础篇:初识Redis(认识NoSQL,单机安装Redis,配置Redis自启动,Redis客户端的基本使用)

目录 1.认识NoSQL2.认识Redis3.安装Redis1.单机安装Redis2.配置redis后台启动3.设置redis开机自启 4.Redis客户端1.Redis命令行客户端2.图形化桌面客户端 1.认识NoSQL NoSQL&#xff08;Not Only SQL&#xff09;数据库是一种非关系型数据库&#xff0c;它不使用传统的关系型数…

SpringBoot项目没有启动按键

问题一&#xff1a; pom文件正常&#xff0c;但是springboot包报红&#xff0c;同时Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found报红 解决办法&#xff1a; 无法识别使用哪个版本的 spring-boot-maven-plugin 包 <build><plugins>&…

【脚本玩漆黑的魅影】寂雨镇全自动练级

文章目录 原理全部代码 原理 老样子。 治疗路径&#xff0c;练级路径。 def zhi_liao(): # 去治疗walk(RIGHT)walk(RIGHT)press(UP, 0.4)for i in [1, 2, 3, 4]:press(A)for i in [1, 2, 3, 4]:press(B)press(DOWN, 0.4)press(LEFT) def chu_qu(): # 右逛c.press(B)press(…

备战蓝桥杯Day25 - 二叉搜索树

一、基本概念 二叉搜索树&#xff08;Binary Search Tree&#xff09;&#xff0c;又称为二叉查找树或二叉排序树&#xff0c;是一种具有特定性质的二叉树。 定义&#xff1a;二叉搜索树可以是一棵空树&#xff0c;也可以是具有以下特性的非空二叉树&#xff1a; 若其左子树不…

denied: requested access to the resource is denied报错解决

Docker 镜像在文件中包含一组指令&#xff0c;可在 Docker 容器中执行代码。大多数情况下&#xff0c;在创建 docker 镜像之后&#xff0c;当尝试将镜像推送到远程仓库时&#xff0c;会发生这种类型的报错“Docker denied: requested access to the resource is denied” 由于错…

Glip模型

Yolos 完全使用Transformer做目标检测 Detr 先使用CNN提取特征然后再使用transformerDetr和Yolos共同的缺点&#xff1a;需要事先知道所有的类别 Glip Zero-shot, 目标检测的类别可以不在训练类别中 目标框进行视觉编码&#xff0c;然后和文本进行匹配文本和视觉特征是通…

【MySQL | 第四篇】区分SQL语句的书写和执行顺序

文章目录 4.区分SQL语句的书写和执行顺序4.1书写顺序4.2执行顺序4.3总结4.4扩充&#xff1a;辨别having与where的异同&#xff1f;4.5聚合查询 4.区分SQL语句的书写和执行顺序 注意&#xff1a;SQL 语句的书写顺序与执行顺序不是一致的 4.1书写顺序 SELECT <字段名> …

️ IP代理实操指南:如何在爬虫项目中避免封禁和限制 ️‍♂️

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …