[描述] 给定两个长度相同的整数数组。设计一种算法来判断它们是否相同。 "相同" 的定义是,如果这两个数组按排序顺序排列,则相应位置上的元素应该相同。
[Example]
<1 2 3 4> = <3 1 2 4>
<1 2 3 4> != <3 4 1 1>
[限制] 该算法应该需要恒定的额外空间,并且具有O(n)的运行时间。
[Example]
<1 2 3 4> = <3 1 2 4>
<1 2 3 4> != <3 4 1 1>
[限制] 该算法应该需要恒定的额外空间,并且具有O(n)的运行时间。
B
并模以某个质数P
,例如对所有i
求和B^a_i
,然后模以某个较大的P
。如果它们得到相同的数字,则可以再尝试多个质数。如果任何尝试都失败,则它们不相等。如果它们通过了足够的挑战,则它们是相等的,有很高的概率。
对于B
> N
,P
>最大数字,有一个显而易见的证明。因此必须存在无法满足的挑战。这实际上是一种确定性方法,尽管复杂度分析可能更加困难,这取决于人们如何看待复杂度与输入大小(而不仅仅是元素数量)的关系。
我认为:除非指定输入范围,否则不可能以恒定的额外空间和O(n)的运行时间解决问题。
如果能证明我是错的,那我会很高兴学到新东西。
size_t counts[UCHAR_MAX];
由于UCHAR_MAX是一个常量,因此数组使用的空间也是一个常量。
编辑:值得注意的是,在几乎所有算法复杂度的描述中,都隐含着对所涉及项目的范围/大小的限制。例如,我们都“知道”快速排序是O(N log N)算法。然而,这只有在我们假设比较和交换被排序的项需要恒定时间时才成立,这只有在我们限制范围时才可能成立。如果所涉及的项目范围足够大,以至于我们不能再把比较或交换视为需要恒定时间,那么它的复杂度将变成类似于O(N log N log R)的形式,其中R是范围,因此log R
近似表示表示一个项目所需的位数。
好的,这不是使用恒定的额外空间,但这是我目前能想到的最好的方法:-)。在问题上还有其他的限制吗?比如说可能包含在数组中的最大整数?
O(n)
。 - pajton这是一个诡计问题吗?如果作者假设整数在给定范围内(2^32等),那么“额外的常量空间”可能只是一个大小为2^32的数组,在其中计算两个列表中的出现次数。
如果整数没有范围,则无法完成。
我想解决方案需要某种既满足结合律又满足交换律的转换,并保证唯一的输入集有唯一的结果。但是我不确定这是否存在。
public static boolean match(int[] array1, int[] array2) {
int x, y = 0;
for(x = 0; x < array1.length; x++) {
y = x;
while(array1[x] != array2[y]) {
if (y + 1 == array1.length)
return false;
y++;
}
int swap = array2[x];
array2[x] = array2[y];
array2[y] = swap;
}
return true;
}
假设整数在范围-n..+n之间,检查它们是否相等的简单方法可能如下所示(伪代码):
// a & b are the array
accumulator = 0
arraysize = size(a)
for(i=0 ; i < arraysize; ++i) {
accumulator = accumulator + a[i] - b[i]
if abs(accumulator) > ((arraysize - i) * n) { return FALSE }
}
return (accumulator == 0)
累加器必须能够存储范围为+-数组大小*n的整数