C++版基本算法4-哈希查找

//哈希查找算法
#include <iostream>
using namespace std;
typedef struct
{
int num;
char name[20];
}ElemType;//define  node
typedef struct
{
ElemType *elem;
int cout;
int sizeindex;
}HashTable;//define HashTable
int Hash(int num)
{
int p;
p=num%5;
return p;
}//define hash function


void InitHash(HashTable *H)//create HashTable
{
int i;
H->elem=(ElemType*)malloc(sizeof(ElemType));
H->cout=0;
H->sizeindex=24;
for(i=0;i<24;i++)
H->elem[i].num=0;//initialize 使searhash()函数能判断到底有没有元素在里面


}
int SearHash(HashTable H,int key,int *p)
{
int c=0;
*p=Hash(key);
while(H.elem[*p].num!=key&&H.elem[*p].num!=0)//通过二次探测再散列解决冲突
{
c=c+1;
if(c%2==1)
*p=*p+(c+1)*(c+1)/4;
else
*p=*p-(c*c)/4;
}
if(H.elem[*p].num==key)
return 1;
else
return 0;
}


void InsertHash(HashTable *H,ElemType e)
{
int p;
SearHash(*H,e.num,&p);
H->elem[p]=e;
++H->cout;
}
int main()
{
HashTable H;
int p,key,i;
ElemType e;
InitHash(&H);
for(i=0;i<3;i++)
{
     loop:cout<<"输入第"<<i+1<<"个学生的学号:"<<endl;
cin>>e.num;
if(!SearHash(H,e.num,&p))
{
cout<<"输入第"<<i+1<<"个学生的名字:"<<endl;
cin>>e.name;
InsertHash(&H,e);
}
else
{
cout<<"该学号已经存在!"<<endl;
goto loop;
}
}
cout<<"请输入你要查找的学号:"<<endl;
cin>>key;
if(SearHash(H,key,&p))
{
cout<<"查找成功!学生的姓名是:"<<H.elem[p].name<<endl;
cout<<"学生所在表中的位置是:"<<p<<endl;
}
else
cout<<"查找失败!你要查找的学生不存在!"<<endl;
return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中实现哈希查找算法通常涉及到以下几个步骤: 1. **定义哈希表(Hash Table)**:这是哈希查找的核心数据结构。C++没有内置的哈希表,但你可以自定义或使用第三方库如`unordered_map`,它是标准模板库STL的一部分,提供了高效的键值对存储。 ```cpp #include <unordered_map> using namespace std; class HashTable { public: // 使用哈希函数将键转换为数组索引 size_t hash_func(const string& key) const { return std::hash<string>{}(key); } // 其他方法如插入、查找和删除 private: unordered_map<string, value_type> data; }; ``` 2. **哈希函数**:你需要一个函数来将输入的数据均匀地映射到哈希表中的槽位。理想的哈希函数应尽可能减少冲突,即多个键被映射到同一个槽位的情况。 3. **处理冲突**:当两个或更多的键哈希到同一个位置时,你需要解决冲突。最常用的解决策略有开放地址法(线性探测、二次探测等)或链地址法(使用关联列表或红黑树等数据结构)。 4. **查找操作**:对于`find`这样的查询操作,首先计算键的哈希值,然后使用该哈希值访问对应的桶。如果桶里存在元素,则进一步比较键是否匹配。 5. **插入和删除**:同样,先哈希后定位,根据哈希结果进行插入或删除操作。如果用链地址法,只需遍历链表即可找到目标项。 ```cpp // 示例查找操作 bool search(const string& key) { size_t index = hash_func(key); if (data.count(index)) { if (data[index].first == key) { // 匹配成功 return true; } } return false; // 如果链表为空或者未找到,返回false } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值