首页 > 编程语言 >Python-VBA编程500例-020-02(入门级)

Python-VBA编程500例-020-02(入门级)

时间:2024-03-27 09:30:38浏览次数:40  
标签:02 Dim VBA 组合 Python currIndex Long base half

第k个组合(The kth Combination)的问题在实际应用中具有广泛的用途,它涉及从n个不同元素中选出k个元素的所有可能组合。这种组合的概念在许多领域都有重要的应用,常见的一些具体应用有:

1、彩票与赌博:在某些彩票或赌博游戏中,参与者需要选择特定数量的号码或符号。这些号码或符号的组合就构成了可能的赢奖情况。通过计算第k个组合,可以分析中奖概率或设计游戏规则。

2、密码学:在密码学中,组合的概念用于生成和验证密码。通过计算第k个组合,可以生成具有特定长度和字符集的密码,从而增强密码的安全性。同时,也可以利用组合的概念来破解密码,但这通常需要大量的计算资源。

3、计算机科学:在计算机科学中,组合问题常常出现在算法设计和数据分析中。例如,在搜索算法中,可能需要遍历所有可能的组合以找到最优解。此外,在数据库查询优化、机器学习特征选择等方面,也需要考虑元素的组合问题。

4、生物信息学:在生物信息学领域,组合的概念用于分析基因序列、蛋白质结构等生物数据。通过计算特定元素(如氨基酸或核苷酸)的组合,可以揭示生物分子的结构和功能特性。

5、统计学与概率论:在统计学和概率论中,组合用于计算事件发生的可能性。例如,在抽样调查中,可能需要从总体中选出一定数量的样本,这时就需要考虑样本的组合情况。此外,在概率计算中,组合也用于确定不同事件同时发生的概率。

6、商业与市场分析:在商业和市场分析中,组合的概念用于分析不同产品、服务或营销策略的组合效果。通过计算不同组合的潜在收益和风险,企业可以制定更合理的商业决策。

总之,第k个组合的概念在实际应用中具有广泛的应用价值,它涉及从密码学到生物信息学等多个领域。通过深入理解和应用组合的概念,人们可以更好地解决实际问题并推动各领域的发展。

1、第k个组合(不限奇偶):

