二分法學習筆記第一版

2022-05-09 09:09:09 字數 1878 閱讀 7589

/**

* 子有序表中搜尋target對應的下標,若不存在,則返回-1;

* @param arr 公升序陣列

* @param target

* @return

*/public static int serachspevalue(int arr, int target)

return -1;

}

watch out! 左邊下標是length - 1 ,即指向最後乙個元素。所一while迴圈必須是low <= high ,不能是low < high。當low == high 時,這個時候不能退出迴圈,必須還要查詢一次。

/**

* 搜尋第乙個大於等於target的值

* @param arr 公升序陣列

* @param target

* @return

*/public static int searchfirstgreaterorequaltarget(int arr, int target)

if (high == length)return -1; // 不存在的話,high = length

return high; // high對應第乙個大於等於的數字

}**這裡high變成了length, 指向陣列最後元素的下乙個位置,所以呢,while迴圈不可以取等號。極易產生死迴圈,通過模擬可以知道,最後返回值的下標為high,但是要考慮到如果這樣的值不存在咋辦,不存在時high為陣列長度,所以最後判斷以下即可

***

這題的**其實就是搜尋陣列中大於等於某個特定值的數的變形。最後返回結果的下標變成high-1就可以了。

/**

* 搜尋第乙個小於的數字,就是搜尋第乙個大於等於target的值的變體,修改下搜尋不到的條件

* if (arr[0] >= target)return -1;

* 退出後返回high - 1;

*/public static int searchlastlesstarget(int arr, int target)

if (high == 0)return high - 1; // 不存在的話,high = 0 ,則返回-1

return high - 1; // high對應第乙個大於等於的數字,沒有返回length,減一後必然小於target。

}

**這裡注意一下,如果最發現不存在這樣的數字,high指向0,所以減一後就返回-1了,也可以把return前面的if判斷給刪了。

/**

* 搜尋第乙個大於target的值的下標,不存在則返回-1

* @param arr 公升序陣列

* @param target

* @return

*/public static int searchfirstgreatertarget(int arr, int target)

if (high == length)return -1;

return high;

}

/**

* 搜尋第乙個小於等於target的數字,就是搜尋第乙個大於target的值的變體,修改下搜尋不到的條件

* if (arr[0] > target)return -1;

* 退出後返回high - 1;

*/public static int searchlastlessorequaltarget(int arr, int target)

// if (high == 0)return high - 1; 和下一句合併

return high - 1;

}

二分法學習筆記

當資料量很大適宜採用該方法。採用二分法查詢時,資料需是排好序的。基本思想 假設資料是按公升序排序的,對於給定值x,從序列的中間位置開始比較,如果當前位置值等於x,則查詢成功 若x小於當前位置值,則在數列的前半段中查詢 若x大於當前位置值則在數列的後半段中繼續查詢,直到找到為止。演算法 假如有一組數為...

二分法學習筆記

當資料量很大適宜採用該方法。採用二分法查詢時,資料需是排好序的。基本思想 假設資料是按公升序排序的,對於給定值x,從序列的中間位置開始比較,如果當前位置值等於x,則查詢成功 若x小於當前位置值,則在數列的前半段中查詢 若x大於當前位置值則在數列的後半段中繼續查詢,直到找到為止。演算法 假如有一組數為...

ACM二分法學習小結

1 二分查詢 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。二分查詢要求 線性表是有序表,即表中結點按關鍵字有序,並且要用向量作為表的儲存結構。不妨設有序表是遞增有序的。2 二分查詢的基本思想 二分查詢的基本思想是 1 首先確定該區間的中點位置 2 然後將待查的k值與r mid key比較 若相...