我正在用java编写一个程序,我需要滑动数组的元素,它应该尽可能少地执行操作,因为它在双循环中并且我正在处理数组的长度范围从最多10 ^ 8。
示例:A = {1,2,3,4,5,6} 结果:第一次A = {2,3,4,5,6,1} A = {3,4,5,6,1,2}第二次,依此类推......
请随时建议任何其他数据结构或对阵列的任何修改!感谢你们!! :d
答案 0 :(得分:10)
实现这种效果的最简单方法是做一个“圆形阵列”;也就是说,您可以简单地存储标记数组开头的索引,而不是移动数组的内容。
要获取索引i处的项目,请执行以下操作:
Type item = arr[(offset + i) % arr.length];
这样,您将获得与数组中相同的属性,并且可以在O(1)中执行任何旋转。
为了减少使用麻烦,你可以制作一个简单的包装类,简单地包装一个数组,允许通过这个方法轻松旋转。这样,代码看起来很干净,同时你可以获得有效的轮换。
答案 1 :(得分:6)
为了实现O(1)复杂性,你可以......
否则,如果您想坚持使用数据结构,无论如何都需要支付O(n)。
我选择(2),因为它对随机访问和线性访问模式都更快(数组具有更好的数据局部性+ O(1)随机访问复杂度和链接列表的O(n)。
答案 2 :(得分:4)
使用Collections.rotate(Arrays.asList(myArray), myDistance)
。
答案 3 :(得分:3)
如果您没有使用数组的想法,那么您可以使用Collections.rotate()方法。
List<Integer> list = new ArrayList<Integer>();
for (int i = 1; i <= 6; i++) {
list.add(i-1, new Integer(i));
}
int j = 0;
while (j < 100) {
Collections.rotate(list, -1);
System.out.print("{");
for (Integer integer : list) {
System.out.print(integer + ", ");
}
System.out.println("}");
}
答案 4 :(得分:2)
为什么你要旋转桌子? 想象一下,这个表是一个圆圈,之后你可以这样走:
Object object = array[(offset + i) % array.length];
这可以在任何访问或轮换步骤中给你O(1);
答案 5 :(得分:0)
您可以使用简单的List。如果你经常滑动,队列将是最好的选择。 问题是,数组并没有真正改变,你只是开始读取位置x,然后继续读取数组长度(数组)-x元素的开头。这是最快的Variant。