2011-07-07 133 views
2

的切片的最大索引找到我有一個大的陣列。我有一些Java代碼用於標識該大型數組的子集/切片的開始點和結束點的索引。我需要從數組的選定子部分檢索的唯一信息項是本地最大值和最小值的索引和值。什麼是最快(和最少內存密集型)的方式,我可以在指定範圍內找到最大值和最小值?爪哇:從陣列

這裏是什麼,我需要在代碼方面開始:

// Step One: declare new array and populate it 
pts = new double[5000]; 
for (int i = 0; i < 5000; i++){ pts[i] = (value assigned by extraneous process);} 
// Step Two: slice out section between indices 3600 and 3750 
    // what code do I write here? 
// Step Three: find max value in the sliced section and return its index 
    // what code to I write here? 
+0

所有本地最大值和本地最小值,或*任何*本地最大值/最小值? –

+0

只是一個最大值和整個切片的最小值 – CodeMed

+0

一旦找到最小/最大值,如果您要一次又一次搜索同一個區域,您可能希望存儲它們... – karnok

回答

4

只是遍歷所需的範圍和記錄最大值和最小值看到值:

double max = Double.NEGATIVE_INFINITY; 
double min = Double.POSITIVE_INFINITY; 
int minIndex = -1; 
int maxIndex = -1; 
for(int k = 3600; k < 3750; k++){ 
    if(max < pts[k]){ 
     max = pts[k]; 
     maxIndex = k; 
    }else if(min > pts[k]){ 
     min = pts[k]; 
     minIndex = k; 
    } 
} 
3

如果沒有必要創建數組的副本爲您切片,你基本上可以做到步驟2和3在一個下跌猛撲:

double max = pts[3600]; //the value of the first element in the slice 
int maxIndex = 3600; //keep track of the index as you go. Assume at first 
        //that it is the first index of the slice 
for(int i=3601; i<=3750; i++){ 
    if(pts[i] > max){ //you have encountered a larger element. Update the maxes 
    max = pts[i]; 
    maxIndex = i; 
    } 
} 
System.out.println("The max is " + max + " and occurred at index " + maxIndex); 

(對不起任何語法錯誤,我一直在使用Scala亂搞和語法是有點不同)

+0

你怎麼定義max?你在第一行將它聲明爲一個包含3600個元素的數組,但在第4行和第5行中將它用作單個值。 – CodeMed

+0

不,在第一行中,我聲明瞭max,並將其設置爲索引處的值該陣列的3600。我也可以將它設置爲Double.MIN_VALUE,它可能不會對整個代碼產生任何影響。 – Dylan

+1

@Dylan:Double.MIN_VALUE不是double可以表示的*最低*值,而是最小(如最接近零)值,如果您想要*最低*值,那就是負無窮大:Double。 NEGATIVE_INFINITY'(很多程序員被這個小而有害的錯誤絆倒了) –

1

有一個循環,在越過選定的第CE。

在循環中,你找到新的最大值或最小值調整四個變量maxValuemaxIndexminValueminIndex的值。

循環後,您將擁有最大值和最小值以及它們的位置。

沒有額外存儲器所需的,線性的性能(僅有一個傳過來的陣列的所選擇的部分)。

1

如果你打算這樣做了很多,你可以通過在不同的保持最大值/最小值的軌道提高性能秤。例如,如果您每20行保留一個列表,並且您想檢查範圍55 - 184,則只需要檢查5個值(55-59),然後從60-179中選擇6個值,然後4個值從180 - 184,所以這15個檢查,而不是130,20倍的速度增加。

當然,當數組發生變化並定期更新它們時,您需要將您的存儲桶標記爲已更改。