确定两个数组是否相同,直到排列?

时间:2012-07-15 08:01:30

标签: arrays algorithm

  

可能重复:
  Check if array B is a permutation of A

有没有办法判断两个数字数组(可以包含正数,负数或重复数)是O(n)时间复杂度和O(1)空间复杂度的相互排列?由于狭窄的空间限制,我无法解决它。

2 个答案:

答案 0 :(得分:2)

如果数字是整数,in-place radix sort可以为您提供O(nlogk)时间,其中k是数字的范围,n是元素的数量。
请注意,对于递归调用的堆栈跟踪,算法需要O(logk)空间。
如果你可以将k绑定到常量(例如2 ^ 64) - 那么O(n)空间就会O(1)

排序后 - 您可以简单地迭代两个阵列并检查它们是否相同。

答案 1 :(得分:0)

如果您对数字本身的范围有严格的限制,则可以这样做。

比如说,你知道你有两个阵列A和B,并且这些数字绑定在-128和+127之间(8位签名)。您只需要一个包含256个位置的数组。每个号码n都会映射到位置n + 128

迭代两个数组,对于数组A,您将增加相应的位置,对于数组B,您递减。然后检查所有位置是否为0。如果是,则数组是排列,如果不是,则不是。

时间复杂度为O(n+k)。空间复杂度为O(k),其中k是数字的范围。由于kn无关,因此O(n)O(1)n有关,只要您对{{1}有约束}}

另请注意,时间复杂度可以进一步降低为k而不是O(n)。您只需保持一个非零计数的运行总数。每次递增/递减将计数推送到其他位置时,您都会增加运行总计。每次将推送到零时,您都会减少总数。最后,如果总数为0,则所有计数均为0。

编辑:Amit的答案可能有更好的空间复杂性,但是:)

PS:但是,如果数字数组是流入的,则可以应用此算法,因此它们实际上不必全部保存在内存中。所以它的空间复杂度可能小于直接排序如果条件合适