我很困惑如何将一组序列映射到连续的整数。
所有序列都遵循以下规则:
A_0 = 1
A_n >= 1
A_n <= max(A_0 .. A_n-1) + 1
我正在寻找一种解决方案,在给定这样的序列的情况下,可以计算一个整数来查找表并给出表中的索引,生成序列。
示例:对于长度3,有5个有效序列。执行以下地图(最好是双向)的快速功能将是一个很好的解决方案
1,1,1 0
1,1,2 1
1,2,1 2
1,2,2 3
1,2,3 4
这些是不同的有效序列
1,1,2,3,2,1,4
1,1,2,3,1,2,4
1,2,3,4,5,6,7
1,1,1,1,2,3,2
这些不是
1,2,2,4
2,
1,1,2,3,5
与this
相关答案 0 :(得分:1)
我认为哈希与排序应该是事情。
由于A0始终以0开头,我认为我们可以将序列视为基数为12的数字,并使用其基数10作为查找的关键。 (仍然不确定这一点)。
答案 1 :(得分:1)
有一个自然的序列索引,但没有那么容易计算。
因为A_0 = 1,所以在n> 0时寻找A_n。
索引分两步完成。
按A_n = max(A_0 .. A_n-1)+ 1的地方分组。将这些地方称为步骤。
每个组可以表示为二进制字符串,其中1是步,0是非步。例如。 001001010表示具有112aa3b4c的组,a&lt; = 2,b <= 3,c <= 4。因为,组使用二进制数编制索引,所以可以自然地对组进行索引。从0到2 ^长度 - 1.允许组二进制表示组顺序的调用值。
组内的索引序列。由于组定义了步骤位置,因此只有非步骤位置上的数字是可变的,并且它们在定义的范围内是可变的。由此可以很容易地对该组内给定组的序列进行索引,并具有可变位置的词典顺序。
很容易计算一组中的序列数。形式1 ^ i_1 * 2 ^ i_2 * 3 ^ i_3 * ....
的数量这给出了一个2部分密钥:<Steps, Group>
然后需要将其映射到整数。要做到这一点,我们必须找到有多少序列小于某个值的组。为此,我们首先找出有多少序列在给定长度的组中。这可以通过所有组来计算并且将序列的数量相加或类似地与递归一起计算。令T(l,n)为长度为l的序列的数量(省略A_0),其中第一元素的最大值可以是n + 1。比举行:
T(l,n) = n*T(l-1,n) + T(l-1,n+1)
T(1,n) = n
因为l + n <= sequence length + 1
有〜sequence_length^2/2
T(l,n)值,可以很容易地计算出来。
接下来是计算小于或等于给定值的组中的序列数。这可以通过T(l,n)值的求和来完成。例如。订单数<= 1001010二进制的组中的序列数等于
T(7,1) + # for 1000000
2^2 * T(4,2) + # for 001000
2^2 * 3 * T(2,3) # for 010
这将给出一个映射,但组合关键部分的直接实现最多只能>O(1)
。另一方面,密钥的Steps
部分很小,并且通过计算每个Groups
值的Steps
范围,查找表可以将此值减少到O(1)
。
我对上面的公式并不是100%肯定,但它应该是类似的。
通过这些评论和重复,可以制作功能序列 - &gt;索引和索引 - &gt;序列。但不是那么微不足道: - )
答案 2 :(得分:0)
这是一个python函数,可以为您完成这项工作,假设您将这些值存储在一个文件中并将这些行传递给函数
def valid_lines(lines):
for line in lines:
line = line.split(",")
if line[0] == 1 and line[-1] and line[-1] <= max(line)+1:
yield line
lines = (line for line in open('/tmp/numbers.txt'))
for valid_line in valid_lines(lines):
print valid_line
答案 3 :(得分:0)
根据序列,我会对它进行排序,然后使用排序序列的哈希值作为表的索引。