哈希:

字符串(数字同理):

例如有100000个字符串,现在要插入一些字符串,插入前比较是否已经存在避免含有重复数据

用暴力计较的话会比较慢,在某字符串插入时,最好的情况是在第一个位置就遇见该字符串,但如果在比较了100000后发现没有某字符串,然后进行插入,那么比较100000次的比较则是浪费时间

用映射的方法可以很快判断是否存在某字符串:

1、把100000个字符串存放在经哈希函数返回的哈希地址内

2、将待插入的字符串也经哈希函数,查看返回的哈希地址里是否已经有了某字符串或是否和含有的字符串相等(发生冲突时),没有就插入

每个串都有自己的哈希地址。这取决于需要一个好的哈希函数(BKDRhash),尽量让每个字符串的哈希地址不发生冲突。但有时总存在两个串的哈希地址相同,发生冲突,别急,有解决冲突的办法。

选用的哈希函数:

哈希函数的目的就是为了产生字符串的哈希值,让不同的字符串尽量产生不同的哈希值的函数就是好的哈希函数,全然不会产生同样的哈希函数就是完美的。

处理冲突的方法:

处理冲突的方法有多种,开放定址、拉链法、公共溢出区等。

装载因子,即哈希表的饱和程度:

一般来说装载因子越小越好。装载因子越小,碰撞也就越小。哈希表的速度就会越快,但是这样会大大的浪费空间。假如装载因子为0.1。那么哈希表仅仅有10%的空间被真正利用。其余的90%都浪费了,这就是时间和空间的矛盾点。为了平衡,如今大部分採用的是0.75作为装载因子,装载因子达到0.75,那么就动态添加哈希表的大小。

因此,在编写代码之前,首先需要根据所要处理的数据,选择合适的hash函数和冲突处理办法。开放定址需要空闲存储单元,所需要的表比实际容量大,而且容易产生二次聚集发生新冲突。链地址使用链表存储关键字,可以随时插入新数据,数据量大小不受限制。缺点是要用到指针,给新单元分配地址需要时间,会一定程度上减慢算法速度,但影响不大可以忽略。

BKDRhash函数代码如下:

 unsigned int BKDRHash(char *str)
{
unsigned int seed = ;//也可以乘以31、131、1313、13131、131313..
unsigned int hash = ;
while(*str)
{
hash = hash*seed + (*str++);
}
return hash%0x7FFFFFFF;//MAX代表hash表长度
}

测试代码:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <string.h>
#define MAX 40000
using namespace std;
struct node
{
char name[];
}que[MAX];
/*
BKDRHash函数的解析链接:
http://blog.csdn.net/djinglan/article/details/8812934
*/
unsigned int BKDRHash(char *str)
{
unsigned int seed = ;//也可以乘以31、131、1313、13131、131313..
unsigned int hash = ;
while(*str)
{
hash = hash*seed + (*str++);
} return hash%;//最好对一个大的素数取余
}
int main()
{
int i=,n,t,j;
char a[MAX][];
char temp[];
memset(a,,sizeof(a)); cin >> n;
for(i=;i<n;i++)
{
cin >> que[i].name;
strcpy(a[BKDRHash(que[i].name)],que[i].name);
}
cout << "请输入要查找的字符串:";
while(~scanf("%s",temp))
{
if(strcmp(a[BKDRHash(temp)],temp)==)
cout << "yes" << endl;
else
{
cout << "no" << endl;
strcpy(a[BKDRHash(temp)],temp);
strcpy(que[i++].name,temp);
}
}
for(j=;j<=i;j++)
{
cout << que[j].name << endl;//含有的所有字符串
}
return ;
}

转载用拉链法解决冲突的方法:http://www.cnblogs.com/liuliuliu/p/3966851.html    (小弟认为此定为大神级人物,膜拜O(∩_∩)O哈哈~)

