二分法查詢一個有序且非降序陣列出現的數值的頻率

在一個非降序的陣列中查詢給定數值出現的頻率,

要求空間複雜度 O(1)O(1),時間複雜度 O(logn)O(logn)

比如:陣列 {1,1,2,3,3,3,3,4,5},查詢3的頻率,正確結果為4

很明顯,非降序其實就是一個升序的,但允許重複的值出現而已,如果沒有時間複雜度的O(logn)的要求,直接從頭遍歷就可以統計了,這是暴力的解法,顯然這種演算法的時間複雜度為

O(n),不符合要求,想來想去只能是二分法了,可以使用二分法進行遞迴,關於演算法,在程式碼的註釋中已經說明了

程式碼如下:

/** * 二分法查詢重複出現的數字 * 非降序,有序陣列,查詢給定數值出現的頻率 * @author ssj * */public class HalfFind { static int count=0; public static void main(String[] args) { int[] arr = {1,1,2,3,3,3,3,4,5};//非降序,有序陣列 half(arr, 0, arr。length-1, 3);//查詢3在陣列中出現的頻率 System。out。println(“頻率=”+count); } /** * * @param arr * @param start 陣列開始 * @param end 陣列結束 * @param val 要查詢的值 */ public static void half(int [] arr,int start,int end,int val) { int mid = (start+end)/2; if(arr[mid]==val) { //發現了要找的值,統計加一 count++; //因為中間值與要找的值相等,所以左右兩半都可能還存在,需要兩邊繼續查詢 if(mid-1>=start) { half(arr, start, mid-1, val); } if(mid+1<=end) { half(arr, mid+1, end, val); } }else if(arr[mid]val) { //參考值小於中間值,只能在左邊 if(mid-1>=start) { half(arr, start, mid-1, val); } } }}

執行結果:

二分法查詢一個有序且非降序陣列出現的數值的頻率