可以索引表中的唯一排列吗?

时间:2014-03-26 13:50:05

标签: algorithm math

用于显示特定且唯一的排列的索引号的算法?

想象一下有4列的表。

每列有1000个元素。

从每列中随机选择一个元素会产生1万亿个排列。 (1000 ^ 4)

如果不对这些万亿排列中的每一个进行索引,是否可以分配1到1万亿的索引号,这代表一个特定的排列。理想的情况下, 提供索引号将产生唯一的排列。

这是一个棘手的部分:当看两个靠近的索引号(例如:12345和12346)时,这两个排列几乎不应该随机出现 - 它们看起来不应该是密切相关的。

示例:如果每个元素都是单词,

以下是可以接受的,因为每个索引号代表一组明显不同的词:

123456 = apple, banana, cow, dog
123457 = elephant, fox, goat, hippo
123458 = iguana, jackal, kangaroo, lion
123459 = mouse, newt, octopus, pig
123460 = apple, fox, newt, lion

(注意:对于一些重复肯定是可以的 - 只是经常不会太多)

以下内容是不可接受的,因为附近的索引号会产生非常相似的结果:

123456 = apple, banana, cow, dog
123457 = apple, banana, cow, elephant
123458 = apple, banana, cow, fox
123459 = apple, banana, cow, goat

解决方案应该是可扩展的 - 我应该可以更改并在列中包含10,000个元素而不是1000个,我应该能够有10列而不是4列。

有什么想法吗?

附加细节:由于空间要求,我不想存储实际索引,但我希望能够将索引号分解为指向它引用的确切排列。

3 个答案:

答案 0 :(得分:2)

我建议分两步解决这个问题。

  1. 创建一个不符合您的位置约束的简单索引。例如,按字典顺序排列集合。例如,假设每列中有4列和1000个元素,则每列的编号为0到1000。集合[2, 100, 4, 927]具有索引002 100 004 927。请注意,此排序中的连续元素仅在最后一列中有所不同,这是不希望的。

  2. 将一些哈希函数应用于索引。例如,假设您有一个哈希函数f,其中包含f(5) = 394 033 748 123f(6) = 921 038 839 104。您使用散列的结果作为步骤1的索引。输入中的两个连续索引现在具有非常不同的输出(假设您的散列函数正常工作)。

答案 1 :(得分:0)

最方便"想到的解决方案是使用简单的元索引"它结合了每列的索引,然后对结果索引使用某种加密来生成你的"官方"索引。

给定一个任意数字,然后解密它并分离出组件索引。

我最初的本能是建议使用哈希函数而不是加密,但哈希函数不容易被反转(意味着你不能为给定的索引生成元组)并且很难用最少的空槽或重叠来创建这样的函数。

您可以通过加密算法中的位转换程度来控制索引组件的可预测程度。如果您只是用键对每个字节进行异或,则列索引不会连续,但关系将在那里。但是,如果使用相邻(或非相邻)字节交换位,则会对每个索引的表示进行非本地化。 (我不一定会推荐DES,但值得一提的是要了解一下为简化内容而轻松做些什么。)

一个警告:如果您希望每个索引都匹配一个有效的元组,您需要确保以某种方式获取每个组件索引的每个值。这是另一场讨论。

答案 2 :(得分:0)

似乎最简单的解决方案是将基数10转换为基数1000.但是,只有列限制为每个1000个元素时,它才有效。

以下是Python中的代码。

def convertToBase(number,base,min_digits):
    n = number
    value = []
    while n > 0:
        value.append(n % base)
        n = int(n/base)
    while len(value) < min_digits:
        value.append(0)
    return value

其中base为1000,min_digits为4(确保四列)。结果值是您的排列。