对于任意两个序列a、b(其中a = [a1,a2,...,an],b = [b1,b2,...,bn],0 <= ai,bi <= m),我想找到一个整数函数f,当且仅当a、b具有相同的元素时,f(a) = f(b),而不考虑它们的顺序。例如,如果a = [1,1,2,3],b = [2,1,3,1],c = [3,2,1,3],则f(a) = f(b),f(a) ≠ f(c)。
我知道有一种朴素算法,先对序列进行排序,然后将其映射到一个整数。例如,在排序后,我们有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)。
我知道有一种朴素算法,先对序列进行排序,然后将其映射到一个整数。例如,在排序后,我们有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])
。 - r3mainer