散列(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 ...
随机推荐
- java网络爬虫基础学习(四)
jsoup的使用 jsoup介绍 jsoup是一款Java的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,css以及类似于Jquery的操作方 ...
- svn + nginx unit + python3自动化发布web服务方法
本周将python web服务管理更换成nginx unit以后发现接口性能有了明显的提升,访问速度快了不少.不过有个很大的问题就是使用svn自动化发布以后,服务并没有刷新使用新的代码运行,而又不懂得 ...
- C#基础知识之IOC
依赖注入:http://www.cnblogs.com/leoo2sk/archive/2009/06/17/1504693.html IOC:https://jinnianshilongnian.i ...
- PHP字符串函数、常量、数组排序
PHP字符串函数.常量.数组排序 strlen() 说明:strlen(),可以统计字符串长度 用途:strlen() 常用于循环和其他函数,在确定字符串何时结束很重要时.(例如,在循环中,我们也许需 ...
- 《你必须掌握的Entity Framework 6.x与Core 2.0》正式出版感想
前言 借书正式出版之际,完整回顾下从写博客到写书整个历程,也算是对自己近三年在技术上的一个总结,整个历程可通过三个万万没想到来概括,请耐心阅读. 写博.写书完整历程回顾 从2013年12月注册博客园账 ...
- mange
from flask import Flask app = Flask(__name__) manager = Manager(app) 1. 重写Command class ShellCommand ...
- C语言之输入月收入,输出该月应纳税额-2019(简易版)
#include<stdio.h> #include<stdlib.h> #include<string.h> #define s1 0.03 //税率b < ...
- 菜鸟学IT之python网页爬取初体验
作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2881 1. 简单说明爬虫原理 爬虫简单来说就是通过程序模拟浏览器放松请求站 ...
- 关于 Be 主
大三在校生 每天不定刷 Leetcode POJ HDU 以及其他算法专题 自己很菜 还没有能力可以帮助别的旁友解决问题 :-( 毕竟有个人每天看着你写代码还是很幸福的事情呢 还是要骄傲夸一下 FH ...
- Keil MDK5的ITM调试
https://blog.csdn.net/burgesskzg/article/details/77100453