Java作业测试
我目前正试图为我的Data Structures类修改一个Java家庭作业程序,该类在表中显示MaxSumTest程序的输出 我已经创建了四个数组,并将它们放在计算计时信息的一个循环中。我试图用一个算法的计时信息填充每个数组。因此每个数组将有4个元素。然而,每次我运行我的程序修订版时,我都会得到一个越界错误 我唯一修改的方法是getTimingInfo。这是我的修订:Java作业测试,java,data-structures,Java,Data Structures,我目前正试图为我的Data Structures类修改一个Java家庭作业程序,该类在表中显示MaxSumTest程序的输出 我已经创建了四个数组,并将它们放在计算计时信息的一个循环中。我试图用一个算法的计时信息填充每个数组。因此每个数组将有4个元素。然而,每次我运行我的程序修订版时,我都会得到一个越界错误 我唯一修改的方法是getTimingInfo。这是我的修订: public static void getTimingInfo( int n, int alg ) { int []
public static void getTimingInfo( int n, int alg )
{
int [] test = new int[ n ];
long startTime = System.currentTimeMillis( );;
long totalTime = 0;
//create an array for each Algorithm
long[] alg4;
long[] alg3;
long[] alg2;
long[] alg1;
//allocate memory for 5 long ints
alg4 = new long[5];
alg3 = new long[5];
alg2 = new long[5];
alg1 = new long[5];
int i;
int j;
int index = 0;
for( i = 0; totalTime < 4000; i++ )
{
for( j = 0; j < test.length; j++ )
test[ j ] = rand.nextInt( 100 ) - 50;
index = j;
switch( alg )
{
case 1:
maxSubSum1( test );
break;
case 2:
maxSubSum2( test );
break;
case 3:
maxSubSum3( test );
break;
case 4:
maxSubSum4( test );
break;
}
totalTime = System.currentTimeMillis( ) - startTime;
}
alg1[index] = totalTime * 1000 / i;
alg2[index] = totalTime * 1000 / i;
alg3[index] = totalTime * 1000 / i;
alg4[index] = totalTime * 1000 / i;
//Build first column of table
System.out.println("Size of N Algorithms\t" + "250\t" + "2500\t" + "25000\t" + "250000");
System.out.println("Alg #4\t" + alg4[0] + "\t" + alg4[1] + "\t" + alg4[2] + "\t" + alg4[3] + "\t" + alg4[4]);
System.out.println("Alg #3\t" + alg3[0] + "\t" + alg3[1] + "\t" + alg3[2] + "\t" + alg3[3] + "\t" + alg3[4]);
System.out.println("Alg #2\t" + alg2[0] + "\t" + alg2[1] + "\t" + alg2[2] + "\t" + alg2[3] + "\t" + alg2[4]);
System.out.println("Alg #1\t" + alg1[0] + "\t" + alg1[1] + "\t" + alg1[2] + "\t" + alg1[3] + "\t" + alg1[4]);
/*
System.out.println( "Algorithm #" + alg + "\t"
+ "N = " + test.length
+ "\ttime = " + ( totalTime * 1000 / i ) + " microsec" );
*/
}
任何正确方向的建议或指点都将不胜感激
long[] alg1;
alg4 = new long[5];
可以更好地表示为
long[] alg1 = new long[5];
maxSubSum3( test );
写得像
maxSubSum3(test);
int j;
int index = 0;
实际上做同样的事情
只想挑出几点
可以更好地表示为
long[] alg1 = new long[5];
maxSubSum3( test );
写得像
maxSubSum3(test);
int j;
int index = 0;
实际上做同样的事情
只选取几个点。您正在将alg4、alg3、alg2和alg1设置为大小5,而不是您所说的需要的大小4。您正在将alg4、alg3、alg2和alg1设置为大小5,而不是您所说的需要的大小4。更新数组元素的行不应该在内部循环中吗
alg1[index] = totalTime * 1000 / i;
alg2[index] = totalTime * 1000 / i;
alg3[index] = totalTime * 1000 / i;
alg4[index] = totalTime * 1000 / i;
您在循环外部分配它们,其中索引的值为5,因此超出了范围。更新数组元素的行不应该在内部循环内部吗
alg1[index] = totalTime * 1000 / i;
alg2[index] = totalTime * 1000 / i;
alg3[index] = totalTime * 1000 / i;
alg4[index] = totalTime * 1000 / i;
您在循环外分配它们,其中索引的值为5,因此超出了范围。我不确定您到底想做什么,但我认为您真正想做的是多次调用getTimingInfo,然后将结果分配给表,而不是更改getTimingInfo的内部工作方式
这要求您定义将在其中存储getTimingInfo之外的计时数据的数组,然后getTimingInfo内部的唯一更改将是存储到已定义的数组,而不是打印。我不确定您到底想做什么,但我认为您真正想要做的是多次调用getTimingInfo,然后将结果分配给一个表,而不是更改getTimingInfo的内部工作方式
这要求您定义数组,在其中存储getTimingInfo外部的计时数据,然后getTimingInfo内部的唯一更改将是存储到已定义的数组,而不是打印。j最终将变为等于n,索引设置为j,因此如果指定n>5,您将访问alg超出其边界(定义为5)。j最终将等于n,索引设置为j,因此,如果您指定n>5,您将访问alg超出其边界(定义为5)。无法确定修复,但知道它与此相关。n=j=index,因此n>4会导致越界!好眼力:这就是我最初使用它们的地方,但在第一次迭代中,我得到了被零除的错误,我等于零。实际上,这是唯一可以放置它们而不使索引超出范围的地方。我不知道你的程序的功能,但也许你可以除以I+1?我无法确定修复方法,但我知道它与此相关。n=j=index,因此n>4会导致越界!好眼力:这就是我最初使用它们的地方,但在第一次迭代中,我得到了被零除的错误,我等于零。实际上,这是唯一可以放置它们而不使索引超出范围的地方。我不知道你的程序的功能,但也许你可以除以I+1?原始程序每行输出一个结果。例如,算法4=xxx,算法3=xxx。。。。我想做的是将每个算法的所有时间的结果存储到它们自己的数组中,然后以表格形式打印出来。我的观点是,您在错误的位置收集数据。getTimingInfo方法不会同时测试所有算法。它只测试一个算法,即每个调用由alg参数指定的算法。因此,创建数组并在函数中打印出来是没有意义的,每次调用只创建数组的一个条目。将此逻辑放在main中的正确位置是多次调用getTimingInfo的循环所在的位置。您完全正确。在这件事上我的逻辑完全错了。我将用main方法中的数组操作代码重写它。谢谢。原始程序每行输出一个结果。例如,算法4=xxx,算法3=xxx。。。。我想做的是将每个算法的所有时间的结果存储到它们自己的数组中,然后以表格形式打印出来。我的观点是,您在错误的位置收集数据。getTimingInfo方法不会同时测试所有算法。它只测试一个算法,即每个调用由alg参数指定的算法。因此,创建数组并在函数中打印出来是没有意义的,每次调用只创建数组的一个条目。Th
将此逻辑放在main中的正确位置,即多次调用getTimingInfo的循环所在的位置。您完全正确。在这件事上我的逻辑完全错了。我将用main方法中的数组操作代码重写它。谢谢