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;
}
}