2017-09-14 188 views
3

我有大量的布爾值,我只需要處理真正的元素,並需要theyer索引。在布爾數組中迭代trues的快速方法

for (int x = 0; x < cells.length; x++) { 
     for (int y = 0; y < cells[0].length; y++) { 

       if (cells[x][y]) { 
        g.fillRect(x * cellSize, y * cellSize, cellSize, cellSize); 
       } 

     } 
    } 

所以我怎麼能沒有兩個foor循環,節省時間?

+0

我懷疑你不能。如果你想遍歷二維數組,你需要兩個循環(一個循環遍歷行,另一個遍歷列)或一個循環,它將迭代x * y(假設這些長度是固定的)次,但是你還需要花費一些計算時間會告訴你你正在訪問哪一行和哪一列。也許創造其他結構,它只保留應該使用的點,而不是保持「假」的位置。 – Pshemo

+0

是否有可能將單元格2d數組更改爲其他結構以僅保存真值? –

+0

@Sunil Singhal問題更多的是,當我產生40000 * 40000條目的其他結構通常很慢... – TheSorm

回答

2

我會說這是最好的,你可以得到。

您已經在使用原始數組,並且期望原始布爾類型。

我可以建議的唯一的事情是在final變量循環之前節省cells.lengthcells[0].length,它可以節省一些時間,但是編譯器可能已經優化這種自身。

0

不幸的是,由於你的要求,你是停留在O(n) ...這意味着,你將不得不遵守陣列中的每個值一次找到有true

0

您可以實現一些所有cellsarray wrapper這將鏈接true值(以設置操作的成本),以便您將只能迭代true索引。

+0

問題是包裝大多是初始化較慢。這是一個問題,兩個 – TheSorm

-1

我們可以這樣做,將int [數組]轉換爲字符串並找到其中存在1的索引。根據索引執行操作。

String arrayStr=Arrays.toString(cells[0].length); 

String booleanVal="1"; 
int index = word.indexOf(booleanVal); 

    while(index >= 0) { 

       if (cells[x][index]) { 
        g.fillRect(x * cellSize, index * cellSize, cellSize, cellSize); 
       } 

    index = word.indexOf(arrayStr, index+1); 
} 
+0

聽起來很有趣,我會嘗試一下,但我認爲它依賴於indexOf的實現,如果那真的更快。 – TheSorm

+0

尋找它和indexOf在O(n)在這種情況下工作,這比僅使用兩個for循環慢得多... – TheSorm

+0

如果爲內循環順序不重要,意味着序列。 y = 0,1,2,3,...等然後我們從中間開始,然後我們從左到右<- center ->右對齊ODD(1)值跳轉和偶數值跳轉。例如。 y(max)= 30 ...然後將從15開始... ... 13,14,15,16,17,... –

-1

通過這個你的內循環運行n/4次。它節省了時間..

傳遞| cells [0] .length/2 |的整數值。

/*********** */

for (int y=0, oddOccurLeft = cells[0].length/2,oddOccurRight = cells[0].length/2, evenOccurLeft=cells[0].length/2,evenOccurRight=cells[0].length/2; ;y++) { 

    if (cells[x][oddOccurLeft]) { 
        g.fillRect(x * cellSize, oddOccurLeft * cellSize, cellSize, cellSize); 
    } 

    if (cells[x][oddOccurRight]) { 
        g.fillRect(x * cellSize, oddOccurRight * cellSize, cellSize, cellSize); 
    } 

    if (cells[x][evenOccurLeft]) { 
        g.fillRect(x * cellSize, evenOccurLeft * cellSize, cellSize, cellSize); 
    } 

    if (cells[x][evenOccurRight]) { 
        g.fillRect(x * cellSize, evenOccurRight * cellSize, cellSize, cellSize); 
    } 

    ***if(oddOccurLeft<0 && oddOccurRight<0 && oddOccurRight>cells[0].length && evenOccurLeft>cells[0].length && evenOccurRight>cells[0].length) 
     break;*** 

    oddOccurLeft=oddOccurLeft-y*2+1; 
    oddOccurRight=oddOccurRight+y*2+1; 

    evenOccurLeft=evenOccurLeft-y*2; 
    evenOccurRight=evenOccurRight+y*2; 

    }