PPT 生成整数序列字典序的r-组合算法

news/2024/7/6 0:09:47 标签: 算法, PPT, 字典序, r-组合, 组合的构造

生成整数序列字典序r-组合算法

  • 一、PPT效果展示
  • 二、问题
    • 2.1 简述
    • 2.2 算法简述
    • 2.3 例子
  • 三、PPT实现

PPT_1">一、PPT效果展示

在这里插入图片描述

二、问题

2.1 简述

给定一个整数序列 (1,2,3,…n),输出其所有字典序r-组合,注意事项:

  1. 所有组合不能重复,每个组合中的元素顺序需为字典序 (从小到大)
  2. 所有组合呈字典序 (后一组合 > 前一组合)

例:给定整数序列123456,求其4-组合
开始组合:1234
中间组合:1235,1236,1245,…
结束组合:3456

2.2 算法简述

给定一个整数序列(1,2,3,...n),其r-组合

  1. 其必从{ 1 , 2 , . . . , r 1,2,...,r 1,2,...,r}开始,到{ n − r + 1 , . . . , n − 1 , n n-r+1,...,n-1,n nr+1,...,n1,n}结束
  2. 存在最大的一个整数 k ∈ { 1 , . . . , r } k\in \{1,...,r\} k{1,...,r},使得 A k + 1 ≤ n A_k + 1 \leq n Ak+1n A k ∉ A A_k\notin A Ak/A ( A A A为当前组合, A k A_k Ak不属于当前组合)
  3. 新的组合 A = A = A= { A 1 , . . . , A k − 1 , A k + 1 , . . . , A k + r − k + 1 A_1, ..., A_{k-1}, A_k+1, ..., A_k+r-k+1 A1,...,Ak1,Ak+1,...,Ak+rk+1}
    其中, A 1 , . . . , A k − 1 A_1, ..., A_{k-1} A1,...,Ak1是上一个组合的前一部分,新的组合从 A k A_k Ak开始更新

(个人理解)核心思想就是:由于现组合中的元素为字典序,选取最大 k k k以及使用 A k + 1 , A k + 2 , . . . A_k + 1, A_k+2, ... Ak+1,Ak+2,... 替换 A k A_k Ak及其后的元素,即可保证替换后依旧为字典序,且刚好比前一组合大“一点”

2.3 例子

例:整数序列1-6的4-组合,从1236 -> 1245: A = A = A= { A 1 = 1 , A 2 = 2 , A 3 = 3 , A 4 = 6 A_1=1, A_2=2, A_3=3, A_4=6 A1=1,A2=2,A3=3,A4=6}

  1. k = 4 k=4 k=4 A 4 = 6 A_4 = 6 A4=6 A 4 + 1 > 6 A_4 + 1 > 6 A4+1>6,不符合条件。
  2. 存在最大的 k = 3 k=3 k=3,使得 A 3 + 1 = 4 A_3+1 = 4 A3+1=4,4小于6且不属于1236。
  3. 新的组合从 A 3 A_3 A3开始更新,即 { A 1 , A 2 , A 3 + 1 , A 3 + 4 − 3 + 1 A_1,A_2,A_3+1,A_3+4-3+1 A1,A2,A3+1,A3+43+1} =
    { 1 , 2 , 3 + 1 , 3 + 4 − 3 + 1 1, 2 ,3+1, 3+4-3+1 1,2,3+1,3+43+1} = { 1 , 2 , 4 , 5 1,2,4,5 1,2,4,5}

PPT_29">三、PPT实现

可到博客顶端 or 通过此链接 进入资源页下载完整PPT,放映即可用

亦可自行开发:在PPT左上角选择开发工具
主要控件:文本框 和 按钮
在这里插入图片描述

核心源码:

Public Sub F()
    s_all = T_in.Text
    n = Len(T_in.Text)
    num = T_num.Text
    s = L_c.Caption
    k = 0
    ak = 0
    flag = 0
    
    ' 计算k和Ak
    For i = 1 To num
        flag = 1
        ' 如果大于n 则直接退出
        a = Mid(s, i, 1) + 1
        If (Val(a) > n) Then
            Exit For
        End If
        For j = i To num
            ' 如果不符合条件 标志位set为0 跳出循环
            b = Mid(s, j, 1)
            If (StrComp(a, b, 1) = 0) Then
                flag = 0
                Exit For
            End If
        Next j
        If StrComp(flag, 1, 0) = 0 Then
             k = i
        End If
    Next i
 
    
    L_k.Caption = k
    L_ak.Caption = Mid(s, k, 1)
    ak = L_ak.Caption
    
    ' 下一个组合
    For i = num To k Step -1
        'Dim tmp As String
        'tmp = ak - k + 1 + i s_all
        's = Replace(s, Mid(s, i, 1), Mid(s_all, ak - k + 1 + i, 1))
        Mid(s, i, 1) = Mid(s_all, ak - k + 1 + i, 1)
    Next i
    
    L_next.Caption = s
