反转数组的一部分(或任何其他数据结构)

时间:2011-12-01 09:41:26

标签: java arrays reverse

我想要反转一个数组(或任何其他数据结构),但因为这个操作将在数组上进行n次,我正在寻找可能的最佳解决方案,我有一个已排序的数组,它是在O(nlgn)时间,我开始在排序数组中查找第一个元素,在未排序数组中(等于查找未排序数组中的最小键)然后我将数组从开头反转到该值的索引,然后我对其余部分做同样的事情,找到第二个最小值的索引,然后再次反转数组,从第二个索引到数组的末尾,依此类推:
例如,考虑这个数组:

*‫2 6 (*1*) 5 4 *3‬  // array is reversed from its 0th index to the 3rd index (0 based)     
1 *5* 4 3 6 (*2*)  // array is reversed from its 1st index (0 based ) to the 5th index   
1 2 *6* *3* 4 5    // and ...  
1 2 3 *6* *4* 5  
1 2 3 4 *6* *5*  
1 2 3 4 5 6 

我必须对数组进行排序,以便在未排序的数组中查找值,它将花费o(nlgn)时间,并且执行上面的算法,将采用o(n ^ 2),任何在o(nlgn)时间内完成更快速的想法?所以问题是在最短时间内反转数组的子数组,导致它在大型数组中多次完成。 (我可以在O(n)时间得到索引i和j(这是子数组的第一个和最后一个索引)因为我有排序的数组,我只是查找未排序数组中的数字)所以即时通讯寻找最佳时间顺序,将数组从它的第i个索引反转到第j个索引 提前谢谢

3 个答案:

答案 0 :(得分:0)

(可能)记忆沉重......

为什么不保留两个收藏集。遍历原始集合,直到找到您的反向点。然后使用迭代器或索引从那里向后遍历(如果有)(ArrayList)将每个元素添加到新集合中。然后合并两个集合(反转部分和前一个未触摸部分)。重复此操作直到完成。

答案 1 :(得分:0)

似乎是对一个复杂问题的一个非常简单的答案,所以也许我错过了一些东西。如果您正在寻找一种有效的方法来反转数组的一部分,那么类似下面的内容应该可行。当然,你可以轻松地使它成为通用的。

// endIndex and startIndex are inclusive here
int half = startIndex + ((endIndex + 1) - startIndex) / 2;
int endCount = endIndex;
for (int startCount = startIndex; startCount < half; startCount++) {
    int store = array[startCount];
    array[startCount] = array[endCount];
    array[endCount] = store;
    endCount--;
}

似乎代码的其余部分会比这复杂得多。不确定O()在这里是什么,因为它没有进行传统上比较的比较,但这是做1.5 x N分配来反转数组。我认为没有办法更快地完成这项工作。

答案 2 :(得分:0)

这是一个O(n)解决方案(我认为,阅读你的描述很难)。它是一种数据结构,它允许1)在O(1)中反转子数组,2)从数组中获取O(r)中的值,其中r是数字完成的反转,3)在O(n)中找到元素的索引,其中n是列表的长度。

像往常一样存储我们的数组,并有一个ReversedRange(imin, imax)元素列表。反转数组的一部分就像在此列表中插入另一个元素一样简单。

每当您需要从索引i的已修改数组中获取值时,您将查看ReversedRange的所有imin <= i <= imax,并计算索引j对应于原始数组索引。您需要检查r倒置,因此它是O(r)。

要获取值i的索引v,请查看原始数组并找到索引j。在O(n)时间内完成。对ReversedRange进行相同的遍历,仅在对方方向上计算i。在O(r)时间内完成,总O(n + r)即O(n)。

示例

请考虑以下列表:0 1 2 3 4 5 6 7 8 9。现在说我们将列表形式索引1反转到6,然后从0反转到5。所以我们有:

I    0 1 2 3 4 5 6 7 8 9
       |         |
II   0 6 5 4 3 2 1 7 8 9
     |         |
III  2 3 4 5 6 0 1 7 8 9

不要让我们将索引i = 2映射到原始数组。从图表中我们可以看到最终会得到III(2) = 4

1) since i = 2 is in [0, 5] we calculate
    i <- 5 - (i - 0) = 5 - 2 = 3
2) since i = 3 is in [1, 6] we calculate
    i <- 6 - (i - 1) = 6 - 2 = 4
3) there are no more ranges, we are done with result 4!