算法介绍:
哈希算法应该不算是算法,而算是一种数据结构的应用。
向将数据放入哈希表中,然后再进行查找。

成员函数介绍:
NewHashTable(int destSize)
构造一个destSize大小的数组m_pData,同时将其元素值都设置为INT_MAX,表示该位置未被使用。
bool NeedRehash()
判断负载因子,如果负载因子为1,就需要进行ReHash。
void Insert(int newData)
插入一个新元素newData,当需要进行rehash时,为了实现方便,直接抛出异常。
int Find(int destData)
查找元素destData,如果未找到,返回-1。找到返回下标。

注意点:
hash函数使用的是除留余数法
冲突解决使用的是直接定址法,增量的取法为线性探测法

代码实现:
头文件NewHashTable.h

class NewHashTable
{public:NewHashTable(int destSize);~NewHashTable();bool NeedRehash();void Insert(int newData);int Find(int destData);private:int m_size; // 总大小int m_use; // 已使用大小int* m_pData;
};

实现文件NewHashTable.cpp

NewHashTable::NewHashTable(int destSize): m_size(destSize), m_use(0), m_pData(new int[m_size])
{for (int idx = 0; idx < m_size; ++idx) m_pData[idx] = -INT_MIN;
}NewHashTable::~NewHashTable()
{delete [] m_pData;
}void NewHashTable::Insert(int newData)
{if (NeedRehash()){throw "Need Rehash";}// hash函数的实现方式为除留余数法int hashIdx = newData % m_size;// hash位置就是空位if (m_pData[hashIdx] == INT_MIN) {m_pData[hashIdx] = newData;++m_use;return;}// hash冲突,使用开放定址法,增量的增长方式为线性探测法for (int idx = 1; idx < m_size; ++idx) {hashIdx = (newData + idx) % m_size;if (m_pData[hashIdx] == INT_MIN) break;}m_pData[hashIdx] = newData;++m_use;
}int NewHashTable::Find(int destData)
{int hashIdx = destData % m_size;if (m_pData[hashIdx] == INT_MIN) return -1;if (m_pData[hashIdx] == destData) return hashIdx;for (int idx = 1; idx < m_size; ++idx){hashIdx = (destData + idx) % m_size;if (m_pData[hashIdx] == INT_MIN) return -1;if (m_pData[hashIdx] == destData) return hashIdx;}return -1;
}bool NewHashTable::NeedRehash()
{return m_use >= m_size;
}

测试代码:

#include <iostream>
#include "NewHashTable.h"int main()
{NewHashTable hashTable(5);while (true){std::cout << "请输入操作(INSERT FIND RPINT):" << std::endl;std::string choice;std::cin >> choice;if ("INSERT" == choice){if (hashTable.NeedRehash()){std::cout << "没有剩余空间,请先Rehash" << std::endl;}else{std::cout << "请输入数据:";int newData;std::cin >> newData;hashTable.Insert(newData);}}else if ("FIND" == choice){std::cout << "请输入待查数据:";int newData;std::cin >> newData;std::cout << "DestIdx = " << hashTable.Find(newData) << std::endl;}else if ("PRINT" == choice){hashTable.Print();}else;}return 0;
}

