首页 > 编程问答 >N 选择 r 个可能性作为递增的二进制数

N 选择 r 个可能性作为递增的二进制数

时间:2024-07-26 14:01:06浏览次数:11  
标签:python combinatorics

我正在寻找一个输入 (n,r) 并输出我们可以从 n 个对象的字符串中选取 r 个对象的所有方法的函数。此外,我希望这个列表是一个递增的二进制序列。

例如:

(5,2)

将输出:[00011,00101,00110,01001,01010,01100,10001,10010 ,10100,11000]

我尝试通过考虑最右边的 1 并检查它是否可以“向左移动而不碰到另一个 1”来做到这一点。如果不能,那么我会转到下一个并检查同样的事情。如果任何 1 可以“向左移动”,则其右侧的每个 1 都会被“重置”。

尽管我的代码尚未尝试此方法。


def combinations(n, r):
  """
  生成从 n 个对象中选取 r 个对象的所有组合,表示为递增的二进制序列。

  Args:
    n: 对象的数量。
    r: 要选择的元素数量。

  Yields:
    表示组合的二进制序列。
  """

  c = [0] * (n - r) + [1] * r
  yield ''.join(map(str, c))

  while True:
    i = n - 1
    while c[i] == 1 and c[i - 1] == 0:
      i -= 1
    if i == 0:
      break
    c[i - 1], c[i] = c[i], c[i - 1]
    c[i + 1:] = sorted(c[i + 1:])
    yield ''.join(map(str, c))


# 示例用法:
for combo in combinations(5, 2):
  print(combo)

此代码通过将问题简化为生成 n 位长度的二进制字符串,其中恰好有 r 个 1 来工作,代表从 n 个元素中进行的 r 个选择。让我们分解一下代码是如何工作的:

  1. 初始化:
  2. 它首先创建一个列表 c ,该列表表示初始组合,其中 r 个 1 位于右侧, (n-r) 个 0 位于左侧。这种初始化确保我们从最小的词典组合开始。
  3. 生成组合:
  4. 它使用 yield 语句,使该函数成为生成器,一次生成一个组合,而无需将所有组合存储在内存中。
  5. 查找下一个组合:
  6. 该代码迭代当前组合 c ,从右到左(从索引 n-1 开始)。
  7. 它寻找一个可以向左移动的 1(表示为 c[i] == 1 c[i-1] == 0 的模式)。
  8. 当它找到一个可以移动的 1 时,它会将其与其左边的 0 交换。
  9. 为了确保我们生成词典顺序,它会对移动的 1 右侧的所有 1 进行排序( c[i+1:] = sorted(c[i+1:]) )。这样可以确保新组合始终大于前一个组合。
  10. 终止条件:
  11. 如果没有 1 可以向左移动(即,我们到达了列表的开头,并且 i == 0 ),这意味着我们已经生成了所有可能的组合,并且循环中断。

此算法可以有效地生成所有组合,并确保它们以递增的二进制顺序生成。

对于输入 (5, 2),的输出将是:

00011
00101
00110
01001
01010
01100
10001
10010
10100
11000

这与期望的输出完全一致。

标签:python,combinatorics
From: 78796423

相关文章

  • IT实战课堂计算机毕业设计源码精品基于Python的高校教育教材采购出入库进销存储信息管
    项目功能简介:《[含文档+PPT+源码等]精品基于Python的高校教育教材信息管理系统设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功以及课程答疑与微信售后交流群、送查重系统不限次数免费查重等福利!软件开发环境及开发工具:开......
  • 为什么我的 Python 脚本失败并出现 TypeError?
    我正在编写一个Python脚本,该脚本应该计算数字列表的总和。但是,当我运行代码时遇到TypeError这是一个最小的例子:numbers=[1,2,3,'4']total=sum(numbers)print(total)Theerrormessageis:TypeError:unsupportedoperandtype(s)for+:'int'and'str......
  • 如何通过socks代理传递所有Python的流量?
    有如何通过http代理传递所有Python的流量?但是,它不处理sock代理。我想使用sock代理,我们可以通过ssh隧道轻松获得它。ssh-D5005user@server你可以使用socks库,让你的Python代码通过SOCKS代理传递所有流量。这个库可以让你在套接字级别上指定代......
  • 如何在streamlit python中流式传输由LLM生成的输出
    代码:fromlangchain_community.vectorstoresimportFAISSfromlangchain_community.embeddingsimportHuggingFaceEmbeddingsfromlangchainimportPromptTemplatefromlangchain_community.llmsimportLlamaCppfromlangchain.chainsimportRetrievalQAimports......
  • python mysql操作
    pipinstallmysql-connector-pythonimportmysql.connector#配置数据库连接参数config={'user':'your_username','password':'your_password','host':'your_host','database'......
  • Python 中的面向对象编程
    一.介绍在本文中,我们将使用Python中的类和对象来探索基本的OOP概念。面向对象编程(OOP)是一种强大的方法,可帮助开发人员组织代码,使其易于理解、重用和维护。Python是一种灵活的语言,可以很好地支持OOP概念。1.类和对象类是创建对象的蓝图。它定义了该类的对象将......
  • 学习资源系列之《Python深度学习基于PyTorch》
     前言近期应部分读者朋友的强烈邀请,希望推荐一本python深度学习实操的书籍。呐,今天为大家推荐小编偶然发现的这一本珍藏好书:《Python深度学习基于PyTorch》,文末附电子版获取方式《Python深度学习基于PyTorch》BriefIntroduction前言面对众多的深......
  • 如何使用Python实现语音转文字/字幕
    文章目录......
  • Python 教程(三):字符串特性大全
    目录专栏列表前言1.字符串基础2.字符串方法字符串查询字符串修改字符串切片3.字符串格式化旧式格式化(`%`操作符)`str.format()`方法f-string(Python3.6+)4.字符串编码5.Unicode和ASCII6.正则表达式7.字符串比较8.字符串连接9.字符串不可变性10.字符串的内......
  • python+flask计算机毕业设计新冠肺炎疫情人员统计及打卡系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景自新冠肺炎疫情爆发以来,全球公共卫生体系面临前所未有的挑战。疫情防控工作的高效开展,依赖于对人员流动、健康状况及疫情数据的精准掌握与......