哈希:

字符串(数字同理):

例如有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. 「LOJ10104」「一本通 3.6 练习 5」Blockade-Tarjan

    首先%%%lydrainbowcat 这个题唔,真是Tarjan好题(?) 不知道为啥也叫BLO,首字母? <题面> 搜索树真真的棒! 仔细看看,知道是Tarjan了,切掉一个点有不通的对 ...

  2. java并发系列(一)-----多线程简介、创建以及生命周期

    进程.线程与任务 进程:程序的运行实例.打开电脑的任务管理器,如下: 正在运行的360浏览器就是一个进程.运行一个java程序的实质是启动一个java虚拟机进程,也就是说一个运行的java程序就是一个 ...

  3. mysql 主从复制 配置

    mysql 的 默认配置文件在 /etc/my.cnf 1 修改主库 配置文件: 设置 服务id,并且开启二进制日志文件. server-id=1 log-bin=mysql-bin 2重启服务:se ...

  4. 使用netbeans 搭建maven工程 整合spring springmvc框架

    使用netbeans7.4 自带的tomcat7.0 所以jdk选择7.xx 然后等待生成空的工程,会缺一些文件夹,和文件,后续需要的时候补齐 然后修改pom.xml添加引用,直接覆盖dependen ...

  5. MyBatis中动态加载where条件

    1.trim 2.where 1 = 1 where 1=1 <if test="beginDate !=null and beginDate !='' "> and ...

  6. Lua 调用C模块DLL失败

    Lua中使用 local a = require "xxx" 的方式加载自己用C实现的DLL,DLL中有导出函数 luaopen_xxx . 调试过程中发现,luaopen_xxx ...

  7. 【NOJ2024】入栈序列和出栈序列

    入栈序列和出栈序列 时间限制(普通/Java):1000MS/3000MS         运行内存限制:65536KByte 总提交:293          测试通过:68 比赛描述 给出入栈序列 ...

  8. Oracle查询表里的重复数据方法

    select id from group by id having count(*) > 1 按照id分组并计数,某个id号那一组的数量超过1条则认为重复. 如何查询重复的数据 select 字 ...

  9. 用 Python 写一个 NoSQL 数据库Python

    NoSQL 这个词在近些年正变得随处可见. 但是到底 “NoSQL” 指的是什么? 它是如何并且为什么这么有用? 在本文, 我们将会通过纯 Python (我比较喜欢叫它, “轻结构化的伪代码”) 写 ...

  10. 解决git的the remote end hung up问题_百度经验

    使用git更新或提交中途有时出现The remote end hung up unexpectedly的异常,特别是资源库在国外的情况下.此问题可能由网络原因引起. 工具/原料   git 方法/步骤 ...