解题方法之快速查找

一、哈希

hash key 的选取&冲突处理

数值
1. 直接取余法(一般选质数M为除数,如果m约数多,取模后分布不均)
2. 数字分析法(取数据值分布均匀的位数)
3. 平方取中法(即计算关键值的平方,结合数字分析法,取中间r位,形成一个大小为2^r的表)
4. 折叠法(将key分成m位一断,再按位相加得到新的key)

字符串
1. 折叠法所有字符ASCⅡ码相加

冲突处理
1. 拉链法
2. 开放定址法(线性探测法、二次探查发、哈希函数探查法)
PS:!!哈希函数探查法h1、h2两个哈希函数,(d+n*h2(key))%m,所选择h2(key)一定和m互质
三种探查过程终止于以下三种情况:
(1)若当前探查的单元为空,则表示查找失败(若是插入,则将key写入其中)
(2)若当前探查的单元中含有key,则查找成功(插入失败)
(3)若探查到table[d-1]时仍未发现空单元也未找到key,则无论是查找还是插入都失败(表满)

HDU1425 sort

很水的一道哈希,没什么技术含量,注意输入输出叭。

#include <stdio.h>
#include <math.h>
using namespace std;
bool a[1000000];
int main(){
    int n,m,x,i,j;
    while(scanf("%d%d",&n,&m)!=EOF){
        for(i = 0; i<n; i++)
            a[i] = 0;
        for(i = 0; i<n; i++){
            scanf("%d",&x);
            a[x+500000] = true;
        }
        j = 0;
        for(i = 1000000; j<m; i--){
            if(a[i]){
                printf("%d",i-500000);
                j++;
                if(j != m)
                    printf(" ");
                else
                    printf("\n");
            }
        }
    }


    return 0;
}

注意:

  1. 哈希函数映射到数组时,如果数组开的太小,就会使查找过程复杂度显著升高,可能导致超时。

  2. 一般哈希解决的问题朴素查找算法也能解决,只是哈希在合理设计的基础上节省了时间,做提前做好时间复杂度的分析,分析所使用算法的优选程度。

  3. 网上搜各大OJ哈希的题目,没有找到很合适的应用练习,有时间看看《高级数据结构》上的几个应用例子,总结一下再来做补充。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值