我想要反转一个数组(或任何其他数据结构),但因为这个操作将在数组上进行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个索引 提前谢谢
答案 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!