BKDRhash的更多相关文章

  1. BKDRhash实现

    参考了一些有关于哈希算法的博客,里面都有提到BKDR哈希算法,在博客:各种字符串Hash函数中有对各种hash算法进行测试,测试关于哈希冲突,以及散列的质量,得到的结果可以参考以上博文. BKDRha ...

  2. 哈希表之bkdrhash算法解析及扩展

    BKDRHASH是一种字符哈希算法,像BKDRHash,APHash.DJBHash,JSHash,RSHash.SDBMHash.PJWHash.ELFHash等等,这些都是比較经典的,通过http ...

  3. HDU 4821 String(BKDRHash)

    http://acm.hdu.edu.cn/showproblem.php?pid=4821 题意:给出一个字符串,现在问你可以找出多少个长度为M*L的子串,该子串被分成L个段,并且每个段的字符串都是 ...

  4. 逐步实现hash算法(基于BKDRhash函数)

    哈希(Hash)算法,即散列函数.它是一种单向密码体制,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程.同时,哈希函数可以将任意长度的输入经过变化以后得到固定长度的输出.hash算法 ...

  5. BKDRHash函数

    unsigned int BKDRHash(char*str) { unsigned ;// 31 131 1313 13131 131313 etc.. unsigned ; while(*str) ...

  6. 【字符串哈希】【BKDRhash】【Rabin-Karp算法】模板

    #include<cstdio> #include<iostream> #include<cstring> #include<string> #incl ...

  7. Hihocoder #1602 : 本质不同的回文子串的数量 manacher + BKDRhash

    #1602 : 本质不同的回文子串的数量 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个字符串S,请统计S的所有子串中,有多少个本质不同的回文字符串? 注意如果 ...

  8. HDU 4622 Reincarnation 后缀自动机 // BKDRHash(最优hash)

    Reincarnation Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) P ...

  9. BKDRHash 算法 php 版本( 可用于 字符串 hash 为int 转)

    <?php function BKDRHash($str) { $seed = 131; // 31 131 1313 13131 131313 etc.. $hash = 0; $cnt = ...

  10. BKDRHash算法的初步了解

    字符串hash最高效的算法,  搜了一下,  原理是: 字符串的字符集只有128个字符,所以把一个字符串当成128或更高进制的数字来看,当然是唯一的 这里unsigned不需要考虑溢出的问题,  不过 ...

随机推荐

  1. Linux报错:“/bin/bash^M: 坏的解释器

    原因是linux下的文件,在windows下面编辑过.在win下编辑的时候,换行结尾是\n\r , 而在linux下 是\n 解决方法,将文件里面的内容做替换即可 sed -i 's/\r$//' b ...

  2. [转]Event loop——浏览器和Node区别

    最近对Event loop比较感兴趣,所以了解了一下.但是发现整个Event loop尽管有很多篇文章,但是没有一篇可以看完就对它所有内容都了解的文章.大部分的文章都只阐述了浏览器或者Node二者之一 ...

  3. AntColony 磁力搜索引擎的核心

    介绍 AntColony(Github)是findit磁力搜索引擎的核心.用来在DHT网络中,收集活跃资源的infohash,下载并解析资源的种子文件,存入数据库等.AntColony是若干功能的合集 ...

  4. mysql 无法存储joda time的datetime类型

    com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '\xAC\xED\x00\x05sr\x ...

  5. PHP把图片保存到数据库,将图片本身保存在数据库,而非保存路径

    备注 百度开发者的云代码空间为了保证高可用,不允许用户将图片保存到代码空间中,使用CDN或者对象存储不仅收费而且使用比较复杂,于是考虑能否将img存储在数据库中,虽然很多人说会造成性能问题,权当一试 ...

  6. Apache配置虚拟主机,全部指向一个目录

    配置虚拟主机的时候,全部指向了一个目录,解决方法是在httpd.conf中添加: NameVirtualHost *:80

  7. 基于pytest的接口测试

    最近要开展接口测试,起初打算使用公司已有的Fitnesse测试工具来进行接口测试.过程中发现,构造接口字段数据.测试数据都比较困难,接口参数多的时候,用例量就会很多,关键执行速度还慢.所以放弃了. 找 ...

  8. 蚁群算法MATLAB解TSP问题

    Excel表exp12_3_1.xls中数据为: clc clear all [xdata,textdata]=xlsread('exp12_3_1.xls'); %加载20个城市的数据,数据按照表格 ...

  9. 来实现一个缩水版Vuex

    对 Vuex 源码进行浓缩,DIY 一个小型 Vuex 功能如下 通过 $store.commit 改变 $store.state 实现 strict model 源码约70行左右比较好理解,下面讲解 ...

  10. UIImageView添加圆角

    最直接的方法就是使用如下属性设置: 1 2 3 imgView.layer.cornerRadius = 10; // 这一行代码是很消耗性能的 imgView.clipsToBounds = YES ...