2017-01-31 85 views
3

我有一個帶有布爾值的數組。但是這些元素的順序如下: 首先去true值,然後false值。 例如,用布爾值對數組進行二進制搜索

boolean[] booleans = {true, true, true, true, true, 
       false, false, false, false, false, false}; 

所以,現在我們有一個布爾值排序的數組,true值開始,如果true值存在。

任務是找到第一個false元素。
我創建了一個使用二進制搜索算法的搜索方法的類。

public class BinarySearch { 

    public static int search(boolean[] array) { 

     int low = 0, mid = 0; 
     int high = array.length - 1; 
     boolean booleanValue; 

     while (low <= high) { 
      mid = (low + high) >>> 1; 
      booleanValue = array[mid]; 
      if (booleanValue) low = mid + 1; 
      else high = mid - 1; 
     } 

     return mid == array.length - 1 ? -(low + 1) : mid; 
    } 

    public static void main(String[] args) { 

     boolean[] booleans = {true, true, true, true, true, 
       false, false, false, false, false, false}; 

     int search = search(booleans); 
     System.out.println("search = " + search); 
    } 
} 

它工作不正確,即有時它正在返回搜索到的一個元素。
通過迭代搜索來查找元素也不是個好主意,因爲數組的大小可能非常大,而且需要很長時間。

編輯:其實我需要在MySQL數據庫表中搜索。但是表格大小太大,查找所需的行花費很多時間,我想使用二進制搜索算法進行緊固。

編輯: MySQL表大小超過4500萬行。無論是否在列中添加索引,通過SQL查詢搜索所需的行大約需要30秒。此外,在boolean中添加索引不起作用。
當我使用二分查找時,大約需要10毫秒。所以我想要糾正上述方法。
編輯:例如,我有稱爲「信息」的數據庫表。它有兩列「INFO」(TEXT)和「CHECKED」(BOOLEAN)。 「INFO」的初始值是false。我會得到第一個未經檢查的信息,並從未選中開始獲得N行,然後我將檢查它們並將它們標記爲true。過程將被重複,直到沒有未經檢查的信息。

+0

使用調試器。 –

+0

並搜索大小爲奇數時的錯誤?我沒有看到一個問題,所以我寫這一個;) – AxelH

+0

@AxelH找到第一個假元素 – Vanguard

回答

3

我修改了辛黃答案並簡化了碼位:

public static int search(boolean[] array) { 

    int low = 0, mid; 
    int high = array.length - 1; 
    boolean booleanValue; 

    while (low <= high) { 
     mid = (low + high) >>> 1; 
     booleanValue = array[mid]; 
     if (booleanValue) low = mid + 1; 
     else if (low == mid) return mid; 
     else high = mid; 
    } 
    return -low; 
} 

所以,現在該方法如果元素中找到的陣列,且負值在返回第一false元素的索引,如果元件沒有找到。

1

在循環,如果的booleanValue是假

  1. 如果低=中旬,開始點和結束點滿足,我們發現了什麼,我們需要
  2. 其他高=月中旬以來年年中,絕對是一個潛在的候選

修改如下:

while (low <= high) { 
     mid = (low + high) >>> 1; 
     booleanValue = array[mid]; 
     if (booleanValue) { 
      low = mid + 1; 
     } 
     else { 
      if (low == mid) { 
       break; 
      } 
      high = mid; 
     } 
    } 
+1

當所有值== true時,此代碼仍然存在錯誤。你可能想要更新你的特殊情況'mid == array.length -1'的返回值。 –

+0

請改變'如果(低== MID){打破;}''來,如果(低==中期)收益mid',並最後返回'回報 - (低+ 1);' – Vanguard