关联课程:中国大学MOOC-数据结构-浙江大学
- 分析二分法:
查找算法中的“二分法”是这样定义的:
给定N个从小到大排好序的整数序列List[],以及某待查找整数X,我们的目标是找到X在List中的下标。即若有List[i]=X,则返回i;否则返回-1表示没有找到。
二分法是先找到序列的中点List[M],与X进行比较,若相等则返回中点下标;否则,若List[M]>X,则在左边的子系列中查找X;若List[M]<X,则在右边的子系列中查找X。
试写出算法的伪码描述,并分析最坏、最好情况下的时间、空间复杂度。
- 二分法伪码描述:
public class Demo1 {
public Integer FindSubscript(List<Integer> list, Integer X){
/*从N个从小到大排好序的整数序列List[]中查找整数X,如果X存在就返回X所在的下标i,如果X不存在则返回-1*/
Integer M = list.size() / 2;
boolean contains = list.contains(X);
if (contains == true){//判断该集合中是否包含X
while ( X != list.get(M)){
/*进行条件判断,如果X小于list.get(M)则 M = M/2*/
/*进行条件判断,如果X大于list.get(M)则 M = (list.size()-M)/2+M*/
}
return list.get(M);
}else {
return -1;
}
}
}
(用Java只能写成这样了)
- 最好的情况下
X正好是中位数
时间复杂度:只用查找一次 T(n)=C
空间复杂度:只用创建一次对象
- 最坏的情况下
X是最大值或者最小值
时间复杂度:需要查找log2(list.size())次 T(n)=C*log2(n)
空间复杂度:只用创建一次对象