基于java算法的数组滑动

时间:2011-05-06 12:42:08

标签: java arrays algorithm

我正在用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

6 个答案:

答案 0 :(得分:10)

实现这种效果的最简单方法是做一个“圆形阵列”;也就是说,您可以简单地存储标记数组开头的索引,而不是移动数组的内容。

要获取索引i处的项目,请执行以下操作:

Type item = arr[(offset + i) % arr.length];

这样,您将获得与数组中相同的属性,并且可以在O(1)中执行任何旋转。

为了减少使用麻烦,你可以制作一个简单的包装类,简单地包装一个数组,允许通过这个方法轻松旋转。这样,代码看起来很干净,同时你可以获得有效的轮换。

答案 1 :(得分:6)

为了实现O(1)复杂性,你可以......

  1. 使用链接列表
  2. 使用存储起始位置的类包装数组,并允许您通过“虚拟”索引访问数组(wrapped.acces(i)=> array [(start + i)%array.length]
  3. “加倍”您的数组并以适当的方式对其进行切片(因此您无需更改周围的代码)
  4. 否则,如果您想坚持使用数据结构,无论如何都需要支付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。