Questions tagged «combinatorics»


12
快速排列->数字->排列映射算法
我有n个元素。举个例子,假设有7个元素1234567。我知道有7个!=这7个元素的5040个排列可能。 我想要一个包含两个功能的快速算法: f(number)将0到5039之间的数字映射到唯一排列,并且 f'(排列)将排列映射回生成它的编号。 我不关心数字和排列之间的对应关系,只要每个排列都有自己的唯一编号即可。 因此,例如,我可能有一些功能 f(0) = '1234567' f'('1234567') = 0 想到的最快的算法是枚举所有排列并在两个方向上创建一个查找表,以便一旦创建表,f(0)将为O(1),f('1234567')将为a在字符串上查找。但是,这会占用大量内存,尤其是当n变大时。 谁能提出另一种可以快速运行且没有内存不足的算法?

12
生成列表的所有排列,而没有相邻的相等元素
当我们对列表进行排序时,例如 a = [1,2,3,3,2,2,1] sorted(a) => [1, 1, 2, 2, 2, 3, 3] 相等的元素在结果列表中始终相邻。 如何完成相反的任务-整理列表,使相等的元素永远不会(或尽可能少)相邻? 例如,对于上面的列表,一种可能的解决方案是 p = [1,3,2,3,2,1,2] 更正式地说,给定一个列表a,生成p它的排列,使对的数量最小化p[i]==p[i+1]。 由于列表很大,因此不能选择生成和过滤所有排列。 额外的问题:如何有效地生成所有此类排列? 这是我用来测试解决方案的代码:https : //gist.github.com/gebrkn/9f550094b3d24a35aebd UPD:在这里选择获胜者是一个艰难的选择,因为许多人都给出了很好的答案。@VincentvanderWeele,@大卫Eisenstat,@Coady,@ enrico.bacis和@srgerg提供完美产生最佳的置换函数。@tobias_k和David也回答了奖金问题(生成所有排列)。大卫还提供了正确性证明。 @VincentvanderWeele的代码似乎是最快的。

5
懒惰地生成排列
我正在寻找一种算法来生成集合的排列,以便可以在Clojure中列出它们的惰性列表。即,我想遍历一系列排列,在我请求之前不会计算每个排列,并且不必将所有排列立即存储在内存中。 或者,我正在寻找一种算法,给定特定集合,该算法将返回该集合的“下一个”排列,以这种方式,在其自己的输出上重复调用该函数将循环遍历原始集合的所有排列,一些订单(顺序无关紧要)。 有这样的算法吗?我见过的大多数置换生成算法都倾向于一次全部生成它们(通常是递归生成),而这些算法不能扩展到很大的集合。用Clojure(或另一种功能语言)实现可能会有所帮助,但我可以从伪代码中弄清楚。

6
通过重复生成排列
我知道itertools,但似乎只能生成排列而不能重复。 例如,我想为2个骰子生成所有可能的骰子骰。所以我需要大小为2的[1、2、3、4、5、6]的所有排列,包括重复:(1、1),(1、2),(2、1)...等等 如果可能的话,我不想从头开始实现

14
Haskell中2个列表的笛卡尔积
我希望在Haskell中产生2个列表的笛卡尔积,但是我不知道该怎么做。笛卡尔积提供列表元素的所有组合: xs = [1,2,3] ys = [4,5,6] cartProd :: [a] -> [b] -> [(a,b)] cartProd xs ys ==> [(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)] 这不是一个实际的家庭作业问题,并且与任何此类问题都没有关系,但是解决这个问题的方法可能会帮助我坚持下去。

4
列表字典的笛卡尔积
我正在尝试编写一些代码来测试一堆输入参数的笛卡尔积。 我看过了itertools,但是它的product功能并不是我想要的。是否有一种简单明了的方法来获取一个字典,每个字典中包含任意数量的键和每个值中任意数量的元素,然后生成具有下一个排列的字典? 输入: options = {"number": [1,2,3], "color": ["orange","blue"] } print list( my_product(options) ) 输出示例: [ {"number": 1, "color": "orange"}, {"number": 1, "color": "blue"}, {"number": 2, "color": "orange"}, {"number": 2, "color": "blue"}, {"number": 3, "color": "orange"}, {"number": 3, "color": "blue"} ]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.