查找算法之六 哈希查找(C++版本)相关推荐

  1. 【查找算法】哈希查找法

    本篇文章将介绍一种新的查找算法--哈希查找. 文章目录 何为哈希查找? 散列表 冲突 构造散列函数 直接定址法 除留余数法 解决冲突的方式 开放地址法 链地址法 查找效率分析 何为哈希查找? 先看定义 ...

  2. 查找算法系列之复杂算法:哈希查找

    查找算法系列之复杂算法:哈希查找 眼下为止已经介绍了顺序查找.二分查找.分块查找.二叉排序树.见作者之前的文章: http://blog.csdn.net/u010025211/article/det ...

  3. Hash函数与算法、哈希查找、哈希冲突解决方法总结

    Hash哈希知识点导航 1.基本概念 2. 哈希函数   2.1 直接寻址法   2.2 数字分析法   2.3 平方取中法   2.4 折叠法   2.5 随机数法   2.6 除留余数法 3. 哈 ...

  4. 查找算法【哈希表】 - 处理冲突的方法:开放地址法-线性探测法

    查找算法[哈希表] - 处理冲突的方法 无论如何设计散列函数,都无法避免发生冲突. 如果发生冲突,就需要处理冲突. 处理冲突的方法分为3种: 开放地址法 链地址法 建立公共溢出区. [开放地址法] 开 ...

  5. 查找算法【哈希表】 - 散列查找及性能分析

    查找算法[哈希表] - 散列查找及性能分析 散列表虽然建立了关键字和存储位置之间的直接映像,但冲突不可避免,在散列表的查找过程中,有的关键字可以通过直接定址1次比较找到,有的关键字可能仍然需要和若干关 ...

  6. 查找算法【哈希表】- 散列函数

    查找算法[哈希表]- 散列函数 散列函数(Hash Function),又被称为哈希函数,是将关键字映射到存储地址的函数,被记为hash(key)=Addr. 设计散列函数时需要遵循两个原则: ①散列 ...

  7. python二分法查找算法_顺序查找算法和折半(二分法)查找算法,C语言查找算法详解...

    查找是指在大量的信息中寻找一个特定的信息.在计算机中,查找是非常重要的一个应用,比如"百度".查找算法的好坏直接影响查找的速度. 常用的查找算法主要有顺序查找和折半(二分法)查找: ...

  8. 数据结构之查找算法:散列查找

    查找算法:散列查找 思维导图: 散列函数和散列表: 构造散列函数的要求: 构造散列函数的方法: 直接定址法: 除留取余法: 数字分析法: 平方取中法: 折叠法: 解决冲突的方法: 开放定址法: 线性探 ...

  9. 经典算法学习——哈希查找

    哈希查找也称为散列查找.所谓的哈希其实就是在记录的存储位置和记录的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key).查找时,根据这个确定的对应关系找到给定值的映射f ...

  10. JAVA算法:哈希查找

    哈希查找(Hash Search) 概念: 哈希法:又称散列法.杂凑法或关键字地址计算法等,相应的表称为哈希表. 哈希表的装填因子α: α = 哈希表中元素个数 / 哈希表的长度 α可描述哈希表的装满 ...

最新文章

  1. 文件操作(ifstream、ofstream、fstream)
  2. 【软考-软件设计师】计算机存储系统
  3. Spring.NET 1.3.1 正式版已发布
  4. java学习(58):私有内部类后访问
  5. java 验证码生成和验证
  6. Java 开发者靠什么逆风翻盘?
  7. paip.c#使用匿名函数建立委托提高可读性
  8. linux的I/O多路转接select的fd_set数据结构和相应FD_宏的实现分析
  9. 通达OA二次开发 小飞鱼工作流开发快捷CRM解决方案
  10. 斐讯K3C官改V1.7D降级至官改V1.6
  11. Python实现一键翻译英文论文,实现了pdf文档英译汉,pdf格式不变
  12. logmein测试准备
  13. 基于Go语言Iris+Layui的OA办公系统
  14. 撩小姐姐的小程序(二)----旋转3D八音盒
  15. 有n个人围成一圈 顺序排号 java_java有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出...
  16. Packet Tracer 思科模拟器入门教程 之七 利用三层交换机实现VLAN间路由
  17. 将 Business Events 与WESB及WPS rver 集成
  18. 快速离散fr%C3%A9chet距离
  19. java 翻译接口_java版本 百度翻译接口
  20. 古代的银子和现在的人民币换算关系..

热门文章

  1. rnqoj-28-合唱队形-最长上升子序列
  2. 数据结构与算法之队列
  3. Android自动化测试之MonkeyRunner使用
  4. 漫谈GUI开发—各种平台UI开发概况
  5. 【排坑】内外部事务的回滚问题(三)
  6. navicat 不能正常启动
  7. php中$t=date()函数参数意义及时间更改
  8. OBjectve-c 基本数据类型 总结
  9. 关于自定义函数的创建和调用
  10. 9.性能之巅 洞悉系统、企业与云计算 --- 磁盘