哈希表

哈希表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。

  对哈希表的使用者一一人来说,这是一瞬间的事。哈希表运算得非常快,在计算机程序中,如果需要在一秒种内查找上千条记录通常使用哈希表(例如拼写检查器)哈希表的速度明显比树快,树的操作通常需要O(N)的时间级。哈希表不仅速度快,编程实现也相对容易。

哈希表也有一些缺点它是基于数组的,数组创建后难于扩展某些哈希表被基本填满时,性能下降得非常严重,所以程序虽必须要清楚表中将要存储多少数据(或者准备好定期地把数据转移到更大的哈希表中,这是个费时的过程)。

如果不需要有序遍历数据,井且可以提前预测数据量的大小。那么哈希表在速度和易用性方面是无与伦比的。

散列表查找算法(Hash)

这个例子:构造用余数法,解决冲突用线性探测再哈希

#include <stdio.h>    
    #include <stdlib.h>   
    #define OK 1
    #define ERROR 0
    #define TRUE 1
    #define FALSE 0
    #define SUCCESS 1
    #define UNSUCCESS 0
    #define HASHSIZE 7                  
    #define NULLKEY -32768 

    typedef struct
    {
        int *elem;                      //基址
        int count;                      //当前数据元素个数 
    }HashTable;

    int m=0; // 散列表表长

    /*初始化*/
    int Init(HashTable *hashTable)
    {
        int i;
        m=HASHSIZE;
        hashTable->elem = (int *)malloc(m * sizeof(int)); //申请内存
        hashTable->count=m;
        for (i=0;i<m;i++)
        {
            hashTable->elem[i]=NULLKEY;
        }
        return OK;
    }

    /*哈希函数(除留余数法)*/
    int Hash(int data)
    {
        return data % m;
    }

    /*插入*/
    void Insert(HashTable *hashTable,int data)
    {
        int hashAddress = Hash(data); //求哈希地址

        //发生冲突
        while(hashTable->elem[hashAddress]!=NULLKEY)
        {
            //利用开放定址的线性探测法解决冲突
            hashAddress=(++hashAddress)%m;
        }

        //插入值
        hashTable->elem[hashAddress]=data;
    }




    /*查找*/
    int Search(HashTable *hashTable,int data)
    {
        int hashAddress=Hash(data); //求哈希地址

        //发生冲突
        while(hashTable->elem[hashAddress]!=data)
        {
            //利用开放定址的线性探测法解决冲突
            hashAddress=(++hashAddress)%m;

            if (hashTable->elem[hashAddress]==NULLKEY||hashAddress==Hash(data))
            {
                    return -1;
            }
        }

        //查找成功
        return hashAddress;
    }


    //删除
    void Delete(HashTable *hashTable,int data)
    {
        int add = Search(hashTable,data);

        hashTable->elem[add] = NULLKEY;
    }



    /*打印结果*/
    void Display(HashTable *hashTable)
    {
        int i;
        printf("\n//==============================//\n");

        for (i=0;i<hashTable->count;i++)
        {
            printf("%d ",hashTable->elem[i]);
        }

        printf("\n//==============================//\n");
    }

    int main()
    {
        int i,j,result;
        HashTable hashTable;
        int arr[HASHSIZE]={13,29,27,28,30,38};

        printf("***************Hash哈希算法***************\n");

        //初始化哈希表
        Init(&hashTable);

        //插入数据
        for (i=0;i<HASHSIZE;i++)
        {
            Insert(&hashTable,arr[i]);
        }
        Display(&hashTable);


        Delete(&hashTable,27);
         Display(&hashTable);



        //查找数据
        result= Search(&hashTable,28);
        if (result==-1) 
                printf("对不起,没有找到!\n");
        else 
                printf("29在哈希表中的位置是:%d\n",result);
        system("pause");
        return 0;
    }

其他解决冲突的如链地址法,也是现在最常用的,如STL的Hash和Redis里面的字典

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值