使用O(1)额外内存重新排列数组的时间比O(n ^ 2)快

时间:2012-04-03 23:02:05

标签: algorithm

假设我有以下数组:

1, 4, 5, 2, 3

我需要将其重新排列为

5, 1, 4, 2, 3

只有额外的空间;一个int

我想出了一个解决方案。但这是O(n^2)复杂性。

任何人都可以提供更快的解决方案吗?

由于

编辑: 对不起,不是旋转阵列。

我需要将原始数组更改为结果数组。 订单可以是任意的。 我只需要制作A - > B. B被告知了我。

感谢

编辑2“

让它更清晰。 数组B不固定。 我们需要找到一个通用的解决方案。

更新:

谢谢大家。这似乎是一个脑筋急转弯的问题。哈哈:D

我的朋友被亚马逊采访者问过这个问题。 LOL

4 个答案:

答案 0 :(得分:2)

在我看来,这只是对数组进行排序的一种特殊情况,其中排序顺序相当随意。因此,最佳算法将具有时间复杂度O(n log n),并且使用进行就地排序的算法(以不是稳定排序为代价)将具有空间复杂度O(1)。如果平均 O(n log n)正常,那么就地merge sort将适合该帐单,就地quicksort

答案 1 :(得分:1)

此解决方案使用O(1)空间。

>>> def arrayswap(source, dest):
...     for i in range(len(dest)):
...         source[source.index(dest[i])], source[i] = source[i], source[source.index(dest[i])]
... 
>>> a = [1, 4, 5, 2, 3]
>>> b = [5, 1, 4, 2, 3]
>>> arrayswap(a, b)
>>> a
[5, 1, 4, 2, 3]

不使用python的元组打包,source [i]或source [source.index(dest [i])]之一的值可以存储在int中。

答案 2 :(得分:0)

看起来你只是将前三个元素向左移动(带有环绕)。

所以,忽略索引3和4。

  int temp = array[0]
  array[0] = array[1]
  array[1] = array[2]
  array[2] = temp

答案 3 :(得分:-1)

你可以这样做:

temp = arr[0];
arr[0] = arr[2];
arr[2] = arr[4];
arr[4] = arr[1];
arr[1] = arr[3];
arr[3] = temp;

编辑:

要将数组a重新排列为数组b,您可以这样做:

for (var i = 0; i < a.length; i++) {
  for (var j = i + 1; a[i] != b [i]; j++) {
    var temp = a[i];
    a[i] = a[j];
    a[j] = temp;
  }

}

演示:http://jsfiddle.net/Guffa/5sKdM/

我不确定这个大O是什么,但是通过示例数据,它进行了7次比较和2次交换,所以这肯定比O(n 2 )好。

另外,我不确定究竟什么算作“额外空间”,所以我不知道这是否满足一个额外空间的要求,但如果没有,那么当前接受的答案也不是...