我需要找到一种内存寻址方法来为对应于从 0 到 n-1 的值的“nCk”组合的值分配内存(静态硬件)。
假设“n”为 6,“k”为 4,我需要存储与组合对应的值(8 位或 16 位):
(1,2,3,4) (1,2,3,5) (1,2,3,6) (1,2,4,5) (1,2,4,6) (1,2,5,6) (1,3,4,5) (1,3,4,6) (1,3,5,6) (1,4,5,6) (2,3,4,5) (2,3,4,6) (2,3,5,6) (2,4,5,6) (3,4,5,6)
一旦我有了“k”(这里是 4 个)数字,我应该能够直接访问与“k”元组对应的元素。
k 元组的任何较低索引都将小于较高索引,并且没有一个索引是相等的。
是否可以生成寻址方案来存储和检索此类数据而无需搜索?这需要在生成地址时以最少的计算量和可能的最小内存量来完成。(我认为无论采用何种方法都会浪费一些内存。)
我想到了针对不同索引使用不同常量的线性哈希,但这会导致大量内存丢失或计算常量的高计算复杂度。
关于这个问题的任何建议都会有很大帮助。
例子:
(组合->内存中对应的值)
([(1,2,3,4)->14], [(1,2,3,5)->3], [(1,2,3,6)->-4], [(1,2,4,5)->7], [(1,2,4,6)->22], [(1,2,5,6)->-11], [(1,3,4,5)->5], [(1,3,4,6)->3], [(1,3,5,6)->-1], [(1,4,5,6)->9], [(2,3,4,5)->35], [(2,3,4,6)->4], [(2,3,5,6)->7], [(2,4,5,6)->-2], [(3,4,5,6)->6])
如果我对上述模块的输入是 (2,3,5,6),我应该能够直接得到值 (7)。
编辑:'n' 和 'k' 总是偶数。