C++散列表二次探测

#include <iostream>
#include <malloc.h>
using namespace std;
enum KindOfStatus
{
    Empty=0,
    Avtive,
    Deleted,
};

template<typename Type>
class HashTable
{
    public:
    HashTable(int sz)
    {
        data = new Type[sz];
        ofs = new KindOfStatus[sz];
        for(int i=0;i<sz;i++)
        {
            ofs[i] = Empty;
        }
        //Space = sz;
        DefaultSize = sz;
    }
    void Insert(Type a[],int n)
    {
        for(int i=0;i<n;i++)
        {
            Insert(a[i]);
        }
    }
    private:
    void Insert(int val)
    {
        int index = Hash(val);
        int result = Find(index,val);
        if(data[result]==val)
            {
            cout<<"已经存在这个值了!!!"<<endl;
            return;
            }
        else
        {
        data[result]=val;
        ofs[result]=Avtive;
        }
    }
    int Find(int n,int val)
    {
        int index = n;
        if(ofs[index]==Empty || data[index]==val)return index;
        else
        {
            int k = 1;
            int i;
            int j;
            while(1)
                {
                     i = (index+k)%DefaultSize;
                     j = (index-k+DefaultSize)%DefaultSize;

                    if(ofs[i]==Empty || data[i]==val)return i;
                    if(ofs[j]==Empty || data[j]==val)return j;
                    if(2*k+1>=DefaultSize)
                        break;
                    k++;
                }
             if(2*k+1>=DefaultSize)//说明空间已经满了,在这里重新开辟一倍的空间.
                {
                    int savedata[DefaultSize];
              int saveofs[DefaultSize];
                    int i=0;
                    for(;i<DefaultSize;i++)
                    {
                        savedata[i]=data[i];
                    }
                    int save = DefaultSize;
                    DefaultSize=DefaultSize*2+1;
                    data = (Type *)realloc(data,DefaultSize);
                    for(i=0;i<DefaultSize;i++)
                    {
                        ofs[i]=Empty;
                    }
                    for(i=0;i<save;i++)
                    {
                        data[i]=savedata[i];
                        ofs[i]=Avtive;
                    }
                    Find(n,val);
                }
        }
    }
    public:
    void Show()
    {
        for(int i=0;i<DefaultSize;i++)
        {
            cout<<ofs[i]<<endl;
            cout<<data[i]<<endl;
            cout<<"-------------------"<<endl;
        }
    }
    int Hash(int val)
    {
        return val%DefaultSize;
    }
    private:
    int DefaultSize;//空间大小.
    Type *data;
    KindOfStatus *ofs;
};
int main()
{
      HashTable<int> ht(3);
      int a[]={1,4,7,10};
        ht.Insert(a,4);
        ht.Show();
    return 0;
}
时间: 2024-10-31 19:51:13

C++散列表二次探测的相关文章

C++散列表(二次探测)

#include <iostream> #include <malloc.h> using namespace std; enum KindOfStatus { Empty=0, Avtive, Deleted, }; template<typename Type> class HashTable { public: HashTable(int sz) { data = new Type[sz]; ofs = new KindOfStatus[sz]; for(int

哈希表(散列表)二次探测

#pragma once #include<iostream> #include<string> using namespace std; enum State { EMPTY, DELETE, EXIST, }; template<class K, class V> struct HashTableNode { K _key; V _value; }; template<class K> struct __HashFunc  //默认的返回哈希键值key的

哈希冲突的处理【闭散列方法-线性探测和二次探测】

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. 给定表M,存在函数Hash(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数Hash(key)为哈希(Hash) 函数. 构造哈希表的两种方法 1.直接定址法--取关键字的某个线性函数为散列地

查找算法总结(二)散列表

时间复杂度上,红黑树在平均情况下插入,查找以及删除上都达到了lgN的时间复杂度. 那么有没有查找效率更高的数据结构呢,答案就是本文接下来要介绍了散列表,也叫哈希表(Hash Table) 什么是哈希表 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值. 哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值.这是对于简单的键的情况,我们将其

数据结构(十二)散列表

定义 以下简称hahs 应用场景 适合查找与给定值相同的数据,不适合做范围查找,1对多映射查找 问题 冲突,散列表的理论依据是每个不同的关键字通过散列算法得到的结果都是唯一的,而现实中有可能出现几个结果相同的关键字. hash算法 构造一个散列算法考虑几个方面 直接定址法 按如下公式计算出关键字的hash值,当原始的key不重复,则得到的hash值就不会冲突 数字分析法 抽取关键字的一部分作为hash值 例如手机号,一般可以取后4位或者后4位的变形作为hash值,(公司内部场景) 平方取中法 折

DS哈希查找—二次探测再散列

题目描述 定义哈希函数为H(key) = key%11.输入表长(大于.等于11),输入关键字集合,用二次探测再散列构建哈希表,并查找给定关键字. 输入 测试次数t 每组测试数据格式如下: 哈希表长m.关键字个数n n个关键字 查找次数k k个待查关键字 输出 对每组测试数据,输出以下信息: 构造的哈希表信息,数组中没有关键字的位置输出NULL 对k个待查关键字,分别输出: 0或1(0—不成功,1—成功).比较次数.查找成功的位置(从1开始) 样例输入 1 12 10 22 19 21 8 9

哈希表/散列表

哈希表/散列表,是根据关键字(key)直接访问在内存存储位置的数据结构. 构造哈希表的常用方法: 直接地址法---取关键字的某个线性函数为散列地址,Hash(Key) = Key或Hash(key) = A*Key + B, A,B为常数. 除留余数法---取关键值被某个不大于散列表长m的数p除后的所得的余数为散列地址. Hash(key) = key % p. 若采用直接地址法(Hash(Key) = Key)存在一定的缺陷. 当Key值特别大时,而Key之前的数很少,就会造成空间浪费.大多时

散列表

散列表的基本思想通过键来直接计算出数据的存放地址,而避免了数组或者其他数据结构的逐个比较查找. 可以在常数时间内实现查找.插入和删除操作,代价是不支持任何有关排序的操作. 键到地址的映射,称作散列函数.散列函数需要满足两个要求:计算简单:冲突少. 不同的情况,可以有不同的散列函数,在此不对散列函数做过多介绍. 冲突:相同的键,通过散列函数,被映射到了相同的地址.下面主要介绍下解决冲突的一些简单方法. 分离链表法:把散列到同一个地址的数据保存在一个链表中.在查询数据时,先通过散列函数求出链表地址,

大话数据结构—散列表查找(哈希表)

一.基本概念 散列技术:在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key). f:散列函数/哈希函数: 采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表. 关键字对应的记录存储位置称为散列地址. 散列技术既是一种存储方法,也是一种查找方法. 散列技术适合求解问题是查找与给定值相等的记录.查找速度快. 散列技术不适合范围查找,不适合查找同样关键字的记录,不适合获取记录的排序,最值. 冲突:关键字key1不等于k