Are two arrays permutation of each other?
Possible Duplicate:
Check if array B is a permutation of A
号
给定两个大小相等的非排序整数数组a和b。确定b是否是a的置换。这可以在O(n) time和O(1) space中完成吗?
我想到的第一个解决方案是使用XOR,即XOR all the elements of a and b and if the resultant is 0 which means that b is a permutation of a。但他给出了这种方法失败的例子。例如-
1 2
| a: [1 6 0 0 4] -- b: [1 0 6 1 5]
a: [1 6 0 0 5] -- b: [1 0 6 1 4] |
有人知道在O(n) time和O(1) space中该怎么做吗?
- 整数是否在有界范围内?如果是的话,可以表示为就地基数排序
- @阿米特:不……但我也很想知道…请加上这个例子作为答案…
- @拉维古普塔:嗯,我不知道O(N)解决方案,但一个有效的解决方案是首先检查阵列的长度,如果相同,然后使用任何O(nlogn)算法对两个阵列进行排序。然后比较元素,如果它们相等,那么它们是彼此的排列。空间复杂性为O(1)。
在整数的有界范围的情况下,让这个范围是[n,m],这样m-n = U就可以使用就地基数排序对数组进行排序,这在这篇伟大的文章中也讨论过。
当你有了两个排序的数组之后——对两个数组进行简单的迭代就可以给出答案——如果并且仅当排序的数组是相同的,那么原始数组就是彼此的排列。
注:这个答案中有一些"欺骗"[因此,直到OP在评论中提出要求,我才发表它。],因为它的时间复杂度是O(nlogU),空间复杂度是O(logU)。但是,对于有界范围,我们可以假设O(logU) = O(1),对于这些情况,我们得到O(n)时间和O(1)空间。
您的独占或解决方案基本上是基于哈希的解决方案,但使用的哈希函数质量较差。
你想要的是一个哈希函数…
给出极不可能发生冲突的哈希,因此可以将它们作为整数的唯一标识符处理。Git使用sha-1散列来标识源代码版本,冲突的概率非常低,可以忽略。
交换的(像xor和plus),可能是关联的,所以项目的顺序不会改变结果散列。
第二个要求可能是尴尬的。我在谷歌呆过一段时间,但我只是害怕"quasigroup"这样的词。
如果集合元素是非负的,并且有无边界整数类型(BigInteger或类似类型)可用,则可以在集合A上定义函数:
A中每个A的C(A) = product(p_(a+1)))。
其中,p_n是n第个质数。那么,C只取决于A中的值,而不是它们的顺序;任何值的变化都会改变C中的值。
例如,
1
| C([1 6 0 0 4]) = p_2.p_7.p_1.p_1.p_5 = 3.17.2.2.11 = 2244 |
(显然,任何具有相同元素的集合都具有相同的C,无论顺序如何),并且
1
| C([1 6 0 1 4]) = p_2.p_7.p_1.p_2.p_5 = 3.17.2.3.11 = 3366 |
号
所以我们知道这些集合是不同的。这使用了算术的基本定理,它指出任何大于1的整数都可以写成素数的唯一乘积(直到因子的排序)。或者它使用一个推论。我只是编了这个方法,所以可能不起作用。这篇文章不是为了证明它的正确性…
- 该解决方案使用非常量(甚至非线性)空间。该产品可扩展到计算和存储。注意计算n!(可能比您需要的产品小)它需要O(log(n!)) = O(nlogn)位,因此这个解决方案是O(nlogn)空间和时间。
- @啊,我不明白你是怎么把素数的产物和给定的问题联系起来的。
- 冒名顶替者:en.wikipedia.org/wiki/Fundamental_Theorem_of_Algorithm
- @Amit这里有"职权范围"(对不起,不知道技术术语)的问题吗?我的意思是:在文献中,对一个整数n的任何一个操作都称为O(1),而在其他时候则称为O(number of bits in binary representation of n)。你知道我的意思吗?如果知道的话,你能告诉我哪些术语应该搜索到更多吗?
- @aakashm:当把整数ops和空间称为O(1)时,我们这样做是因为我们假定数字小于一个常量,通常是32位。但是,在迭代使用产品时,不能采用这种假设。注意,13! > 2^32。正因为如此,我们需要一个外部的库(比如Java的EDCOX1,7)来表示巨大的数字。但是,此库使用非常量空间量。大整数库的空间消耗最多是O(logN),其中n是表示的数字。因此,为了代表n!,我们将需要O(log(n!)) = O(nlogn)空间。
- @aakashm:现实版本中的这个模型要求数字最多由输入的多项式限定。有一个已知的因子分解算法在多项式时间内运行!!)如果你放弃这个假设。参考文献:数论和代数的计算导论,第3.3和3.6段。