1.3-1.5 Hash的應用、排版題、查找
1.3 Hash的應用
何時使用Hash:
一般情況下,我們是想不到使用Hash的。讀完題目,設計算法後,分析設計算法的時間、空間複雜度。此時,如果時間複雜度不能被接受,則考慮使用Hash。
如下題:要求按順序輸出。數據量大小爲1000000,即使當我們採用時間複雜度爲O(nlogn)
的快速排序時,數量級也會超過千萬級,因此很難滿足1s
的時間限制。
所以我們採用空間換時間的方法。
採用[0,1000000]
的數組存儲[-500000,500000]
的整數,這樣從頭至尾遍歷數組,即可得出結果。時間複雜度爲百萬級,空間複雜度爲也符合要求。
時間限制:1s,內存限制:128MB,特殊判題:否
1.4 排版題
這類題型對輸出格式要求很嚴格,有兩種輸出方式:
- 邊排版邊輸出
- 先排版後輸出。一般將排版結果存放在數組中,最後按數組輸出。
1.5 查找
1)查找所涉及的基本要素:查找空間、查找目標、查找方法。
2)按數組順序依次查找、二分查找。需要優化時間複雜度時,考慮二分查找。注意在代碼第8、9行,遞歸調用時,添加return
關鍵字。
3)c++中的字符串運算符已經優化的非常好了,==、>、<
可以直接使用。
int halfFind(int *a,int low,int high,int key){
if(low == high || high - low ==1){
if(a[low]==key) return low;
else if(a[high]==key)return high;
else return -1;
}else{
int mid = (low+high)/2,pos;
if(a[mid] > key) return halfFind(a,low,mid,key);
else if(a[mid] < key) return halfFind(a,mid,high,key);
else return mid;
}
}