【发布时间】:2013-11-17 18:30:23
【问题描述】:
对于任意两个序列 a, b, 其中 a = [a1,a2,...,an] 和 b = [b1,b2,...,bn] (0a, b 具有相同的元素,而不关心它们的顺序。例如,如果 a = [1,1,2, 3],b = [2,1,3,1],c = [3,2,1,3],则 f(a) = f(b),f(a) ≠ f(b)。
我知道有一种简单的算法,它首先对序列进行排序,然后将其映射为整数。 比如排序后,我们有a = [1,1,2,3], b = [1,1,2,3], c = [1,2,3,3],假设m = 9 ,使用十进制转换,我们最终会得到 f(a) = f(b) = 1123 ≠ f(c) = 1233。但这将花费 O(nlog(n)) 时间使用某种排序算法(不要使用非比较排序算法)。
有没有更好的方法?哈希之类的东西? O(n) 算法?
请注意,我还需要易于反转的函数,这意味着我们可以将整数映射回序列(或更简洁的集合)。
更新:请原谅我糟糕的描述。这里 m 和 n 都可以非常大(100 万或更大)。而且我还希望 f 的上限非常小,最好是 O(m^n)。
【问题讨论】:
-
散列和链表可能会有所帮助。但是除非你的集合以某种方式有界,否则不可能使这个函数可逆。例如,您的幼稚算法失败是因为
f([1,1,2,3]) ≡ f([11,23])。 -
@wildplasser m 可以很大。
-
@Dukeling 我不认为这些问题是重复的,因为我需要将数组转换为整数。