哈希之闭散列-线性算法和二次探查法

这篇博客深入探讨了哈希表中处理冲突的闭散列方法,主要关注线性探测再散列和二次探测再散列策略。通过实例分析了这两种方法的实现细节和优缺点,旨在帮助读者理解如何有效地管理哈希表的存储效率。
摘要由CSDN通过智能技术生成

头文件

  • Hash.h
#pragma once
#ifndef HASH_H_
#define HASH_H_

#define size_t unsigned long  

typedef enum { EM, EXIST, DEL } State;

typedef int  Value;
//typedef char*  Value;

typedef struct _DataType
{
    size_t Key;
    Value value;
}DataType;

typedef int(*PHF)(DataType* data);

typedef struct _Elem
{
    DataType _data;
    State _state;
}Elem;

typedef struct HashTable
{
    Elem *_Tf;
    size_t _size;
    size_t _capacity;
    PHF _pSetKey;
    int  LoadFactor;
}*PHash,Hash;




int HashFun(size_t Key, PHash hash);//线性探测
int HashFun2(size_t Key, PHash hash,int i);//二次探测

//线性探测
void InitHash(PHash hash, int capacity, PHF);
int InsertHash(PHash hash, Value value);
int FindHash(PHash hash, Value value);
int RemoveHash(PHash hash, Value value);
void DestoryHash(PHash hash);
size_t  Size(Hash hash);
size_t  Capacity(Hash hash);
int  EmptyHash(Hash hash);
int  IsFull(Hash hash);
void DynamicCapacity(PHash hash);
void Swap(PHash pLeft, PHash pRight);

//二次探测
int InsertHash_2(PHash hash, Value value);
int FindHash_2(PHash hash, Value value);
int RemoveHash_2(PHash hash, Value value);



#endif //!HASH_H_
  • common.h
#pragma once

#include"Hash.h"

#ifndef _COMMON_H_
#define _COMMON_H_

#define _PrimeSize  31
#define size_t unsigned long

static const unsigned long _PrimeList[_PrimeSize] =
{
    11ul,13ul,29ul,53ul, 97ul, 193ul, 389ul, 769ul,
    1543ul, 3079ul, 6151ul, 12289ul, 24593ul,
    49157ul, 98317ul, 196613ul, 393241ul, 786433ul,
    1572869ul, 3145739ul, 6291469ul, 12582917ul, 25165843ul,
    50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul,
    1610612741ul, 3221225473ul, 4294967291ul
};


unsigned long GetPrimeNumber(int Capacity);
static size_t BKDRHash(const char * str);

void IntToInt(DataType* data);
void CharToInt(DataType* data);



#endif // !_COMMON_H_

源文件

  • common.c
#include"common.h"

size_t GetPrimeNumber(int Capacity)//得到最接近的质数
{
    for (int i = 0; i < _PrimeSize; i++)
    {
        if (_PrimeList[i] > Capacity)
            return _PrimeList[i];
    }
    return _PrimeList[_PrimeSize];
}

static size_t BKDRHash(const char * str)//字符串哈希算法
{
    unsigned int seed = 131; // 31 131 1313 13131 131313</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值