问题标签 [combinatorics]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
404 浏览

algorithm - 这个游戏叫什么名字?

这本身不是一个编程问题,尽管最终目标是设计一种算法。我正在寻找参考资料或至少是一种游戏的名称。它在电视游戏节目中非常普遍。游戏如下:

您有许多插槽,每个插槽都包含一个您不知道的项目(来自某个有限集合)。您必须猜测每个插槽包含什么。您将您的猜测告诉法官(他知道每个插槽包含什么),他会告诉您有多少猜测是正确的,而不会告诉您哪个。当您成功猜出所有项目时,游戏结束。

我会对有关此类游戏的任何信息感兴趣,包括对以尽可能少的猜测进行求解的算法的引用等。只是名称,以便我可以在谷歌上搜索它也可以。

谢谢!

0 投票
3 回答
893 浏览

php - PHP:缓存有序整数分区算法

第一:维基百科中的问题名称是“集合的有序分区”。

我有一个计算可能分区的算法。为了加快速度,我使用了缓存:

此外,我还有另一种算法,它显示了这些可能分区的列表。但它还没有使用缓存,所以它很慢:

所以我有两个问题:1)是否也可以在第二种算法中实现缓存?如果是的话,你能帮我做这件事吗?2)是否可以将第二种算法的结果写入结构化数组而不是字符串?

我希望你能帮助我。非常感谢您!

PS:感谢simonn和Dan Dyer这两个函数!

0 投票
7 回答
11913 浏览

python - 分配问题,一个 NumPy 函数?

由于分配问题可以以单个矩阵的形式提出,我想知道 NumPy 是否具有解决这样一个矩阵的功能。到目前为止,我还没有找到。也许你们中的一个人知道 NumPy/SciPy 是否具有分配问题解决功能?

编辑:与此同时,我在http://software.clapper.org/munkres/找到了一个 Python(不是 NumPy/SciPy)实现。我仍然认为 NumPy/SciPy 实现可能会快得多,对吧?

0 投票
6 回答
320 浏览

algorithm - 使用仿射成本优化笛卡尔请求

我有一个成本优化请求,我不知道是否有相关文献。这有点难以解释,所以我提前为问题的长度道歉。

我正在访问的服务器以这种方式工作:

  • 对记录 (r1, ...rn) 和字段 (f1, ...fp) 发出请求
  • 您只能请求笛卡尔积 (r1, ..., rp) x (f1,...fp)
  • 与此类请求相关的成本(时间和金钱)与请求的大小相关:

T((r1, ..., rn)x(f1, ..., fp) = a + b * n * p

不失一般性(仅通过归一化),我们可以假设b=1成本为:

T((r1, ...,rn)x(f1,...fp)) = a + n * p

  • 我只需要请求 pair 的一个子集(r1, f(r1)), ... (rk, f(rk)),一个来自用户的请求。我的程序充当用户和服务器(外部)之间的中间人。我有很多这样的请求(每天数万个)。

从图形上看,我们可以将其视为一个 nxp 稀疏矩阵,为此我想用一个矩形子矩阵覆盖非零值:

有:

  • 由于成本不变,子矩阵的数量保持合理
  • 所有的 'x' 必须位于子矩阵内
  • 由于线性成本,覆盖的总面积不能太大

我将 g 命名为我的问题的稀疏系数(所需对的数量超过可能的对总数,g = k / (n * p)。我知道系数a

有一些明显的观察结果:

  • 如果 a 很小,最好的解决方案是独立请求每个 (record, field) 对,总成本为:k * (a + 1) = g * n * p * (a + 1)
  • 如果 a 很大,最好的解决方案是请求整个笛卡尔积,总成本为:a + n * p
  • 第二种解决方案更好g > g_min = 1/ (a+1) * (1 + 1 / (n * p))
  • 当然笛卡尔积中的顺序并不重要,因此我可以转置矩阵的行和列以使其更容易覆盖,例如:

可以重新排序为

并且有一个最佳的解决方案是要求(f1,f3) x (r1,r3) + (f2) x (r2)

  • 尝试所有解决方案并寻找更低的成本不是一种选择,因为组合学爆炸了:

所以我正在寻找一个近似的解决方案。我已经有某种贪心算法,可以在给定矩阵的情况下找到覆盖(它从单一单元格开始,如果合并中空单元格的比例低于某个阈值,则合并它们)。

记住一些数字,我的 n 介于 1 和 1000 之间,而我的 p 介于 1 和 200 之间。覆盖模式真的是“块状”,因为记录来自所要求的字段相似的类。不幸的是,我无法访问记录类...

问题 1:有人有什么想法、一个巧妙的简化或可能有用的论文参考吗?由于我有很多请求,因此我正在寻找一种平均运行良好的算法(但我无法承受它在某些极端情况下运行不佳,例如当 n 和 p 很大时请求整个矩阵,并且请求确实非常稀疏)。

问题2:其实问题更复杂:cost其实更像是这样的形式:a + n * (p^b) + c * n' * p',其中b是一个常数<1(一个记录一旦求一个字段,再求其他也不算太贵字段)并且n' * p' = n * p * (1 - g)是我不想请求的单元格的数量(因为它们是无效的,并且请求无效的东西需要额外的费用)。我什至无法想到一个快速解决这个问题的方法,但仍然......任何人的想法?

0 投票
4 回答
758 浏览

php - 随机和唯一子集生成

假设我们有从 1 到 25 的数字,我们必须选择 15 个数字的集合。

如果我是对的,可能的集合是 3268760。

在这 3268760 个选项中,您必须生成 100000 个

生成 100000 个唯一且随机的子集的最佳方法是什么?

有没有办法,一种算法来做到这一点?

如果不是,那么检测重复项的最佳选择是什么?

我打算在 PHP 上执行此操作,但一个通用的解决方案就足够了,任何不涉及太多“学术”(更实用)的参考都会对我有很大帮助。

0 投票
4 回答
14133 浏览

python - 获取字符串的每个组合

我有一个组合任务,涉及从特定的字符串组合中获取长度小于或等于 6 的每个单词。

在这种情况下,它是 S = { 'a', 'ab', 'ba' }。教授刚开始列出它们,但我认为使用程序会更容易解决。唯一的问题是我无法获得一个可以实际计算所有可能选项的好算法。

如果有人可以提供帮助,我将不胜感激。我通常用 Python 编程,但实际上我只需要算法方面的帮助。

0 投票
12 回答
44207 浏览

algorithm - 快速排列 -> 数字 -> 排列映射算法

我有 n 个元素。举个例子,假设有 7 个元素,1234567。我知道有 7 个!= 这 7 个元素可能有 5040 种排列。

我想要一个包含两个函数的快速算法:

f(number) 将 0 到 5039 之间的数字映射到唯一的排列,并且

f'(permutation) 将排列映射回生成它的数字。

我不关心数字和排列之间的对应关系,只要每个排列都有自己唯一的数字。

所以,例如,我可能有函数

想到的最快算法是枚举所有排列并在两个方向上创建一个查找表,这样,一旦创建了表,f(0) 将是 O(1) 而 f('1234567') 将是在字符串上查找。但是,这会占用大量内存,尤其是当 n 变大时。

任何人都可以提出另一种可以快速运行且没有内存缺点的算法吗?

0 投票
3 回答
2143 浏览

java - 在 Java 中设置组合算法

我有一个具有如下属性的数据集:

等等。大约有 200 个这样的变量。

我需要一种算法来生成属性组合,一次只有一个值。

换句话说,我的第一个组合是:

下一组将是:

我尝试使用一个简单的组合生成器,将每个属性的每个值都视为一个属性本身。它不起作用,因为组合中包含相互排斥的选择,并且可能的组合数量非常大(准确地说是133873417996074857185490633899939406700260683726864088366400)

您能否建议一种算法(最好用 Java 编码)?

谢谢!!

0 投票
4 回答
1748 浏览

algorithm - 如何生成有限制的子集列表?

我试图找出一种有效的算法来获取项目列表并生成所有唯一子集,这些子集是通过将列表拆分为恰好 2 个子列表而产生的。我确信有一种通用的方法可以做到这一点,但我对一个特定的案例感兴趣。我的列表将被排序,并且可以有重复的项目。

一些例子:

输入
{1,2,3}

输出
{{1},{2,3}}
{{2},{1,3}}
{{3},{1,2}}

输入
{1,2,3,4}

输出
{{1},{2,3,4}}
{{2},{1,3,4}}
{{3},{1,2,4}}
{{4},{1,2, 3}}
{{1,2},{3,4}}
{{1,3},{2,4}}
{{1,4},{2,3}}

输入
{1,2,2,3}

输出
{{1},{2,2,3}}
{{2},{1,2,3}}
{{3},{1,2,2}}
{{1,2},{2, 3}}
{{1,3},{2,2}}

我可以在纸上做到这一点,但我正在努力找出一种以编程方式完成它的简单方法。我只是在寻找有关如何执行此操作的快速伪代码描述,而不是任何特定的代码示例。

任何帮助表示赞赏。谢谢。

0 投票
2 回答
242 浏览

algorithm - 一种将序列拆分为等间距、非冲突子序列的算法

我遇到了无法仅通过算法解决的问题。

假设我有一个视频捕获,它总是以固定速率 F(假设每秒 30 帧)捕获视频帧。

我想要的是将此帧序列“拆分”为 n 个(比如说四个)子序列。每个子序列都有其帧速率 fn,这显然 < F。子序列中的帧在时间上是等距的,因此例如一些有效的 10 fps 序列 f1 将像 F = 30 fps 和时间 = 1 秒那样构造:

(0 是不属于子序列的帧,1 是属于的帧):

或者

或者,对于 F = 30 和 f = 8:

(并且在以“1”重新开始之前需要 MCD (30,8) = 120 帧)。

问题是子序列不能碰撞,所以如果 F=30,f1 = 10 fps(每三帧)和 f2 = 5 fps(每六帧),这个序列是可以的:

但是如果我们加上 f3 = 6 fps

或者

第三个子序列将与第一个子序列发生冲突。

问题是:

  • 有没有办法找到n个(n <= 4)子序列的帧速率的每个组合,它们不会发生冲突并且会等距?

(我需要一般情况,但在这种特殊情况下,我只需要一个序列的所有有效组合(平凡),两个序列的所有有效组合,三个序列的所有有效组合,以及四个序列的所有有效组合) .

希望有人能启发我的想法。谢谢!