散列(C++实现)
散列的构成:散列函数,散列表的存储方式,散列表的冲突解决方法。
1.散列函数
较常用的散列函数有除留余数法,数字分析法,平方取中法,折叠法。
2.散列表的存储方式
闭散列法(开地址法),用数组存储;开散列法(链地址法),用邻接链表存储。
3.散列表的冲突解决方法
主要是针对闭散列中关键码位置冲突的问题,常用的方法有线性探查法,二次探查法,双散列法。
性能分析:在存储方式中,开散列法优于闭散列法;在散列函数中,除留余数法最优。
实现代码:
#include<iostream>
using namespace std;
enum kind{Active,Empty,Deleted};
class ArrayHashTable{//闭散列法
public:
ArrayHashTable(const int d,int sz=){
tableSize=sz;
divitor=d;
table=new int[tableSize];
info=new kind[tableSize];
for(int i=;i<tableSize;i++){
table[i]=;
info[i]=Empty;
}
}
~ArrayHashTable(){
delete[] table;
delete[] info;
}
bool findPos(int k,int &i){//寻找k关键码所在位置i
i=k%divitor;
int j=i;
do{
if(info[i]==Active&&table[i]==k)
return true;
if(info[i]==Empty)
return false;
i=(i+)%tableSize;
}
while(j!=i);
return false;
}
bool insert(int k){//插入关键码k
int i;
if(findPos(k,i))
return false;
if(info[i]!=Active){
table[i]=k;
info[i]=Active;
return true;
}else
return false;
}
bool remove(int k){//删除关键码k
int i;
if(!findPos(k,i))
return false;
table[i]=Deleted;
return true;
}
int *getArray(){
return table;
}
private:
int divitor;
int tableSize;
int *table;
kind *info;
}; class Node{
public:
int data;
Node *next;
Node(int d,Node *n=NULL){
data=d;
next=n;
}
};
class LinkedHashTable{//开散列法
public:
LinkedHashTable(int d,int sz=){
tableSize=sz;
divitor=d;
hs=new Node*[sz];
for(int i=;i<sz;i++)
hs[i]=new Node();
}
~LinkedHashTable(){
delete []hs;
}
bool findPos(int k,Node *&p,Node *&last){
int i=k%divitor;
last=hs[i];
p=hs[i]->next;
while(p!=NULL&&p->data!=k){
p=p->next;
last=last->next;
}
if(p!=NULL&&p->data==k)
return true;
else
return false;
}
bool insert(int k){
Node *p,*last;
int i=k%divitor;
if(findPos(k,p,last))
return false;
last->next=new Node(k);
return true;
}
bool remove(int k){
Node *p,*last;
if(!findPos(k,p,last))
return false;
last->next=p->next;
return true;
}
Node **getArray(){
return hs;
}
private:
int divitor;
int tableSize;
Node **hs;
}; void test(Node *&q){
q=new Node();
}
int main(){
//闭散列法
// ArrayHashTable *hs=new ArrayHashTable(11,12);
// int a[]={37,25,14,36,49,68,57,11};
// for(int i=0;i<8;i++)
// hs->insert(a[i]);
// int *array=hs->getArray();
// for(int i=0;i<12;i++){
// cout<<array[i]<<" ";
// }
// delete hs; //开散列法
// LinkedHashTable *hs=new LinkedHashTable(11,12);
// int a[]={37,25,14,36,49,68,57,11};
// for(int i=0;i<8;i++)
// hs->insert(a[i]);
// Node **array=hs->getArray();
// for(int i=0;i<12;i++){
// Node *p=array[i]->next;
// while(p!=NULL){
// cout<<p->data<<" ";
// p=p->next;
// }
// cout<<endl;
// }
// delete hs;
return ;
}
散列(C++实现)的更多相关文章
- Android数据加密之SHA安全散列算法
前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好 ...
- StackExchange.Redis帮助类解决方案RedisRepository封装(散列Hash类型数据操作)
本文版权归博客园和作者本人共同所有,转载和爬虫请注明本系列分享地址:http://www.cnblogs.com/tdws/p/5815735.html 上一篇文章的不合理之处,已经有所修改. 今天分 ...
- Redis命令拾遗二(散列类型)
本文版权归博客园和作者吴双共同所有,欢迎转载,转载和爬虫请注明原文地址 :博客园蜗牛NoSql系列地址 http://www.cnblogs.com/tdws/tag/NoSql/ Redis命令拾 ...
- Java 消息摘要 散列 MD5 SHA
package xxx.common.util; import java.math.BigInteger; import java.security.MessageDigest; import jav ...
- 个人理解c#对称加密 非对称加密 散列算法的应用场景
c#类库默认实现了一系列加密算法在System.Security.Cryptography; 命名空间下 对称加密 通过同一密匙进行加密和解密.往往应用在内部数据传输情况下.比如公司a程序 和B程序 ...
- javascript数据结构与算法--散列
一:javascript数据结构与算法--散列 一:什么是哈希表? 哈希表也叫散列表,是根据关键码值(key,value)而直接进行访问的数据结构,它是通过键码值映射到表中一个位置来访问记录的,散列 ...
- Javascript中的字典和散列
function Dictionary() { var items={}; this.set=function (key,value) { items[key]=value; }; this.remo ...
- Redis常用命令入门2:散列类型
散列命令 散列类型的键值其实也是一种字典解耦,其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型,所以说散列类型不能嵌套其他的数据类型.一个散列类型的键可以包含最多2的32次方-1个 ...
- Redis从基础命令到实战之散列类型(Hash)
从上一篇的实例中可以看出,用字符串类型存储对象有一些不足,在存储/读取时需要进行序列化/反序列化,即时只想修改一项内容,如价格,也必须修改整个键值.不仅增大开发的复杂度,也增加了不必要的性能开销. 一 ...
- C# SHA1散列算法
C# SHA1散列算法 /// <summary> /// C# SHA1散列算法 /// </summary> /// <param name="str&qu ...
随机推荐
- Ubuntu 18.04中截图工具Shutter的编辑按钮不可用的解决办法
Shutter是一个由第三方提供的在Ubuntu上运行的截图工具,相对于系统自带的截图工具(默认可通过Ctrl + Shift + Print快捷键启动截图),最大的优点就是可以即时对图片进行编辑,在 ...
- matlab导入txt数据画图
因为最近需要观察txt保存的一堆数据,则需要使用这些数据画图.强大的matlab分分钟解决了. 实例数据:data.txt 步骤: ①打开matlab -> HOME(主页) -> Imp ...
- 好的RESTful API的设计原则
转载自一位大佬 英文原版 Principles of good RESTful API Design Good API design is hard! An API represents a cont ...
- python 中 try catch finally语句中含有return语句的执行情况
无论是在try还是在except中,遇到return时,只要设定了finally语句,就会中断当前的return语句,跳转到finally中执行,如果finally中遇到return语句,就直接返回, ...
- 最新版jQuery v3.3.1的BUG以及解决办法(什么问题不重要,怎么解决问题才重要)
发现问题 最新版的 FineUIPro v5.2.0 中,我们将内置的 jQuery v1.12.4 升级到 jQuery v3.3.1 ,可以看升级记录: +升级到jQuery v3.3.1. ...
- vue页面固定锁死
- vue 倒计时组件
<template> <span> <i v-text="msg"></i> </span></template& ...
- java关键字保留字
Here is a list of keywords in the Java programming language. You cannot use any of the following as ...
- sprigboot recontroller 是responsebody与controller结合 这样 就使每个方法默认返回json
sprigboot recontroller 是responsebody与controller结合 这样 就使每个方法默认返回json
- python之单例模式、栈、队列和有序字典
一.单例模式 import time import threading class Singleton(object): lock = threading.RLock() # 定义一把锁 __inst ...