散列表(HashTable)

原创 2015年11月17日 17:11:37

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位。
散列表通过将数据的关键值经过散列函数处理得到值即为散列表中对应的散列数组下标。
为了使用除法散列函数,在计算f(k)之前,需要把关键字转换为非负整数。C++的STL中的模板类hash<T>是实现散列的专业版。

template <class K> class hash;

template<>
class hash<string>
{
   public:
      size_t operator()(const string theKey) const
      {// Convert theKey to a nonnegative integer.
         unsigned long hashValue = 0; 
         int length = (int) theKey.length();
         for (int i = 0; i < length; i++)
            hashValue = 5 * hashValue + theKey.at(i);

         return size_t(hashValue);
      }
};

template<>
class hash<int>
{
   public:
      size_t operator()(const int theKey) const
      {return size_t(theKey);}
};

template<>
class hash<long>
{
   public:
      size_t operator()(const long theKey) const
      {return size_t(theKey);}
};

散列表的线性表示方法。用数组table[]表示,类型为pair<const K,E>*

#include "hash.h" //将数据的关键字映射为非负整数
template<class K, class E>
class hashTable
{
public:
    hashTable(int theDivisor=11){
        divisor=theDivisor;
        size=0;
        table=new pair<const K,E>*[divisor];
        for(int i=0;i<divisor;i++)
        {
            table[i]=NULL;//每个指针都要初始化为NULL
        }
    ~hashTable(){
        delete [] table;
    }
    //如果找到了关键字是k的hash表数组的项则返回位置,如果没有找到就返回可以插入的位置。
    //如果找了一圈最后又回到散列函数计算的下标位置,表示散列表已满,返回该下标位置
    int search(const K& k) const
    {
        int i=hash(k)%divisor;
        int j=i;
        do{
            if(table[j]==NULL||table[j]->first==k)
                return j;
            j=(j+1)%divisor;
        }while(j!=i)
        return j;
    }
    pair<const K, E>* find(const K& k) const{
        int i=search(k);
        if(table[i]->first==k)
         return table[i];
         return NULL;
    }
    void insert(const pair<const K, E>& thepair){
        int i=search(thepair.first);
        if(table[i]==NULL) //散列表有空位置可以插入
            table[i]=new pair<K,E>(thepair);
        else{
            if(table[i]->first==thepair.first)//散列表存在关键字为thepair的关键字的项
                table[i]->second=thepair.second;
            else throw ... //散列表已满
        }
    }
private:
hash<K> hash;   //映射类型k到非负整数
pair<const K,E>** table;
int size;
int divisor;//散列函数的除数
}

使用链表来实现散列表。散列表table[]的每一项是一个指向字典链表的指针,这样每一个桶可以存放不止一项数据。因此table[]的类型是sortedNode<K,E>。如图
这里写图片描述

class hashchain:public dictionary{
    public:
        hashchain(int theDivisor=10){
            divisor=theDivisor;
            table=new sortedNode<K,E>[divisor];
            size=0;
        }
        ~hashtable(){
            delete [] table;
        }
        int search(const K& k) const
        {
            int i=hash(k)%divisor;

        }
    pair<const K, E>* find(const K& k) const{
        int i=hash(k)%divisor;
        return table[i].find(k);
    }
    void insert(const pair<const K, E>& thepair){
        int i=hash(thepair.first)%divisor;
        int chainsize=table[i].size();
        table[i].insert(thepair);
        //表示链表中之前没有关键字等于thepair的关键字的节点,插入了新的节点,此时所有节
        //点的总数增加1
        if(chainsize<table[i].size)
            size++;
    }
    private:
        hash<K> hash;
        sortedNode<K,E>* table;
        int size;
        int divisor;
}

Huffman编码实现压缩解压缩

Huffman编码实现压缩解压缩 什么是Huffman压缩 Huffman( 哈夫曼 ) 算法在上世纪五十年代初提出来了,它是一种无损压缩方法,在压缩过程中不会丢失信息熵,而且可以证明 Huffm...

大话数据结构 code 第八章 05散列表_HashTable

大话数据结构 第八章 05散列表_HashTable

HashTable【哈希表/散列表】

前序:一、关于查找,其实说白了,查找的本质就是已知对象查找位置;那么在已知了对象以后都有什么办法去快速查找对象的位置;(1)【无序查找】在前面的学习中,我们看到如果这些对象是无序的装在一个容器中(数组...

散列表(HashTable)探秘 --下

【澈丹,我想要个钻戒。】【小北,等等吧,等我再修行两年,你把我烧了,舍利子比钻戒值钱。】                                 ——自扯自蛋   无论开发一个程序还是...

HashTable哈希表/散列表(线性探测和二次探测)

HashTable的简单介绍HashTable是根据关键字直接访问在内存存储的数据结构。 HashTable叫哈希表或者散列表。 它通过一个关键值的函数将所需的数据直接映射到表中的位置来访问数据,...

Hashtable类 散列表的基本原理和用法

Hashtable类 散列表(Hashtable)又叫做字典(Dictionary),能够非常快速的添加、删除和查找元素,是现在检索速度最快的数据结构。   原文链接:http:/...

为什么要用散列表(哈希表,hashtable)

Hash表不是直接直接把关键字作为数组下标,而是根据关键字计算出下标。-------算法导论        数组是一种支持直接访问的数据结构,使用确定的位置来存储和检索数据,十分高效。对数组操作时,...
  • ozdazm
  • ozdazm
  • 2013年01月28日 14:23
  • 3548

STL关联式容器之散列表——hashtable

以散列表为基础的关联式容器深受人们的喜欢,虽然它们目前还不是STL的标准,但是SGI的STL已经包含了这些内容。 前面学习的关联式容器都是基于红黑树这样一种二叉搜索树,也正因为这样,如果要求搜索时间具...

数据结构与算法分析之哈希表(HashTable,又称散列表)--代码篇

本篇文章是继上一篇对于哈希表理论的介绍,进行一个代码上的书写工整,可以加深对哈希表的理解,本段代码主要分为以下几个部分: 1、哈希表的结构 2、哈希表的建立 3、哈希函数 4、哈希表插入元素 ...

STL源码剖析——散列表hashtable

与前面介绍的底层机制基于红黑树RB-Tree容器不同,本文介绍的是哈希表hash table,在SGI STL中,给出了底层机制基于哈希表的相关容器的介绍,这里介绍hash table的源码剖析,有利...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:散列表(HashTable)
举报原因:
原因补充:

(最多只允许输入30个字)