`

散列表(哈希表)

J# 
阅读更多
散列表(hash table):是表示集合和字典的另一种有效方法,它提供了一种完全不同的存储和搜索方式,通过将关键码映射到表中某个位置上来存储元素,然后根据关键码用同样的方式直接访问。
需要注意两点:
1.散列函数的定义域必须包括需要存储的全部关键码,而如果散列表允许有m个地址时,其值域必须在0到m-1之间。
2.散列函数计算出来的地址应能均匀分布在整个地址空间中。
散列函数中用的最多的是除留余数法,m个地址,取一个不大于m但最接近m的素数p作为除数,
hash(key)=key%p,素数p不是接近2的幂
#ifndef HASHTABLE_H
#define HASHTABLE_H

const int DefaultSize=100;
enum KindOfStatus{
    Active,//有元素
    Empty,
    Deleted
};

template<typename E,typename K>
class HashTable{
public:
    HashTable(const int d,int sz=DefaultSize);
    ~HashTable(){
        delete []ht;
        delete []info;
    }
    HashTable<E,K>& operator=(const HashTable<E,K>& ht2);
    bool Search(const K k1,E& e1)const;
    bool Insert(const E& e1);
    bool Remove(const K k1,E& e1);
    void makeEmpty();
private:
    int divitor;//散列函数的除数
    int CurrentSize,TableSize;
    E *ht;//散列函数的存储数组
    KindOfStatus *info;
    int FindPos(const K k1)const;
    int operator==(E& e1){
        return *this==e1;
    }
    int operator!=(E& e1){
        return *this!=e1;
    }
};

template<typename E,typename K>
HashTable<E,K>::HashTable(int d,int s){
    divitor = d;
    TableSize = sz;
    CurrentSzie = 0;
    ht = new E[TableSize];
    info = new KindOfStatus[TableSize];
    for(int i=0;i<TableSize;i++)
        info[i]=Empty;
}

template<typename E,typename K>
int HashTable<E,K>::FindPos(const K k1) const
{
    int i = k1%divitor;
    int j = i;
    do{
        if(info[j]==Empty||info[j]==Active&&ht[j]==k1){
            return j;
        }else{
            j++;
        }
    }while(j!=i);
    return j;//表满
}

template<typename E,typename K>
bool HashTable<E,K>::Search(const K k1, E &e1) const
{
    int i = FindPos(k1);
    if(info[i]!=Active||ht[i]!=k1)
        return false;
    e1 = ht[i];
    return true;
}

template<typename E,typename K>
void HashTable<E,K>::makeEmpty()
{
    for(int i=0;i<TableSize;++i)
        info[i]=Empty;
    CurrentSize=0;
}

template<typename E,typename K>
HashTable<E,K>& HashTable<E,K>::operator=(const HashTable<E,K>& ht2)
{
    if(this!=&ht2){
        delete []ht;
        delete []info;
        TableSize = ht2.TableSize;
        ht = new E[TableSize];
        info = new KindOfStatus[TableSize];
        for(int i=0;i<TableSize;i++){sz
            ht[i] = ht2.ht[i];
            info[i] = ht2.info[i];
        }
        CurrentSize = ht2.CurrentSize;
    }
    return *this;
}

template<typename E,typename K>
bool HashTable<E,K>::Insert(const E &e1)
{
    K k1 = e1;
    int i = FindPos(k1);
    if(info[i]!=Active){
        ht[i] = e1;
        info[i] = Active;
        CurrentSize++;
        return true;
    }
    if(info[i]==Active&&ht[i]==e1){
        cout << "已存在些元素不能插入" << endl;
        return false;
    }
    cout << "表已满,不能插入" << endl;
    return false;
}

template<typename E,typename K>
bool HashTable<E,K>::Remove(const K k1, E &e1)
{
    int i = FindPos(k1);
    if(info[i]==Active&&ht[i]==e1){
        info[i]=Deleted;
        CurrentSize--;
        return true;
    }
    return false;
}

#endif // HASHTABLE_H

分享到:
评论

相关推荐

    c语言或c++课程设计之散列表哈希表

    在C语言或C++中,掌握散列表哈希表的设计是提升编程能力的重要环节。本篇文章将深入探讨散列表哈希表的基本概念、工作原理以及如何使用C或C++实现。 一、散列表哈希表基础 1. 哈希函数:哈希函数是散列表的核心,...

    散列表 (哈希表,线性探测再散列)

    ### 散列表(哈希表,线性探测再散列) #### 1. 散列表概念 散列表,又称哈希表,是一种基于数组结构的数据结构。它通过哈希函数将一组关键字映射到一个有限的连续地址集(即数组索引范围),并将这些关键字作为...

    数据结构报告——散列表、哈希表.docx

    散列表与哈希表的设计报告 散列表是一种常用的数据结构,用于存储和查找数据。散列表的设计包括散列函数的构造、冲突的处理、哈希表的建立、查找和显示等几个方面。在本报告中,我们将详细介绍散列表的设计思想和...

    哈希表(散列表)原理详解 - CSDN博客1

    哈希表,又称散列表,是一种高效的数据存储和查找结构,其主要原理是通过散列函数将关键码值(Key value)映射到一个固定大小的数组中的特定位置,从而实现快速访问。这个映射过程使得我们可以直接根据键(Key)来...

    散列表(哈希表).

    ### 散列表(哈希表)深度解析 #### 基础定义与核心价值 散列表,又称为哈希表,是一种高效的数据结构,其设计初衷在于通过关键码值(Key value)直接访问数据,从而极大提升数据检索速度。哈希表的核心在于“散列...

    哈希表相关操作实现

    哈希表,也被称为散列表,是计算机科学中一种非常重要的数据结构,它提供了一种高效的数据存储和检索方法。哈希表通过将键(Key)映射到一个索引位置来实现快速访问,这个索引位置是通过哈希函数计算得出的。哈希...

    哈希表(散列表)和哈希查找

    哈希表,也称为散列表,是一种数据结构,它通过使用哈希函数将关键字映射到存储地址,从而实现高效的数据查找。哈希函数是关键所在,它将输入的关键字转换为存储位置,通常表示为 d = H(key)。哈希表本身是一个数组...

    哈希表的设计与实现 实现电话号码查询(用word 2007打开)

    哈希表的设计与实现。设计哈希表实现电话号码查询系统。基本要求:(1)设每个记录有一列数据项:电话号码、用户名、地址(2)从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;(3)采用再哈希法解决...

    哈希表应用 设计哈希表实现图书查找系统,完成相应的建表和查表程序。c语言课设

    从键盘输入各图书相关信息,分别以图书编号为关键字建立散列表。待填入哈希表的书号至少30个;构造合适的哈希函数。 (1)记录由外部输入。 (2)生成的哈希表结果以图形示意形式输出。 (3)分别采用线性法、随机法...

    哈希表的设计与实现哈希表的设计与实现

    哈希表是一种高效的数据结构,它通过特定的哈希函数将键(key)映射到一个固定大小的数组中,以此实现快速的插入、查找和删除操作。在本设计中,哈希表被用于存储和查询电话通讯信息,包括电话号码、用户名和地址等...

    哈希表设计 哈希表的具体实现代码

    哈希表,也被称为散列表,是数据结构中一种高效的数据存储方式,它通过特定的哈希函数将关键字映射到一个固定大小的数组中,从而实现快速的查找、插入和删除操作。在计算机科学中,哈希表的性能优势在于它的平均时间...

    c语言的哈希表的设计与实现

    哈希表是一种高效的数据结构,它通过特定的算法——哈希函数,将任意大小的键(key)映射到一个固定大小的数组索引上,从而实现快速的查找、插入和删除操作。在C语言中,哈希表的实现通常需要自定义数据结构和哈希...

    哈希表(散列表)

    这个PPT讲了哈希表的基本原理和应用,还有字符串匹配的应用。

    数据结构哈希表

    哈希表是一种高效的数据结构,它通过特定的哈希函数将键(Key)映射到一个固定大小的数组中,以此实现快速的查找、插入和删除操作。在数据结构领域,哈希表是解决查找问题的重要工具,尤其适用于大数据量且需要频繁...

    哈希表词频统计

    用哈希表对较大文件的单词进行排序 结果输出到一个txt文件里 出现次数不一样按出现次数排序 出现次数一样按字典顺序排序

    哈希表哈希表哈希表.zip

    哈希表,也被称为散列表,是计算机科学中一种高效的数据结构,用于存储和检索数据。它通过将关键字(key)映射到一个特定的位置来实现快速访问,这个位置称为哈希码或哈希值。哈希表的核心原理是利用哈希函数将...

    数据结构 哈希表 哈希算法

    哈希表,也被称为散列表,是数据结构中一种高效的数据存储和检索工具。它通过哈希函数将数据的关键字映射到一个固定大小的数组中,使得在平均情况下,查找、插入和删除操作的时间复杂度可以达到O(1)。这种高效的性能...

    哈希表-浙大数据结构课件

    哈希表,又称为散列表,是数据结构中一种高效的数据存储方式,它通过特定的哈希函数将关键字(key)映射到一个固定大小的数组(也称为哈希表或槽位)中,以此实现快速查找、插入和删除操作。在浙大的这组经典数据...

    哈希表课程设计

    设计散列表实现手机号码查找系统,对手机号码进行Hash。 [基本要求] (1) 设每个记录有下列数据项:手机号码、姓名、性别、E-mail地址。 (2) 从文件读入各记录,以手机号码为关键字建立散列表(长度为43)。...

Global site tag (gtag.js) - Google Analytics