Algorithm 内存寻址方法,为与';nCk';从0到n-1的值的组合

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个)数字,

我需要找到一种内存寻址方法,为从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元组中任何较低的索引都将小于较高的索引,并且所有索引都不相等

是否可以生成一个寻址方案来存储和检索这些数据而无需搜索?这需要在生成地址和尽可能少的内存量时以最小的计算量完成。(我认为无论采用何种方法,都会浪费一些内存。)

我曾想过对不同的索引使用不同的常数进行线性散列,但这会导致大量内存损失或计算常数的高计算复杂度

关于这个问题的任何建议都会大有帮助

例如:

(组合->存储器中的对应值)

如果我对上述模块的输入为(2,3,5,6),我应该能够直接获得值(7)

编辑:
“n”和“k”总是相等的。

我对这个问题的理解

因此,据我所知,用于检索数据的可能“键”是n个值中k个值的选择

与:

  • n从0到n-1
  • 没有重复的值
  • 只有键中的值才重要,而不是键的顺序
简单命题

让我们从一个简单的命题作为参考点开始

你可以考虑在你的“密钥”中存在的值是必须在n位地址中设置为1的比特:

  • 从键到地址的转换似乎很容易
  • 内存大小为2^n个字(因此浪费了大量空间)
分而治之:n=16,k=2

让我们来看这个特殊的例子:n=16,k=2

在前面的解决方案中,我们使用2^16个字的内存,而只有16*15/2=120个可能的键

在这种情况下,分而治之的策略可以是:

  • 两个值中的任何一个都在可能值的第一部分(0到7)
  • 或者它们都在可能值的第二部分(8到15)
  • 第一部分中有一个值,第二部分中有另一个值
  • 使用此初步测试,在这种情况下,您可以使用:

    • 情况1的一个8位地址存储器(参见初始简单解决方案,但n=8而不是16)
    • 一个用于案例2(idem)的8位地址存储器
    • 一种特殊情况是,第一部分有8个可能的选择,第二部分有8个可能的选择,因此额外的8*8=64字内存(6位地址,前3位对应于第一部分0到7之间的值,其他3位是0到7之间的值,对应于8到15之间的值的位置)
    2^8+2^8+64=576个单词

    分而治之:n=16,k=3

    让我们尝试使用更大的值k:k=3执行相同的操作

    该键的最小值介于0和13之间(因为如果该值为13,则其他两个值将分别为14和15)。这第一组位很容易找到

    因此,我们可以将问题简化为14个子问题(所有子问题的k=2,因此我们可以使用前面研究的案例来优化每个子问题的内存使用):

    • 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之间,因此只有一种可能的情况)
    我还没有完成计算,但这可能比最初的简单解决方案提供更好的内存使用率

    对称性:n=6,k=4

    这意味着在6个值中选择4个值,因此这相当于决定2个未选择的值,因此在内存优化方面,我们的情况类似于“n=6,k=2”


    希望这有帮助。

    好的,那么您需要从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])