数据结构与算法-查找

29 阅读1分钟

知识导图

5301376ab929bb4434c02a5cf0e82fb1.jpg

一、顺序表的查找

sorted string table 带哨兵的顺序查找算法:约定“返回0表示未找到目标”

e5aab197908c9b4483e4db3138b6bed9_720.jpg

typedef struct{//顺序表结构体定义
    ElemType *R;//表基址(连续内存空间的起始地址)(R[0]作为哨兵,R[1]~R[length]存数据)
    int length;//表长(实际数据元素个数)
}SSTable;
int Search_Seq(SSTable ST,KeyTable key){
    ST.R[0]=key;//设置哨兵
    //ST.R[i] ≡ *(ST.R + i),指针可以通过下标语法访问,本质是 “指针 + 偏移量”
    //i--会使得当遍历到哨兵时相等跳出循环,i=0再自减1变为负数
    for(int i=ST.length;ST.R[i]!=key;--i);
    return i;//未找到则返回哨兵位置
}

image.png

二、折半查找(二分查找)

  • 背景:(1)顺序存储(2)有序存放

11396f9293a8bc96a83bc95901d30336_720.jpg

a351e534e046f0d7cb79c1d180707a49.jpg

  • 非递归算法

d03b3fee12c6f51e2e5bee7b4be9891f_720.jpg

  • 递归算法

9ef34cc0cfd43049d8e8569877b82b0a_720.jpg

三、二叉排序树

  • 链式存储
  • 左子树所有节点都比根节点小,右子树所有节点都比根节点大

1、算法

69b577f01eb0bb70057b13b033bf681d_720.jpg

2、插入

122cb19236befea8b04a0614cc9dafcb.jpg

3、构造

15d264efbaf48f465b89d7fa6c115074.jpg

931402f5aa1b5c3af4c03c98960ee228.jpg

4、删除

  1. 被删除的结点是叶子结点 将双亲结点中相应的指针域改为空

1b953c4d8999c7579ca03a41a6f34755_720.jpg 2. 被删除的结点只有左子树或右子树 将双亲结点的相应指针域的值指向被删除结点的左子树或右子树

aebda2702e9494d8aa5f3cb757fa1254_720.jpg 3.被删除的结点既有左子树又有右子树 以其左子树中的最大值结点(或右子树中的最小值结点)替代之,然后用上述两种其一的方法删除该结点

(1)前驱替代 (2)后继替代

练习

1ace8518f7b794d24767efe791046ae7.jpg

四、哈希表

通过一个函数马上算出地址

  • 线性探测:向后顺延找空余的空间

7fd6bb3b0afd65003e7edba4f4a7a832_720.jpg

  • 二次平方:1,-1,2^2,-2^2...
  • 链地址法

992833d70bfdd9178228fdc312940579_720.jpg