2013-05-03 137 views
-2

這段代碼是找到一個整數數組的峯值數 問題是我得到一個錯誤Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7我怎樣才能解決這個遞歸

public long DivideAndConquer(int lo,int hi) 
{ 
    int mid=((lo+hi)-1)/2; 
    if(myarray[mid]>=myarray[mid-1]&&myarray[mid]>= myarray[mid+1]) 
    return myarray[mid]; 
    else if (myarray[mid-1]>= myarray[mid]) 
    return DivideAndConquer(lo,mid-1); 
    else if (myarray[mid]<=myarray[mid+1]) 
    return DivideAndConquer(mid+1,hi); 
return 99; 

} 

峯值數是比他們的鄰居更大,如果我在數組的末尾或者在隨後開始的時候我只有去尋找預覽元素。

我想我得到這個錯誤,因爲如果我的元素在最後的位置比預覽大,那麼是一個高峯。例如我的最後一個位置是9,那麼我有myarray[9] > myarray[8]然後是一個高峯,但在第一個if語句看起來也是myarray[9+1],我沒有,所以它給了我這個錯誤。

我無法刪除第一條語句的&&並添加「或」(||),因爲那時我得到了錯誤的答案。請有任何想法嗎?

+0

你確定你瞭解比較是怎麼回事嗎? – Stefan 2013-05-03 10:51:20

+0

你沒有傳遞你想要搜索的元素。你想做什麼? – Maroun 2013-05-03 10:54:02

+1

我認爲這會更容易,如果你指定你正在使用什麼輸入,當你得到的錯誤,例如:'int [] myarray = new int [] {1,2,3,4,5};'此外,它如果你確切地解釋'hi'和'lo'應該是什麼,那將是很好的。我認爲'lo'最初是數組中第一項的索引,'hi'將是數組中最後一項的索引。但是,對於「中」的計算沒有意義。例如。如果有5個項目:((lo + hi)-1)/ 2 =((0 + 4)-1)/ 2 = 3/2 = 1'但是中間項目的索引是2 – Alderath 2013-05-03 11:36:35

回答

0

不考慮算法的正確性,我來到了索引以下更改安全:

public long DivideAndConquer(int lo,int hi) 
{ 
    int mid=(lo+hi)/2; // Valid range 
    if((lo<mid||myarray[mid]>=myarray[mid-1]) 
       &&(hi>mid||myarray[mid]>= myarray[mid+1])) 
     return myarray[mid]; 
    else if (lo<mid&&yarray[mid-1]>= myarray[mid]) 
     return DivideAndConquer(lo,mid-1); 
    else if (hi>mid&&myarray[mid]<=myarray[mid+1]) 
     return DivideAndConquer(mid+1,hi); 
    return 99; 
} 
+0

它不這樣工作。它只發送給我中間號碼 – user2346073 2013-05-03 11:02:09

+0

@ user2346073你應該知道你想要什麼,然後再期待一些事情。你的邏輯是不正確的。 – Maroun 2013-05-03 11:02:43

+0

我使用該遞歸來檢查該元素的鄰居是否小於特定元素。代碼中的問題是它查找數組[mid + 1]的最後一個元素不存在,因爲數組的大小是7,如果我查找數組[mid + 1]是8,最後一次我不想檢查數組[中+ 1],因爲如果最後一個元素大於預覽,那麼它可以返回該元素 – user2346073 2013-05-03 11:04:45

0

當你「的if-else-如果 - 」實現這樣的decicision級聯像...建設必須確保每個案件都得到處理。

此外,你必須確保任何計算數組索引對給定數組有效。這個要求可能會引入更多的「if」語句。

在你的文本中,你寫了「如果我在數組的末尾或開頭」,但在你的代碼中沒有檢查這些條件的「if語句」。

+0

我不檢查該條件,因爲我使用分而治之,當上次我劃分我不得不只看預覽元素,如果更大,那麼我必須返回該元素 – user2346073 2013-05-03 11:08:53

+0

你的代碼不會做你所描述的文字。正如其他人已經說過的:目前還不清楚你想達到什麼。 – mschenk74 2013-05-03 11:24:52

+0

我想從n個元素的數組中找到峯值。 – user2346073 2013-05-03 11:27:28

1

就像你說的那樣,問題在於當mid是數組中的最後一項時,您的實現嘗試查看索引mid + 1。你需要處理這種情況。像下面這樣:

public long DivideAndConquer(int lo,int hi){ 
    int mid = (lo+hi)/2; //Modified to select the middle item 
    if(mid + 1 >= myarray.length){ 
     //TODO: Handle the case when mid is the index of the last item in the array 
    } else if(mid - 1 < 0){ 
     //TODO: Handle the case when mid is the index of the first item in the array 
    } else if(myarray[mid]>=myarray[mid-1]&&myarray[mid]>= myarray[mid+1]){ 
     return myarray[mid]; 
    } else if (myarray[mid-1]>= myarray[mid]){ 
     return DivideAndConquer(lo,mid-1); 
    } else if (myarray[mid]<=myarray[mid+1]){ 
     return DivideAndConquer(mid+1,hi);' 
    } 
    return Long.MIN_VALUE; //Probably a more suitable error indicator than 99 
    //Alternatively, an exception could be thrown 
} 

如果使用上面的方法建議,實施的mid - 1 < 0mid + 1 >= myarray.length案件處理時要特別小心。當myarray.length僅爲12時,您可能需要對案例進行一些特殊處理。

+0

我知道我可以用這種方式解決它,但我只能使用遞歸。我確信它可以完成但我找不到解決方案。 – user2346073 2013-05-03 12:05:55

+1

@ user2346073 Uhm ...您的遞歸涵蓋一個基本情況(當峯位於數組內部時)。但是,當算法達到數組的開始或結束時,您完全忽略了遞歸基礎案例。這些是我建議你應該在上面的提案中添加的基本案例。該算法仍然是遞歸的。唯一的區別是這個品種涵蓋了所有必要的基礎案例。 – Alderath 2013-05-03 12:48:34

相關問題