End Sub

Private Sub B_next_Click()
    s_all = T_in.Text
    n = Len(T_in.Text)
    num = T_num.Text
    L_c.Caption = L_next.Caption
    T_show = T_show + L_c.Caption + vbCr + vbLf
    If StrComp(L_c.Caption, Mid(s_all, n - num + 1, num), 1) = 0 Then
        MsgBox "已经是最后一个组合了"
        Exit Sub
    End If
    Call F
    'current = L_c.Caption
    'MsgBox current
    'MsgBox num
    'current = Replace(current, Mid(current, 1, 1), Mid(s, 2, 1))
    'MsgBox current
End Sub

Private Sub B_s_Click()
    s = T_in.Text
    num = T_num.Text
    L_c.Caption = Mid(s, 1, num)
    T_show = ""
    T_show = T_show + L_c.Caption + vbCr + vbLf
    Call F
End Sub

Private Sub T_show_Change()

End Sub

可参考的C源码

r-组合: https://blog.csdn.net/ld326/article/details/84341452


http://www.niftyadmin.cn/n/5018139.html

相关文章

Linux内存管理--smaps内存

一、内存的两个概念 了解smaps内存之前要先搞清楚Linux内存管理中的虚拟内存(Virtual Memory)和驻留内存(Resident Memory)两个概念。 1、虚拟内存 首先需要强调的是虚拟内存不同于物理内存,虽然两者都包含内存字眼…

Python 之使用Numpy库来加载Numpy(.npy)文件并检查其内容

文章目录 总的介绍data.dtypedata.shapedata.ndimdata.size 总的介绍 要判断一个Numpy(.npy)文件的数据集类型,你可以使用Python中的Numpy库来加载该文件并检查其内容。以下是一些常见的步骤: 导入Numpy库: 首先&…

Java面向对象学习笔记-3

前言 本文将介绍Java编程中的一些基本概念和用法,包括类、接口、抽象类、继承、多态和组合等。通过代码示例,我们将深入探讨这些概念,帮助读者更好地理解如何使用Java进行面向对象编程。 纸张和墨盒类 我们首先来看纸张和墨盒类&#xff0…

Vue3-devtools开发者工具安装方法

因为最近在学习Vue3,但是之前找到的Vue3-Devtools失效了,那就来下载安装下 下载安装 Github下载地址:Vue3-Devtools 这个链接快点:Vue3-Devtools 点击链接后页面如下 点击main选项,下拉列表往下拉,找到你想要的版…

地理地形sdk:Tatuk GIS Developer Kernel for .NET Crack

Tatuk GIS Developer Kernel for .NET 是一个变体,它是受控代码和 .NET GIS SDK,用于为用户 Windows 操作系统创建专业 GIS 软件的过程。它被认为是一个完全针对Win Forms 的.NET CIL,WPF 框架是针对C# 以及VB.NET、VC、Oxy 以及最终与.NET 的…

中介模式简介

概念: 中介者模式(Mediator Pattern)是一种行为型设计模式,它通过引入一个中介者对象来解耦多个相关对象之间的交互。中介者充当了多个对象之间的协调者,使得这些对象不需要直接相互通信,而是通过与中介者…

Modelsim仿真问题解疑三:LM_LICENSE_FILE与Vivado命名冲突

现象: modelsim和Vivado同一时间只能使用一个,另一个会报license相关的错误 原因: modelsim和Vivado的环境变量名称都为LM_LICENSE_FILE,值配置为其中一个时会导致另一个值被覆盖 解决: 对LM_LICENSE_FILE同时配置modelsim和v…

蓝桥杯备赛Day8——队列

大家好,我是牛哥带你学代码,本专栏详细介绍了蓝桥杯备赛的指南,特别适合迎战python组的小白选手。专栏以天作为单位,定期更新,将会一直更新,直到所有数据结构相关知识及高阶用法全部囊括,欢迎大家订阅本专栏! 队列也属于基础数据结构。 队列概念 队列是一种数据结构,…