Tag: 置换

如何在不存储卡片的情况下实施经销商类别?

题 即使只有52张牌,我在“ 解释”部分描述的permutationIndex也是一个巨大的数字; 它是52!一个数字52! ,需要29个字节来存储。 因此, 我不知道计算大范围的permutationIndex的简单方法 ,并以最小成本存储索引,或者也可以计算它。 我在想这个问题的解决方案是三种算法: 一种算法,它计算正确的permutationIndex来实现Dealing方法 一种计算正确permutationIndex以实现Collect方法的算法 一种以最小成本存储(或计算) permutationIndex的算法 说明 我最初尝试使用置换实现一个范围从int.MinVale到int.MaxValue的整数句柄生成器 。 因为范围非常大,所以我从实现一个Dealer类开始, 有52张卡,它们并不真正存储像hashset或array这样的卡片组,甚至不需要随机 (初始除外)。 对于给定范围的序数,我认为其中一个完整排列的每个序列都有一个索引,并将其命名为permutationIndex 。 我使用索引来记住它是哪个排列而不是真正存储序列。 序列是卡片组的可能顺序之一。 这里有一个动画图形模拟示例,以显示我的想法。 每次我发卡时,我都会更改permutationIndex并dealt (已发卡的数量),我知道哪些卡是那些卡,哪些卡还在手中。 当我收回已发卡时,我会知道卡号,并将其放在顶部,它也会成为下次交易的卡。 在动画中, colleted是卡号 。 有关更多信息,请按以下方式 代码说明 仅有三个3的概念样本Dealer类如下。 代码是用c#编写的,我也在考虑任何与语言无关的解决方案。 以下是示例代码的一些描述 使用Dealing()方法,我们得到一些处理的卡片。 它总是返回最右边的数字(与数组相关),然后通过更改permutationIndex将其左边的数字(比如下一个可用的数字)滚动到最右边的位置。 方法Collect(int)用于收集并将处理后的卡片放回到牌组中。 它会改变permutationIndex ,根据卡的数量返回给经销商。 dealt的整数表示我们dealt了多少张牌; 从最左边到存储在dealt中的计数都是发牌。 使用permutationIndex ,我们知道卡的顺序。 不使用示例代码中的int[,]数组,只是为了帮助设想排列。 switch语句被认为是用计算permutationIndex算法实现的。 permutationIndex与此答案中描述的内容相同 快速置换 – >数字 – >置换映射算法 示例代码 public static […]

一组给定数字的排列

有人可以解释一个好的算法,以有效的方式找到给定数字集的所有排列吗?