想象一下有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列。
有什么想法吗?
附加细节:由于空间要求,我不想存储实际索引,但我希望能够将索引号分解为指向它引用的确切排列。
答案 0 :(得分:2)
我建议分两步解决这个问题。
创建一个不符合您的位置约束的简单索引。例如,按字典顺序排列集合。例如,假设每列中有4列和1000个元素,则每列的编号为0到1000。集合[2, 100, 4, 927]
具有索引002 100 004 927
。请注意,此排序中的连续元素仅在最后一列中有所不同,这是不希望的。
将一些哈希函数应用于索引。例如,假设您有一个哈希函数f
,其中包含f(5) = 394 033 748 123
和f(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(确保四列)。结果值是您的排列。