這是一個使用分而治之找到最大子陣列的程式。
我不斷收到此錯誤:
執行緒“main”中的例外 java.lang.ArrayIndexOutOfBoundsException: 10
? ? at Assignment1.main(Assignment1.java:67)
我想我在函式呼叫中傳遞了不正確的變數,但我不確定
import java.util.*;
public class Assignment1 {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("Enter array size: ");
int size = input.nextInt();
System.out.println();
//System.out.print("Enter array elements");
//System.out.println();
int[] numbers = new int[size];
for(int i=0; i<numbers.length; i ){
numbers[i]= i;
}
int k = numbers[numbers.length];
int z = numbers[0];
// store the time now
long startTime = System.nanoTime();
// linear search for size (which is not in the array)
int output = bruteForce(numbers);
System.out.println();
System.out.print(output);
System.out.println();
// display the time elapsed
System.out.println("The time taken by Linear Search is " (System.nanoTime() - startTime) " nanoseconds.");
/// prepare to measure the time elapsed again
startTime = System.nanoTime();
// binary search for size
int y = max_subarray(numbers,z,k);
System.out.print(y);
// display the time elapsed
System.out.println("The time taken by Binary Search is " (System.nanoTime() - startTime) " nanoseconds.");
}
public static int bruteForce(int[] a) {
int n = a.length;
int maximumSubArraySum = Integer.MIN_VALUE;
int start = 0;
int end = 0;
for (int left = 0; left < n; left ) {
int runningWindowSum = 0;
for (int right = left; right < n; right ) {
runningWindowSum = a[right];
if (runningWindowSum > maximumSubArraySum) {
maximumSubArraySum = runningWindowSum;
start = left;
end = right;
}
}
}
return maximumSubArraySum;
}
public static int max(int a, int b, int c)
{
if (a>=b && a>=c)
return a;
else if (b>=a && b>=c)
return b;
return c;
}
public static int max_subarray(int[] a, int low, int high) {
if (high == low)
{
return a[high];
}
else {
int mid = ((low high)/2);
int leftsum = max_subarray(a,low,mid);
int rightsum = max_subarray(a,mid 1,high);
int crosssum = maxCrossingSubarray(a,low,mid,high);
return max(leftsum,crosssum,rightsum);
}}
public static int maxCrossingSubarray(int[] a, int low, int mid, int high){
int leftsum = Integer.MIN_VALUE;
int sum =0;
for(int i=mid; i>=low; i--){
sum = a[i];
if (sum> leftsum)
{
leftsum = sum;
}}
int rightsum = Integer.MIN_VALUE;
sum =0;
for(int j=mid 1; j<=high; j ){
sum = a[j];
if (sum> rightsum)
{
rightsum = sum;
}}
return(leftsum rightsum);
}
}
uj5u.com熱心網友回復:
這個問題看起來像這里的代碼:
int k = numbers[numbers.length];
int z = numbers[0];
至少在我看來,正確的代碼是:
int k = numbers[numbers.length - 1];
int z = numbers[0];
更正這一點,代碼將運行。當嘗試將數字陣列長度(我輸入 10 作為大小,這用于將數字陣列分配給 size 的值以用于測驗目的)分配給 int k 時,它會給您陣列索引超出范圍例外,因為輸入是 1超過索引陣列長度。輸入 10 后,輸出將是,修正后:
輸出:輸入陣列大小:10
45 線性搜索所用時間為 67000 納秒。45 二分查找所用的時間為 15400 納秒。
當您輸入 10 時,它超出了范圍,因為陣列從 0 開始并在 9 結束(當用戶輸入 10 時)。所以 10 超出范圍。要執行您想做的事情,只需從用戶輸入中減去 1,這將為您提供正確分配給 int k 的長度。
干杯!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/510094.html
標籤:爪哇算法分而治之
上一篇:樹遍歷到第n個節點
