不分配内存的重复排列
我正在寻找一种算法来生成列表中重复 4 个元素(长度 2-1000)的所有排列。
问题在于上面链接中的算法分配了太多内存用于计算。它创建一个具有所有可能组合长度的数组。例如我的例子是 4^1000。所以我得到了堆空间异常。
谢谢
I'm looking for an algorithm to generate all permutations with repetition of 4 elements in list(length 2-1000).
The problem is that the algorithm from the link above alocates too much memory for calculation. It creates an array with length of all possible combination. E.g 4^1000 for my example. So i got heap space exception.
Thank you
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
用于延迟评估生成一组选择 Y 的长度 X 的所有排列(具有重复)的通用算法:
Generalized algorithm for lazily-evaluated generation of all permutations (with repetition) of length X for a set of choices Y:
如果 4 个符号的重复长度没有限制,那么有一个非常简单的算法可以满足您的需求。只需将字符串编码为二进制数,其中所有 2 位模式都对四个符号之一进行编码。要获得所有可能的重复排列,您只需枚举“计数”所有可能的数字。这可能相当长(超过宇宙的年龄),因为 1000 个符号将有 2000 位长。这真的是你想做的吗?堆溢出可能不是唯一的限制...
下面是一个简单的 C 实现,它枚举长度恰好为 n 的所有重复(n 限制为 16000,32 位无符号),而不分配内存。我将枚举长度最多为 n 的所有重复的练习留给读者。
If there is not length limit for repetition of your 4 symbols there is a very simple algorithm that will give you what you want. Just encode your string as a binary number where all 2 bits pattern encode one of the four symbol. To get all possible permutations with repetitions you just have to enumerate "count" all possible numbers. That can be quite long (more than the age of the universe) as a 1000 symbols will be 2000 bits long. Is it really what you want to do ? The heap overflow may not be the only limit...
Below is a trivial C implementation that enumerates all repetitions of length exactly n (n limited to 16000 with 32 bits unsigned) without allocating memory. I leave to the reader the exercice of enumerating all repetitions of at most length n.
你知道如何计数:在个位上加 1,如果超过 9 则跳回 0 并在十位上加 1,等等。
所以,如果你有一个长度为
N
的列表 ,每个地点的K
件商品:You know how to count: add 1 to the ones spot, if you go over 9 jump back to 0 and add 1 to the tens, etc..
So, if you have a list of length
N
withK
items in each spot: