有序資料集合中存在重複的資料,希望找到第乙個值等於給定值的資料
有乙個有序陣列,a[5],a[6],a[7]=8,希望查詢第乙個等於8的資料,即下標為5的元素
public int bsearch(int a ,int n,int value)else
} if(low < n && a[low]==value) return low;
else return -1;
}
該方式不好理解,換一種實現方法:
public int bsearch(int a ,int n,int value)else if(a[mid] < value)else
} return -1;
}
當a[mid] == value的時候該如何處理?
我們查詢的是任意乙個值等於給定值的元素,當a[mid] == value的時候,a[mid]就是我們要找的元素,但是還得確認一下是不是第乙個值等於給定值的元素,如果mid == 0的時候那這個元素已經是陣列的第乙個元素,那它肯定是我們要找的,如果mid != 0,但是a[mid]的前乙個元素a[mid-1] != value,說明a[mid]就是第乙個值等於給定值的元素
如果經過檢查之後發現a[mid-1] == value,說明此時的a[mid]不是我們要找的,更新high = mid-1,因為我們要找的肯定是在[low,mid-1]之間
public int bsearch(int a,int n ,int value)else if(a[mid] < value)else
} return -1;
}
如果a[mid]這個元素時陣列中最後乙個元素,或者後乙個元素a[mid + 1 ]不是value,肯定是最後乙個值等於給定值的元素
查詢第乙個大於等於給定值的元素,如果陣列中儲存乙個序列:3,4,6,7,10,查詢第乙個大於等於5的元素,即6
public int bsearch(int a ,int n ,int value)else
} return -1;
}
還是3,5,6,8,9,10,查詢最後乙個小於等於7的元素即6
public int bsearch(int a ,int n ,int value)else
} return -1;
}
先預處理這12w條資料,先讓其按照起始ip從小到大排序,ip位址可以轉化為32位的整形數,所以我們可以將起始位址按照對應的整形數的大小關係從小到大的進行排序,然後我們可以按照變形四:查詢最後乙個小於等於某個給定值的元素
當我們要查詢某個ip歸屬地的時候,可以先通過二分查詢,找到最後乙個起始ip小於等於這個ip的ip區間,檢查這個ip是否在這個ip區間內,如果在,取出對應的歸屬地顯示,不再,返回未查到
凡是能用二分查詢解決的,更傾向於用雜湊表或者二叉查詢樹,二分查詢更適合用在近似查詢問題上
leetcode 33
一、1.找到分界下標,分成兩個有序陣列
2.判斷目標值在哪個有序資料範圍內,做二分查詢
二、1.找到最大值的下標x
2.所有元素下標+x偏移,超過陣列範圍值的取模
3.利用偏移後的下標做二分查詢
4.如果找到目標下標,再做-x偏移就是目標值實際下標
三:以陣列中間點為分割槽,會將陣列分成乙個有序陣列和乙個迴圈有序陣列,如果首元素》 1);
if(nums[mid] == target) return mid ;
if(nums[low] <= nums[mid])else
}else if (nums[low] > nums[mid])else
}} return -1;
}
快速排序 二分查詢
1.舉例說明一下吧,這個可能不是太好理解。假設要排序的序列為 2 4 9 3 6 7 1 5 首先用2當作基準,使用i j兩個指標分別從兩邊進行掃瞄,把比2小的元素和比2大的元素分開。首先比較2和5,5比2大,j左移 2 4 9 3 6 7 1 5 比較2和1,1小於2,所以把1放在2的位置 1 4...
快速排序 二分查詢
基準數後面的數需要大於基準數,從後向前尋找a j tmp,尋找到a 8 的3 5,將a 8 放入空位a 0 中,a j a 8 此時空出位置 接著從前向後遍歷a i 5,找到a 1 符合條件,將a 1 放入空位a 8 a 1 空出 繼續從後向前尋找 繼續從後向前尋找 遍歷至i j 結束,此時i前邊元...
1026 二分查詢(下)
目錄 一 四種常見的二分查詢變形問題 二 實現 三 適用性分析 四 思考 1.查詢第乙個值等於給定值的元素 2.查詢最後乙個值等於給定值的元素 3.查詢第乙個大於等於給定值的元素 4.查詢最後乙個小於等於給定值的元素 前提假設 以資料是從小到大排列為前提來實現 1.查詢第乙個值等於給定值的元素,比如...