有效地计算组合和排列

2024-02-27

我有一些代码来计算排列和组合,并且我正在努力使其更好地处理大量数字。

我找到了一种更好的排列算法,可以避免大量的中间结果,但我仍然认为我可以在组合方面做得更好。

到目前为止,我已经提出了一个特殊情况来反映 nCr 的对称性,但我仍然希望找到一种更好的算法来避免调用阶乘(r),这是一个不必要的大中间结果。如果没有这种优化,最后一个文档测试会花费太长时间来计算阶乘(99000)。

谁能建议一种更有效的方法来计算组合?

from math import factorial

def product(iterable):
    prod = 1
    for n in iterable:
        prod *= n
    return prod

def npr(n, r):
    """
    Calculate the number of ordered permutations of r items taken from a
    population of size n.

    >>> npr(3, 2)
    6
    >>> npr(100, 20)
    1303995018204712451095685346159820800000
    """
    assert 0 <= r <= n
    return product(range(n - r + 1, n + 1))

def ncr(n, r):
    """
    Calculate the number of unordered combinations of r items taken from a
    population of size n.

    >>> ncr(3, 2)
    3
    >>> ncr(100, 20)
    535983370403809682970
    >>> ncr(100000, 1000) == ncr(100000, 99000)
    True
    """
    assert 0 <= r <= n
    if r > n // 2:
        r = n - r
    return npr(n, r) // factorial(r)

如果 n 离 r 不远,那么使用组合的递归定义可能会更好,因为 xC0 == 1 你只会有几次迭代:

这里相关的递归定义是:

nCr = (n-1)C(r-1) * n/r

这可以使用尾递归和以下列表很好地计算:

[(n - r, 0), (n - r + 1, 1), (n - r + 2, 2), ..., (n - 1, r - 1), (n, r)]

这当然很容易在 Python 中生成(我们省略了第一个条目,因为 nC0 = 1)izip(xrange(n - r + 1, n+1), xrange(1, r+1))请注意,这假设 r

现在我们只需要使用带有reduce 的尾递归来应用递归步骤。我们从 1 开始,因为 nC0 是 1,然后将当前值与列表中的下一个条目相乘,如下所示。

from itertools import izip

