前置知识
本期内容
名词解释
实现
- 没有监视哨
- 如果每个位置查询概率一样都是n\1,查找第i个元素时复杂度是(n-i+1),对它进行求和后再乘以概念n\1,结果是2(n+i),时间复杂度是0(n)
- 缺点是需要对i是否超过表长度进行判断
i<n
。
//length是顺序表长度,key是要找的关键字
int SeqSearch(int a[],int iLength,int iKey)
{
int i=0;
while(i<iLength&&a[i].key!=iKey)i++; //可以改成for,见参考1
if(i<iLength>) return i;
else return -1;
}
- 有监视哨
- 只是提高运算速度,但算法的比较次数没有改变,仍然是O(n)。
- 监视哨的作用,因为追加一个iKey到末尾的话,查找数据里肯定有一个iKey,就不需要判断
i<n
了。
int SeqSearch(int a[],int iLength,int iKey)
{
int i=0;
a[iLength]=iKey; //把监视哨放在末尾,同时a的空间长度要大于iLength
while(a[i].key!=iKey)i++;
if(i<iLength>) return i;
else return -1;
}
总体评价
- 算法复杂度太高,不管是查找成功还是失败,都要O(n),数据表越长时,缺点会致命。
- 适用场景比较多
代码学习
- chazhao.c 本地电脑里有
- chazhao1.c 本地电脑里有,但代码中直接在
main()
里数据源的最后一个追加了key
参考文献
履历
- 20180312第一版写完,也基本理解这个算法了。