数据结构总结

第一天(数据三要素&大O记法)
第二天 (线性表【顺序存储&链式存储】)
第三天 (栈&队列)
第四天 (树#二叉树)
第五天 (查找&排序)
小项目 简易通讯录

哈希查找

  1. 哈希(hash) 查找
    应用:海量数据查找
    概念
    要查找key=k的记录时,通过关系f就可得到相应记录的地址。这个关系f就是所谓的Hash函数(或称散列函数、杂凑函数),记为H(key)。
    它实际上是一个地址映象函数,其自变量为记录的key,函数值为记录的存储地址(或称Hash地址)。
    不同的key可能得到同一个Hash地址,即当keyl≠key2时,可能有H(key1)=H(key2),此时称key1和key2为同义词。
    这种现象称为“冲突”或“碰撞”,因为一个数据单位只可存放一条记录。
    一般,选取Hash函数只能做到使冲突尽可能少,却不能完全避免
  • 1.1 流程:
    (1). 哈希公式
    (2). 根据哈希公式创建哈希表
    (3). 将数据存入哈希表
    (4). 用户输入数据 程序负责根据哈希公式将数据进行处理 找到数据

  • 3.2 最重要的两点
    a. 如何构建哈希函数。
    b. 如何解决冲突。

  • 3.2.1 构建哈希函数的方法:
    直接地址法
    数学分析法
    平方取中法
    叠加法
    保留余数法
    随机数法

  • 3.2.2 解决冲突的办法:
    开放地址法
    线性探查法
    链地址法
    备用表法

  • 保留余数法+备用表法
#include<stdio.h>

        #define N 5

        int j=0;		//备用表下标

        //哈希函数
        int hashFun(int data)
        {
            return (data%5);
        }
        //存入数据
        void saveHashMessage(int *phash,int *pbak,int data)
        {
            int index = hashFun(data);	//哈希处理
            if(phash[index]==0)			//说明哈希表index对应的位置上没有数据
            {
                phash[index] = data;	//将数据存入哈希表
            }
            else 
            {
                pbak[j] = data;			//将数据存入备用表
                j++;
            }
        }
        //查找数据
        void findHashData(int *phash,int *pbak,int findData)
        {
            int i;
            int index = hashFun(findData);	//将数据哈希处理
            if(phash[index]==findData)	    //去哈希表中找
            {
                puts("找到了");
                return;//结束函数
            }

            //去备用表找
            for(i=0;i<j;i++)
            {
                if(pbak[i]==findData)
                {
                    puts("找到了");
                    
                    return;//结束函数
                }
            }
            puts("真没有!");
        }
        int main()
        {
            int hash[5]={0};//哈希表
            int bak[13]={0};//备用表 
            int data;
            int i;

            int findData;//记录要查询的数据

            for(i=0;i<N;i++)
            {
                puts("请输入数据:");
                scanf("%d",&data);
                saveHashMessage(hash,bak,data);
            }


            puts("请输入要查询的数据:");
            scanf("%d",&findData);
            findHashData(hash,bak,findData);

            return 0;

        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值