reduce(lambda x, y: x * y[0] / y[1], izip(xrange(n - r + 1, n+1), xrange(1, r+1)), 1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有效地计算组合和排列 的相关文章

  • 如何让Python的socket服务器永远运行

    我有这段代码创建了一个简单的Python套接字服务器 但是每次客户端断开连接时它都会关闭 如何让它永远运行 import socket HOST PORT 8000 s socket socket socket AF INET socket
  • 在 Django 中获取数据库类型[重复]

    这个问题在这里已经有答案了 我需要能够确定 Django 运行时使用的数据库类型 MYSQL False if
  • 合并数据框中的值以写入 Excel

    我有一个看起来像的数据框 column1 column2 column3 colum4 column5 1 r n 1 r s 1 r n 2 r s 3 r n 3 2 r n 1 r s 1 r n 4 r s 4 r n 5 3 r
  • sphinx 中的分组方法文档字符串

    是否可以使用 sphinx 的 autodoc 功能将多个方法文档字符串分组 以便将它们列在一起 class Test object def a self A method of group foo def b self A method
  • 是否可以在 Sphinx 中隐藏 Python 函数参数?

    假设我有以下函数 该函数记录在Numpydoc 风格 https github com numpy numpy blob master doc HOWTO DOCUMENT rst txt 并且文档是自动生成的Sphinx http sph
  • 分组符号最大长度平衡子序列

    将 B 视为分组符号 和 的序列 如果 B 的长度为 0 或 B 具有以下形式之一 则称 B 为平衡序列 X Y 或 X Y 或 X Y 其中 X 和 Y 本身是平衡的 平衡示例 现在的问题是找到一种有效的算法来找到给定输入的最大长度平衡子
  • HoughLinesP后如何合并线?

    My task is to find coordinates of lines startX startY endX endY and rectangles 4 lines Here is input file 我使用下一个代码 img c
  • 如何在不破坏默认行为的情况下覆盖 __getattr__ ?

    我如何覆盖 getattr https docs python org 3 reference datamodel html object getattr 类的方法而不破坏默认行为 压倒一切 getattr 应该没事 getattr 仅作为
  • 修复类以在 Flask 会话中启用对象存储[重复]

    这个问题在这里已经有答案了 我有一个自定义类 Passport 其中包含活动用户身份和权限 我曾经将它存储在会话中 如下所示 p Passport p do something fancy session passport p 它就奏效了
  • Python 列表理解不适用于 itertools.groupby 解码

    我正在尝试解码结果itertools groupby到一个值列表中 我的来源是 x 1 2 2 1 6 3 6 5 1 3 最初的方法是使用 for 语句来实现 如下所示 keyfunc itemgetter 0 groups unique
  • 使用Python进行图像识别[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个想法 就是我想识别图像中的字母 可能是 bmp或 jpg 例如 这是一个包含字母 S 的 bmp 图像 我想做的是使用Pyth
  • 比较两个文本文件并计算差异

    我一直在尝试在Python中比较两个文本文件 本质上我想打开它们并一次比较一个字符 如果字符不同 则向计数器添加1 然后显示该值 这是我到目前为止所拥有的 usr bin env python diff 0 import random im
  • 什么时候用==,什么时候用is?

    奇怪的是 gt gt gt a 123 gt gt gt b 123 gt gt gt a is b True gt gt gt a 123 gt gt gt b 123 gt gt gt a is b False Seems a is b
  • 获取 HTML 代码的结构

    我正在使用 BeautifulSoup4 我很好奇是否有一个函数可以返回 HTML 代码的结构 有序标签 这是一个例子 h1 Simple example h1 p This is a simple example of html page
  • 使用 .map() 在 pandas DataFrame 中高效创建附加列

    我正在分析形状与以下示例类似的数据集 我有两种不同类型的数据 abc数据和xyz data abc1 abc2 abc3 xyz1 xyz2 xyz3 0 1 2 2 2 1 2 1 2 1 1 2 1 1 2 2 2 1 2 2 2 3
  • django 中的“管理器”是什么?

    我已经阅读了Django官方中的定义文档 https docs djangoproject com en dev topics db managers 我仍然对什么感到困惑Manager does 文档说它们允许您操作数据库表 模型 但我仍
  • 在Python中将罗马数字转换为整数

    根据 user2486 所说 这是我当前的代码 def romanMap map M 1000 CM 900 D 500 CD 400 C 100 XC 90 L 50 XL 40 X 10 IX 9 V 5 V 4 I 1 return
  • 求一根棒可以切割的最大片数

    这是完整的问题陈述 给定一根长度为n的绳子 你需要找到最大的绳子数你可以让每一段的长度都在集合 a b c 中给定三个值a b c 我知道可以通过动态规划来实现最优解 但是 我还没有学过这个主题 我需要递归地解决这个问题 对于递归 主要的事
  • Python模糊字符串匹配作为相关样式表/矩阵

    我有一个文件 其中包含 x 个字符串名称及其关联的 ID 本质上是两列数据 我想要的是一个格式为 x by x 的相关样式表 将相关数据作为 x 轴和 y 轴 但我想要 fuzzywuzzy 库的函数 fuzz ratio x y 作为输出
  • Chrome + 另一个进程:进程间通信比 HTTP/XHR 请求更快?

    我有一个进程 1 对视频流进行实时图像处理 我需要在 Chrome 中的 HTML 页面中渲染该视频 同一台计算机上的进程 2 在canvas or img or videoHTML5 元素 由于我有 1000x1000 像素 x 3 字节

随机推荐

  • 验证在部分视图中不起作用

    我有一个索引页面 其中有两个部分视图 登录和注册 我正在使用数据模型验证 登录 cshtml model Project ViewModel UserModel div using Html BeginForm Login account
  • 从 Ada 访问 c 常量

    我有一个带有这样类型定义的头文件 ifndef SETSIZE define SETSIZE 32 endif typedef struct set unsigned array SETSIZE set t 要使用相应的 C 函数 我需要在
  • jquery 获取之前输入的文本

    我有以下 html div class active string div
  • 将大文件作为流发送到 process.getOutputStream

    我在 Windows 机器中使用 gzip 实用程序 我压缩了一个文件并作为 blob 存储在数据库中 当我想使用 gzip 实用程序解压缩此文件时 我将此字节流写入 process getOutputStream 但超过30KB后 就无法
  • Android 绘制点

    如何用画布绘制完整的圆或点 我使用画布和路径 绘画类 my code Override public boolean onTouchEvent MotionEvent event float eventX event getX float
  • 如何向谷歌图表中的图例添加工具提示

    使用最新版本的 Google Charts API 我有一个简单的条形图 我想在将鼠标悬停在图例中的元素上时显示一个工具提示 解释图例中的每个项目是什么 我仍然希望栏上的工具提示保持不变并显示其标签和值
  • 使用 GSM 调制解调器接收短信

    我读到 GSM 调制解调器每分钟最多只能接收 30 条短信 如果您需要收到更多 您会怎么做 还有其他技术吗 我认为您可能想要与列出的答案不同的东西构建短信服务器的最佳实践是什么 https stackoverflow com questio
  • 多态关联

    如果您具有多态belongs to关联 那么引用将添加所需的两列 create table products do t t references attachment polymorphic gt default gt Photo end
  • 我应该为范围最小查询使用什么使用 O(n) 存储和 O(log n) 查询时间的数据结构?

    我被算法课的以下作业问题难住了 Suppose that we are given a sequence of n values x1 x2 xn and seek to quickly answer repeated queries of
  • 鲍尔畸形

    我正在学习如何使用 Bower 为了开始 我创建了一个基本的 Bower json 文件 其职责是获取 jquery 我的 Bower json 文件如下所示 name MyProject version 0 0 1 devDependen
  • python 中的私有公共受保护访问说明符

    我们可以在Python中模拟私有和受保护的访问说明符吗 名称修改 eg var 10 可以模拟私有 但可以通过对象轻松地从外部访问 object className var 那么有没有一种方法可以模拟 或者 python 是否直接是我不知道
  • C#中使用ffmpeg提取帧时帧率慢且资源占用高

    我目前正在开发一个项目 需要在 C 中使用 ffmpeg 从视频中提取帧 但是 我面临帧速率慢和资源使用率高的问题 我使用的代码如下 private bool move false private int master frame 0 pr
  • C 流:直接将数据从一个流复制到另一个流,不使用缓冲区

    我想将数据从一个流复制到另一个流 现在通常情况下 我会这样做 n fread buffer 1 bufsize fin fwrite buffer 1 n fout 有没有办法直接写入数据fin to fout 不经过缓冲区 即代替fin
  • 删除 XDocument 中的所有评论

    我正在阅读 XDocument 如何从 XDocument 中删除所有注释行 我尝试过 doc DescendantNodes Where x gt x NodeType XmlNodeType Comment Remove 但这仅删除带有
  • ASP.NET MVC 3:需要部署哪些 dll?

    在未安装 ASP NET MVC 3 的服务器上部署 ASP NET MVC 3 应用程序时 哪些文件需要将 复制本地 标记为 True From http www hanselman com blog BINDeployingASPNET
  • 使用 iTextSharp 将块的一部分右对齐

    我是 iTextSharp 新手 我正在尝试创建 PDF 只是一个简单的例子 如果我做这样的事情 Paragraph p new Paragraph p Add new Chunk 789456 Test f5 newDocument Ad
  • 无法使用 MSSQL 在 PDO 中引用表名

    我必须使用某人的数据库来开发游戏 遗憾的是该游戏有一个名为 User 或 dbo User 的表 并且无法重命名 现在 我需要在 PHP 中使用 PDO 访问它 并且当我使用此查询时 query SELECT UserId AS INTUS
  • 在 C++ 文件 CDT 中包含 Python.h

    如果这是一个愚蠢的问题 我深表歉意 但我尝试用谷歌搜索这个 但找不到任何可以指引我正确方向的东西 我只是想了解我需要做什么来 设置 cdt 以 理解 我的 python h 包含内容 错误的说法是这样的 include
  • 确保派生类构造函数必须调用特定基类方法

    在 C 03 类中 我有一个成员变量 它must在对象构造期间被赋值 但是 只有派生类可以计算所需的值 正如这篇文章中所讨论的C 是否要求从派生类初始化基类成员 https stackoverflow com questions 12169
  • 有效地计算组合和排列

    我有一些代码来计算排列和组合 并且我正在努力使其更好地处理大量数字 我找到了一种更好的排列算法 可以避免大量的中间结果 但我仍然认为我可以在组合方面做得更好 到目前为止 我已经提出了一个特殊情况来反映 nCr 的对称性 但我仍然希望找到一种