要如何实现一个有效率的组合函数?(即m选n问题)
mathematica吧
全部回复
仅看楼主
吧务
level 10
asdasd1dsadsa 楼主
Tuples是区分元素顺序的,Subsets忽视重复元素也不能生成重复元素。非要搞Orderless的Tuples的话似乎效率也不高。有没有什么好的解决方案?
2019年11月27日 13点11分 1
吧务
level 9
以前贴吧讨论过这个问题,你找的函数应该是python中的itertools.combinations_with_replacement吧,现在那个帖子找不到了。下面是一种方法,速度一般
combinWithRep[list_List, k_Integer] := Block[{v, it, cf},
v = Table[Unique[], {k}];
it = Thread[{v, {1}~Join~Most@v, Length@list}];
cf = {it, First /@ it} /. {{iter__}, var_} :>
Hold@Block[{bag = Internal`Bag@Rest@{0}},
Do[Internal`StuffBag[bag, var, 1], iter];
bag~Internal`BagPart~All] /. Hold[x_] :> Compile[{}, x];
Part[list, cf[]]~Partition~k
];
2019年11月27日 14点11分 2
谢了。话说这是我第一次见到用Internal`的函数写的代码,这个要怎么学啊
2019年11月28日 02点11分
@asdasd1dsadsa stackexchange上面搜Internal`Bag
2019年11月29日 02点11分
@草红样 看来MMA还是以SE为主要资料来源啊
2019年11月29日 10点11分
吧务
level 9
另一种比较简洁的实现,速度慢一些
combinationsWithReplacement[A_List,k_Integer]:=Extract[A,{#-Range[0,k-1]}&/@Subsets[Range[Length[A]+k-1],{k}]];
2019年11月29日 04点11分 3
1