[数据结构] 查找

顺序查找

一个接着一个找,最简单的遍历,以顺序表或线性链表表示静态查找表,假设数组0号单元留空。算法如下:

int SqlSearch1(int r[], int n, int k)
{
    i = n;
    while(i > 0 && r[i] != k)
    {
        i--;
    }
    return i
}

此算法每次循环都要判断数组下标是否越界,改进方法:加入哨兵,将目标值赋给数组下标为0的元素,并从后向前查找。改进后算法如下:

int SqlSearch2(int r[], int n, int k)
{
    r[0] = k;
    i = n;
    while(r[i] != k)
    {
        i--;
    }
    return i
}

顺序查找特点

  • 优点:对表中记录没有任何要求,顺序存储和链式存储都可以;对表中记录有序性没有要求
  • 缺点:平均查找长度较大,特别时表长较长时,效率很低。

折半查找

使用条件

  1. 必须采用顺序存储结构
  2. 线性表中的记录必须有序

基本思想

在有序表中,取中间的记录作为比较对象,若给定的值和中间的值相等,则查找成功;若给定的值小于中间的值,则在中间记录的左边继续找;否则在右边继续找。重复上面的过程。

代码实现

int BinSearch1(int r[], int n, int k)
{
// 假设查找集合从1开始
    low = 1;
    high = n;
    while(low <= high)
    {
        mid = (low + high) / 2;
        if(k < r[mid])
        {
            high = mid - 1;
        }
        else if(k > r[mid])
        {
            low = mid + 1;
        }
        else
            return mid;
    }
    return 0;
}
int BinSearch2(int r[], int low, int high, int k)
{
// 假设查找集合从1开始
    if(low > high)
        return 0;
    else
    {
        mid = (low + high) / 2;
        if(k < r[mid])
        {
            return BinSearch2(r,low,mid-1,k);
        }
        else if(k > r[mid])
        {
            return BinSearch2(r,mid+1,high,k);
        }
        else
            return mid;
    }
}

折半查找判定书

折半查找的过程可以用BST来描述,树中每个结点对应有序表中的一个记录。通常将这棵树叫做折半查找判定书。

例子:1-10共十个数,进行折半查找。

第一层:(1-10)中间数5

第二层:(1-4)中间数2;(6-10)中间数8

第三层:1,3,6,9

第四层:4,7,10

查找成功和失败分析

二叉排序树的查找

详见https://blog.csdn.net/tsfx051435adsl/article/details/100155133

https://blog.csdn.net/tsfx051435adsl/article/details/100154504

 

散列表(哈希表)查找

散列的基本思想:在记录的存储地址和它的关键吗之间建立一个函数关系。这样不经过比较,一次读取就能得到所查找的元素。

这里的H就是哈希函数(也叫散列函数)。

所以散列技术关键问题有:

  • 散列函数的设计。怎么找到一个简单、均匀、存储利用率高的函数。
  • 冲突的处理。如果key1和key2经过散列函数算出来的存储地址相等了,那么就冲突了,冲突该怎么办。

几个简单的散列函数

冲突的解决方案

线性探测法

二次探测法

拉链法(链地址法)HashMap用到了

几种不同处理冲突方法的性能分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值