Algorithm 内存寻址方法,为与';nCk';从0到n-1的值的组合
我需要找到一种内存寻址方法,为从0到n-1的值的“nCk”组合对应的值分配内存(静态硬件) 假设“n”为6,“k”为4,我需要存储与组合对应的值(8或16位):Algorithm 内存寻址方法,为与';nCk';从0到n-1的值的组合,algorithm,memory-management,vhdl,memory-address,codesynthesis,Algorithm,Memory Management,Vhdl,Memory Address,Codesynthesis,我需要找到一种内存寻址方法,为从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个)数字,
(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元组中任何较低的索引都将小于较高的索引,并且所有索引都不相等
是否可以生成一个寻址方案来存储和检索这些数据而无需搜索?这需要在生成地址和尽可能少的内存量时以最小的计算量完成。(我认为无论采用何种方法,都会浪费一些内存。)
我曾想过对不同的索引使用不同的常数进行线性散列,但这会导致大量内存损失或计算常数的高计算复杂度
关于这个问题的任何建议都会大有帮助
例如:
(组合->存储器中的对应值)
如果我对上述模块的输入为(2,3,5,6),我应该能够直接获得值(7)
编辑:
“n”和“k”总是相等的。我对这个问题的理解 因此,据我所知,用于检索数据的可能“键”是n个值中k个值的选择 与:
- n从0到n-1
- 没有重复的值
- 只有键中的值才重要,而不是键的顺序
你可以考虑在你的“密钥”中存在的值是必须在n位地址中设置为1的比特:
- 从键到地址的转换似乎很容易
- 内存大小为2^n个字(因此浪费了大量空间)
- 情况1的一个8位地址存储器(参见初始简单解决方案,但n=8而不是16)
- 一个用于案例2(idem)的8位地址存储器
- 一种特殊情况是,第一部分有8个可能的选择,第二部分有8个可能的选择,因此额外的8*8=64字内存(6位地址,前3位对应于第一部分0到7之间的值,其他3位是0到7之间的值,对应于8到15之间的值的位置)
- k=2,n=15(介于1和15之间)
- k=2,n=14(介于2和15之间)
- k=2,n=13(介于3和15之间)
- k=2,n=4(介于12和15之间)
- k=2,n=3(介于13和15之间)
- k=2,n=2(介于14和15之间,因此只有一种可能的情况)
希望这有帮助。好的,那么您需要从k映射到哪个地址范围?例如,映射:k=0->0,k=1->1,…,k=15->15可以吗?假设“n”是10,当k=5时,nCk是最大值,所以我们需要nCk地址。我不认为在不进行大量计算的情况下,就可以将其限制在这个精确值。我想把计算量降到最低。”n'可以是atmax 16,最多提供16C8个内存位置。我想这澄清了你的问题对不起,我不明白。你能给你的问题加一个完整的例子吗?有输入和期望的输出。基本上我需要的是一个“k-D”寻址方案,其中我不使用高索引小于低索引的位置(如二维矩阵中的上三角形),因此如果我理解正确,那么使用
pow(2,ceil(log2(n))*k)
地址(使用普通旧向量寻址)是最糟糕的情况这是使用nCk地址的最佳情况(但是你不能轻易地计算出一个地址),你想在两者之间做些其他的权衡吗?谢谢你,先生,这真的很有帮助。如果“n”和“k”总是相等,你能建议一种减少内存需求的方法吗。我更喜欢第一个命题,因为这样我可以存储所有的'nCk'组合,其中常数'n'和变量'k'取所有小于'n'的偶数值。这里有一半的内存未使用。如果不需要计算奇数“l”值,是否可以最小化此值
([(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])