如何保存算法命令数组的步骤?

时间:2014-02-09 01:21:53

标签: java algorithm

我目前正在尝试用Java开发一个程序,该程序必须打印一个算法用于对数组中的元素进行排序的步骤(每次更改时数组中的所有元素),其中print表示在控制台中显示它,保存它作为文件或SwingComponent。

现在我正在使用Arraylist< int []>保存步骤,但它只允许我在抛出异常之前对少于1k的元素进行排序。

无论如何我可以保存更多元素的步骤吗?

代码

package tests;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class BubbleSort{

    public void sort( int[] array, List<int[]> process ){

        int len = array.length - 1;
        int i, j, tmp;

        process.add( array.clone() ); //Save original array
        for( i = 0; i < len; ++i ){
            for( j = 0; j < len - i; ++j ){
                if( array[ j ] > array[ j + 1 ] ){
                    tmp = array[ j ];
                    array[ j ] = array[ j + 1 ];
                    array[ j + 1 ] = tmp;
                    process.add( array.clone() ); //Array changed, save it
                }
            }
        }
    }

    //creates a random array
    public static int[] randomIntegerArray( int min, int max, int amount ){

        int[] array = new int[ amount ];
        int total = max - min;
        List< Integer > numbers = new ArrayList<>( total );
        int i = 0;

        for( i = min; i < max; ++i ){
            numbers.add( i );
        }

        Collections.shuffle( numbers );

        for( i = 0; i < amount; ++i ){

            array[ i ] = numbers.remove( 0 );
        }

        return array;
    }

    public static void main( String[] args ){
        BubbleSort bubbleSort = new BubbleSort();
        List<int[]> process = new ArrayList<>();
        int[] noError = randomIntegerArray( 0, 1000, 500 ); //Works up ~ 900
        int[] error = randomIntegerArray( 0, 1000, 1000 );

        bubbleSort.sort( noError, process);// Works
        //bubbleSort.sort( error, process);// throws java.lang.OutOfMemoryError: Java heap space in line 22

        //Print steps
        //for( int[] a : process ){ System.out.println( Arrays.toString( a ) ); }

    }

}

1 个答案:

答案 0 :(得分:1)

  

无论如何我可以保存更多元素的步骤吗?

方法#1 - 增加堆大小。不幸的是,这不会扩展。

方法#2 - 不是在每次交换后保存整个数组,只需保存交换的元素对的详细信息。如有必要,您可以通过重放交换操作重建数组...从初始数组状态向前或从最终状态向后。

方法#3 - 根本不保存步骤。只需在排序时将它们输出到控制台/文件/ Swing组件。


关于可扩展性。

  • 您正在使用bubblesort,这意味着某种N元素数组涉及O(N^2)个步骤。
  • 如果您在每个步骤上对整个阵列进行快照,则需要O(N^3)个内存来保存它们。对于大N,那就是很多的内存!!
  • 如果您只是存储交换的数组元素对的详细信息,则内存要求会减少到O(N^2)。那仍然是很多记忆。
  • 如果您根本不存储详细信息(因为您直接输出它们!),内存要求将降至O(N),以便进行简单的实施。 (这是将数组状态格式化为字符串所需的内存量。如果需要,可以将其实现为O(1)。)

我正在使用的O(...)内容称为"Big O" notation。粗略地说,O(N)意味着与N成比例......因为N倾向于无穷大。这方面的数学基于极限。