哈希--直接定值法和除留取余法
- 直接定值法
- 除留取余法
#include<iostream>
using namespace std;
#include<vector>//作为一个标记位
enum State
{EMPTY,EXIT,DEL
};//哈希节点
template<class K,class V>
struct HashNode
{pair<K, V> _kv;State _state;HashNode():_state(EMPTY){}
};template<class K,class V>
ostream& operator<<(ostream &out, HashNode<K,V> node)
{out << " "<< " " << node._state;return out;
}template<class K,class V>
class HashTable
{//friend ostream& operator<<(ostream &out, HashNode<K, V> node);
public:HashTable():_n(0){_table.resize(10); //预留的数租空间大小是}//插入函数bool Insert(const pair<K,V> node){Capacity();int m = HanshFunc(node); //HanshFunc,找到我需要插入的一个下标size_t index = m;size_t i = 0;while (_table[index]._state == EXIT){index = m;i++;index = m + i*i;while (index >= _table.capacity()){index = index - _table.capacity();}}_table[index]._kv = node;_table[index]._state = EXIT;_n++;return true;}int Search(const pair<K, V> node){size_t m = HanshFunc(node);size_t index = m;size_t i = 0;while (_table[index]._kv.first != node.first){if (_table[index]._state == EMPTY){return -1;}index = m;i++;index = m + i*i;while (index >= _table.capacity()){index = index - _table.capacity();}}return index;}private:void Capacity(){//if (_n / _table.capacity() >= 0.7) //这类需要改进的一个地方 就是,我们不能使用0.7,因为除以了之后,不是一个小数//{// printf("增容\n");//}if (_n * 10 / _table.capacity() >= 7){printf("增容\n");}}int HanshFunc(const pair<K, V> node){size_t index = node.first % _table.capacity();return index;}private:vector<HashNode<K,V>> _table; //这个是数组size_t _n; //当前放置的数据的个数是多少
};
HashTable.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include"hashtable.h"int main()
{HashTable<int, int> a;pair<int, int> p(5,6);pair<int, int> p1(15,7);pair<int, int> p2(25, 6);pair<int, int> p3(85, 6);pair<int, int> p4(75, 6);pair<int, int> p5(95, 6);pair<int, int> p6(2, 6);pair<int, int> p7(4, 6);a.Insert(p);a.Insert(p1);a.Insert(p2);a.Insert(p3);a.Insert(p4);a.Insert(p5);a.Insert(p6);a.Insert(p7);cout << a.Search(p);return 0;
}
哈希--直接定值法和除留取余法相关推荐
- 哈希表除留取余法的桶个数为什么是质数
可先科普下质数的概念:质数,也就是素数,就是指一个大于1的自然数,约数(因数)只有1和它自己,否则叫合数. 除留取余,就是哈希函数将关键字被某个不大于哈希表长m的数p除后所得余数为哈希地址.这是最常用 ...
- 哈希表的实现(取余法)
哈希表,又叫散列表,它可以提供快速的插入查找操作,对于大规模数据的查找时间空间效率会很高.哈希表构造方式有多种,其中取余法在比赛中最常用. 如果读入很多值非常大的数,让你判断一些数是否出现过.如果用桶 ...
- (C++)1022 D进制的A+B 除基取余法将10进制数换成给定进制数
#include<cstdio> //除基取余法 const int M = 30;int main(){long long a,b,c;int D,ans[M+2];scanf(&quo ...
- 进制转换之十进制转换为D进制——整数部分除基取余法
将十进制x转换为D进制的y: [方法]:整数采用"除基取余法",小数采用"乘基取整法" [推导]:以三位D进制为例,假设y的各位是a1a2a3 y = a 1 ...
- (C++)除基取余法:将十进制数转化为Q进制数
所谓基,就是指将要转换成的进制Q. 除基取余的意思就是:每次将待转换数除以Q,然后将得到的余数作为低位存储,而商则继续除以Q并重复上面的操作,直至商0时,将所有位从高到低输出就可以得到Q进制数. 代码 ...
- 十进制转二进制(除2取余法)
转载链接: https://baike.baidu.com/item/%E5%8D%81%E8%BF%9B%E5%88%B6%E8%BD%AC%E4%BA%8C%E8%BF%9B%E5%88%B6
- 哈希表(闭散列、拉链法--哈希桶)
哈希表,也称散列表,是一种通过key值来直接访问在内存中的存储的数据结构.它通过一个关键值的函数(被称为散列函数)将所需的数据映射到表中的位置来访问数据. 关于哈希表,主要为以下几个方面: 一.哈希表 ...
- 乘基取整法是什么_深入理解计算机系统(六):进制间的转换原理
目录 1.进制的介绍 2.二进制转换成其他进制 3.十进制转换成其他进制 4.十六进制转换成其他进制 5.总结 上一篇博客我们讲解了信息的在计算机中是如何存储以及如何表示的.但是对于各个进制的转换只是 ...
- 乘基取整法是什么_数字逻辑电路-学习指南
数字逻辑电路 - 学习指南 一.判断题 (判断结果为真( T )或为假( F ) 1 . ( )逻辑函数的真值表是惟一的,但表达式不一定是惟一的. 2 . ( )在基数乘除法中,整数部分的转换采用 & ...
最新文章
- 图像读取、转为灰度图像、均值平滑、显示保存操作
- Scala堆的方式进行Spark topK词频查询(根据value进行TreeMap排序)
- SpringBoot系列: RestTemplate 快速入门
- 3 分钟搞定 Android Push
- 将图形以PNG格式输出到浏览器或文件
- 提升体验-支持Chrome Custom Tabs
- tcp为什么需要3次握手和3次握手的过程
- 多容器,Nginx容器灵活切换PHP版本!同时运行多个PHP容器
- HDU 2084 数塔
- 浅谈数据中心白盒交换机开发
- 74HC595串口转并口芯片学习
- (逆向工程)Android一键脱壳工具(MDEX)
- js获取当前时间(标准时间)
- 常用jquery方法 总结
- 记录下如何判断错误:no such file or directory
- STM8新建IAR工程
- 关于iOS中UITableView下拉距离短刷新没事,下拉距离长就会崩溃的问题解决方案
- Android View部分消失效果实现
- mac电脑打不开应用程序的解决方法
- 暴力破解之验证码绕过
热门文章
- linux定时器(crontab)实例
- 基于jQuery垂直多级导航菜单代码
- 有关 ecshop 属性 {$goods.goods_attr|nl2br} 标签的赋值问题
- :before和::before的区别
- 《OpenCV3编程入门》学习笔记7 图像变换(一)基于OpenCV的边缘检测
- mysql数据导入python_利用python将mysql中的数据导入excel
- centos6卸载mysql服务器_CentOS6.5下卸载自带的MySQL数据库安装MySQL5.6
- linux mysql 5.7.12_Linux环境mysql5.7.12安装教程
- php get memory,PHP memory_get_usage 和 memory_get_peak_usage获取内存的区别
- 递归下降文法C语言实验报告,递归下降语法分析器实验报告.doc