1-1、Python:
# 1.问题描述:
# 样本总数为n,编号分别为1,2,...,n.现需要从中挑选n/2或(n+1)/2人,有C(n, n/2)或C(n, (n+1)/2)种组合方式,
# 每一种组合方式按照编号从小到大排序,再将已排序的组合方式按照字典序排序,求第k个组合方式.
# 2.问题示例:
# 给定n=2,k=1,返回[1],所有组合方式按照字典序排序:[1],[2];
# 给定n=4,k=3,返回[1, 4],所有组合方式按照字典序排序:[1, 2],[1, 3],[1, 4],[2, 3],[2, 4],[3, 4].
# 3.代码实现:
class Solution:
    # 初始化一个用于计算组合数的矩阵C的方法
    # 计算组合数的矩阵C
    def init_Combinations(self, n):
        """
        初始化一个大小为(n+1) x (n+1)的二维列表C,所有元素初始化为0。
        使用 _ 作为变量名是一个编程约定,它表明“我们不在乎这个变量的值”。
        这样做的好处是提高了代码的可读性,因为它清楚地表明了这个变量在后续的代码中不会被使用。
        """
        C = [[0] * (n + 1) for _ in range(n + 1)]  # 初始化矩阵C
        # 设置矩阵C的第一列和对角线上的所有元素为1
        for i in range(n + 1):
            C[i][0], C[i][1] = 1, 1
        # 根据组合数的递推关系计算矩阵C的其他元素
        for i in range(1, n + 1):
            for j in range(1, i):
                C[i][j] = C[i - 1][j - 1] + C[i - 1][j]
        # 返回计算好的组合数矩阵C
        return C
    # 一个用于获取第k组组合的方法
    # 参数k: 需要寻找的组合组的序号
    # 参数n: 样本总数,即参与组合的元素个数
    # 返回值answer: 符合要求的组合组的有序排列(列表形式)
    def get_kth_Combination(self, n, k):
        # 调用init_Combinations方法初始化组合数矩阵C
        C = self.init_Combinations(n)
        # 初始化一个空列表用于存储结果,并设置当前索引为1
        answer = []
        curr_index = 1
        # 遍历从1到half_n的范围,用于找到满足条件的组合
        half_n = n // 2 if n % 2 == 0 else (n+1) // 2
        for i in range(1, n // 2 + 1):
            # 计算当前索引位置在矩阵C中的对应值
            base = C[n - curr_index][half_n - i]
            # 当k大于base时,继续向后寻找满足条件的索引
            while k > base:
                curr_index += 1
                base += C[n - curr_index][half_n - i]
            # 更新k的值,并从答案列表中减去对应的组合数
            base -= C[n - curr_index][half_n - i]
            k -= base
            # 将当前索引添加到答案列表中
            answer.append(curr_index)
            # 索引向后移动一位
            curr_index += 1
        # 返回找到的第k组组合的有序列表
        return answer
# 主函数
if __name__ == '__main__':
    # 设置总人数n为4
    n = 4
    # 设置需要查找的组合组序号k为3
    k = 3
    # 创建一个Solution对象
    solution = Solution()
    # 打印当前的总人数和需要查找的组合组序号
    print("总人数:", n, "找第k组:", k)
    # 调用get_kth_Combination方法获取第k组组合,并打印结果
    print("第k组:", solution.get_kth_Combination(n, k))
# 4.运行结果:
# 总人数: 4 找第k组: 3
# 第k组: [1, 4]
1-2、VBA:
Rem 自定义函数,功能:第k个组合(不限奇偶)
Function GetKthCombination(n As Long, k As Long) As Variant
    ' 定义Pascal三角形数组
    Dim C() As Long
    ' 循环变量
    Dim i As Long, j As Long
    ' 存储结果的数组
    Dim answer() As Variant
    ' 当前索引
    Dim currIndex As Long
    ' 临时存储基础值
    Dim base As Long
    ' 临时存储k值
    Dim tempK As Long
    '存储样本总量一半的值
    Dim half_n As Long
      
    ' 初始化Pascal三角形数组
    ReDim C(1 To n + 1, 1 To n + 1)
    ' 初始化Pascal三角形的第一列和对角线
    ' (第一列和对角线元素都是1)
    For i = 1 To n + 1
        C(i, 1) = 1
        C(i, i) = 1
    Next i
    ' 计算Pascal三角形的其余部分
    ' (利用组合数公式C(n,k) = C(n-1,k-1) + C(n-1,k))
    For i = 2 To n
        For j = 2 To i
            C(i, j) = C(i - 1, j - 1) + C(i - 1, j)
        Next j
    Next i
    ' 根据总人数n的奇偶性判断,求出中间值
    half_n = IIf(n Mod 2 = 0, n / 2, (n + 1) / 2)
    ' 初始化答案数组和当前索引
    ReDim answer(1 To half_n)
    currIndex = 1
    tempK = k
    ' 遍历Pascal三角形来找到第k个组合
    For i = 1 To half_n
        ' 获取基础值
        base = C(n - currIndex + 1, half_n - i + 1)
        ' 遍历直到tempK小于或等于base
        While tempK > base
            currIndex = currIndex + 1
            ' 更新base值
            base = base + C(n - currIndex + 1, half_n - i + 1)
        Wend
        ' 减去当前位置的组合数
        base = base - C(n - currIndex + 1, half_n - i + 1)
        ' 更新tempK
        tempK = tempK - base
        ' 将当前索引存入答案数组
        answer(i) = currIndex
        ' 索引加1,准备下一个元素的查找
        currIndex = currIndex + 1
    Next i
    ' 返回结果数组
    GetKthCombination = answer
End Function
Rem 执行过程,功能:调用自定义函数GetKthCombination,在立即窗口中输出结果
Sub TestRun()
    ' 定义变量
    Dim n As Long
    Dim k As Long
    Dim result As Variant
      
    ' 设置总人数n和需要查找的组合组序号k
    n = 4
    k = 3
    ' 调用自定义函数获取第k组组合
    result = GetKthCombination(n, k)
    ' 打印结果
    Debug.Print "总人数:" & n & " 找第k组:" & k
    ' 使用Join函数将数组元素用逗号连接成字符串
    Debug.Print "第k组:[" & Join(result, ",") & "]"
End Sub
'输出结果:
'总人数:4 找第k组:3
'第k组: [1,4]

注意:1-2中的代码需粘贴到你的VBA编辑器中,按F5执行TestRun程序,在立即窗口中输出结果。

2、相关文章:

2-1、Python-VBA编程500例-019-02(入门级) 

2-2、Python-VBA编程500例-020-01(入门级) 

Myelsa的Python算法之旅(高铁直达):https://myelsa1024.blog.csdn.net/article/details/136889623?spm=1001.2014.3001.5502
欢迎访问个人主页:非风V非雨-CSDN博客
欢迎志同道合者一起交流学习,我的QQ:94509325/微信:

标签:02,Dim,VBA,组合,Python,currIndex,Long,base,half
From: https://blog.csdn.net/ygb_1024/article/details/137059226

相关文章

  • [Python]细节与使用经验
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18031983出自【进步*于辰的博客】纯文字阐述,内容比较干。并且,由于考虑到时间长了恐有所遗漏,便即兴记录,并没有对内容进行筛选、排序。因此,大家在阅读时可以直接Ctrl+F进行......
  • 肖sir__python之模块7.1
    ython之模块一、模块的介绍(1)python模块,是一个python文件,以一个.py文件,包含了python对象定义和pyhton语句(2)python对象定义和python语句(3)模块让你能够有逻辑地组织你的python代码段。(4)把相关的代码分配到一个模块里能让你的代码更好用,更易懂(5)模块能定义函数,类和变量,模块里也能包含可......
  • 2023年信息安全管理与评估WAF部分解题思路
    2023年信息安全管理与评估WAF部分解题思路公司内部有一台网站服务器直连到WAF,地址是192.168.50.10,端口是8080,配置将访问日志、攻击日志、防篡改日志信息发送syslog日志服务器,IP地址是192.168.100.6,UDP的514端口编辑防护策略,在“专家规则”中定义HTTP请求体的最大长度为25......
  • python 常用包
    python对于从git下载的内容,进入包内使用以下命令: pythonsetup.pybuildinstall 对于whl包,可省去后面的whl直接安装,假如有whl包是test123.whlpipinstalltest123 pip: 是Python包管理工具,python的其它包安装一般都是通过pip操作。python3.4+自带有此包。下载......
  • 02-水平垂直网格布局理解
    1.之前使用布局基本都是创建带有UI界面的,并使用ui设计师进行布局,为了更直观理解水平与垂直布局,在miniqt工程基础上,实现水平垂直布局2.垂直布局VBoxLayout1#include<QApplication>2#include<QLabel>34#include<QHBoxLayout>5#include<QVBoxLayout>6#in......
  • 市场数据和金融数据API的获取步骤,支持Python、Java、Go等接入方式,轻松实现量化数据交
    今天我想分享一个非常实用的技术内容,即如何通过接口API来实现订阅并接入实时行情数据源的报价信息。这个技术可以帮助你获取最新的市场数据,为你的应用程序或交易策略提供及时的信息支持。接入实时行情数据源可以让你了解市场动态并快速作出决策,非常有助于优化你的交易策略和投资决......
  • 算法模板收集 (截至2024.3.26)
    准备线下比赛用的模板,会一直更新,但更新频率不高。找个代码托管平台放一下或许更合适,不过暂时没心思做这个。小提示:点击任意标题旁边的“显示目录导航”,再点击右上角的图钉可以固定目录。约定:所有区间操作都是在闭区间上进行的。编译器要支持gnu++11标准基本框......
  • VS2022软件打包 生成和事后事件处理
    VS2022软件打包生成和事后事件处理 示例目标:将编译后的文件拷贝到新的文件,并重命名方便软件打包 生成前:删除目标目录:rd/s/q"$(SolutionDir)..\setup\$(ConfigurationName)\"生成后-拷贝重命名:copy"$(TargetPath)"$(TargetDir)JCZX-2024.exe"copy"$(TargetPat......
  • Python中Keras微调Google Gemma:定制化指令增强大型语言模型LLM
    全文链接:https://tecdat.cn/?p=35476原文出处:拓端数据部落公众号像谷歌、Meta和Twitter这样的大公司正大力推动其大型语言模型(LLM)的开源。最近,谷歌DeepMind团队推出了Gemma——一个由与创建谷歌Gemini模型相同的研究和技术构建的轻量级、开源LLM系列。本文,我们将帮助客户了解Ge......
  • 【python】服务端和客户端 RESTful 接口上传 E
    哈喽,大家好,我是木头左,物联网搬砖工一名,致力于为大家淘出更多好用的AI工具!服务端代码1.安装Flask和Flask-RESTful需要安装Flask和Flask-RESTful这两个库。Flask是一个轻量级的Web框架,而Flask-RESTful则是一个为Flask添加了RESTfulAPI支持的扩展。pipinstall......