散列冲突与作为特征值的散列

缘起

写这篇文章,源于这么一个问题:假设目前有一千万个URL访问记录,请统计最热门的10个查询串。(见此文)。见到这个问题的第一想法使用hash解决,没考虑hash冲突解决的问题(其实就没想比较URL,不比较URL无法判断冲突与否)。后来意识到hash解法在内存受限情况下存在致命缺陷,才有写这个blog的想法。

散列/散列函数

Hash,一般翻译做散列,也音译为哈希,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法(散列函数),变换成固定(或不定)长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。散列函数(或散列算法,Hash Function)是一种从任何一种数据中创建小的数字指纹的方法。该函数将数据打乱混合,重新创建一个叫做散列值的指纹。

作为特征值的散列

散列函数是一种从任何一种数据中创建小的数字指纹的方法。密码学上的 Hash 又被称为"消息摘要(message digest)"简言之,指纹信息摘要本质就是数据的特征值,即散列函数可用于提取数据的特征值。在模式识别中,由于处理原始数据比较困难,经常通过提取数据的多维特征值来简化数据处理。

最佳的特征值是能完全表征数据的特征值,实际当中很难找到,不管是一维还是多维的特征值。完美散列就是希望能够找到能唯一表征原始数据的散列函数。

散列函数有一个基本特性:输出不同,原始数据必然不同;输出相同,原始数据可能不同。将无限定义域映射成有限值域必然存在冲突。加密散列函数是很不错的散列函数,其输出是一个很大的整数,值域很大,故冲突较少。

因为散列值无法唯一表征原始数据,故冲突判断只能通过比较原始数据方能得知。作为特征值的哈希值非常适合用于判断原始数据是否不同,比如文件、图片等。

MPQ散列函数

MPQ使用文件名哈希表来跟踪内部的所有文件。算法使用了3种不同的哈希:一个用于哈希表的下标,两个用于验证。这两个验证哈希替代了实际文件名。其本质就是使用3个哈希值来表征文件,当然,mpq无法解决散列冲突问题:即相同的3个哈希值对应两个不用的文件。

容忍冲突的散列(什么场合冲突可容忍?)

原始问题: 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G

问题1将记录规模扩大1000倍,即几十亿的记录,内存几十G

问题2将记录规模扩大1000倍,即几十亿的记录,内存几G。即在内存受限的情况下,如何处理数据。(内存读写比硬盘快100倍以上,随机读写估计在1w倍以上,直接以磁盘空间代替内存空间的做法就不用提了)

对于问题1,想过一个算法:元数据存于内存+URL存磁盘。元数据:URL哈希值、访问计数,文件偏移量;所有的URL均存在磁盘中。这个算法有个前提:忽略冲突,将URL哈希值作为URL的唯一表征。元数据量不大((8+8+8)*1G=24G)可全部在内存中存放,处理很快;比较URL哈希值远比直接比较URL快;URL采用追加方式写入磁盘,效率也不是问题。但是忽略冲突却是一个致命的缺陷。

当然可以采取一些措施来减少哈希冲突,如采用128为哈希值,采用多维特征值(URL长度,双哈希值(可直接使用中间哈希值和最终哈希值)),但这些都无法保证无冲突,即不可能采用有限的特征来表示无限的URL空间!

分布式方案mapreduce

元问题:如果不能直接使用内存来处理所有的数据,那么问题12就退化成同样的问题:如何在内存受限的情况下处理大规模的数据?

这样的问题有通用解法:map-reduce。即先对数据分类(独立的类别),再分别处理,最终归并结果。

1) 将原始记录通过hash分别记录到不同的N个文件(同一个URL只出现在一个文件中);

2) 分别对N个文件做统计处理,排序输出;

3) 采用最小堆挑出最热门的m个记录。

经过这么分类之后,这个算法本质上是可并行处理的,很容易在分布式集群中实现。“分而治之”的办法真的很实用(怎么分很重要)Mapraduce的思想也很通用。

参考文献:

从头到尾彻底解析Hash 表算法

wiki散列

wiki散列函数

本文转自 zhenjing 博客园博客,原文链接:  http://www.cnblogs.com/zhenjing/archive/2011/06/09/hash.html ,如需转载请自行联系原作者


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++:getenv setenv -- 获取设置系统环境变量

C&#xff1a;getenv & setenv -- 获取&设置系统环境变量 1. getenv&#xff1a;取得环境变量内容 头文件- #include<stdlib.h> 格式&#xff1a; char * getenv(const char *name); 意义&#xff1a; getenv()用来取得参数name环境变量的内容。 param name为环…

CSS单位和值

颜色值 在网页中的颜色设置是非常重要&#xff0c;有字体颜色&#xff08;color&#xff09;、背景颜色&#xff08;background-color&#xff09;、边框颜色&#xff08;border&#xff09;等&#xff0c;设置颜色的方法也有很多种&#xff1a; 1、英文命令颜色 前面几个小节中…

学习笔记(40):Python实战编程-文本

立即学习:https://edu.csdn.net/course/play/19711/343102?utm_sourceblogtoedu 文本——人机交互&#xff0c;文本输入的地方&#xff08;tkinter.Text&#xff08;“需要显示的文本”&#xff0c;属性的设置&#xff09;组件类&#xff09; 知识点&#xff1a; 文本输入 文…

嵌入式linux的调试技术

本章介绍了嵌入式linux的调试技术&#xff0c;例如&#xff0c;设置断点、逐步跟踪代码、输出调试信息等。 Printk函数用于打印内核调试信息&#xff0c;运行在内核空间&#xff0c;printf函数运行在用户空间。Printk文件是一个简单的有4个数字组成的文本文件。 虽然使用Printk…

constexpr的好处

constexpr的好处&#xff1a; 是一种很强的约束&#xff0c;更好地保证程序的正确语义不被破坏。编译器可以在编译期对constexpr的代码进行非常大的优化&#xff0c;比如将用到的constexpr表达式都直接替换成最终结果等。相比宏来说&#xff0c;没有额外的开销&#xff0c;但更…

PHP中include()与require()的区别说明

123456789101112131415161718192021222324252627require 的使用方法如 require("MyRequireFile.php"); 。这个函数通常放在 PHP 程序的最前面&#xff0c;PHP 程序在执行前&#xff0c;就会先读入 require 所指定引入的文件&#xff0c;使它变成 PHP 程序网页的一部份…

电脑重装系统重装不了,老是蓝屏,是不是硬盘烧坏了!

蓝屏代码是什么啊装不了有时候是内存的问题以下内容为百度知道Ctangel个人总结&#xff0c;并非网络复制&#xff0c;全是个人日常工作中遇到并且明确确定原因的。如需复制请注明出处。这里列举几个典型的蓝屏故障的原因和解决办法。一、0X0000000A 这个蓝屏代码和硬件无关&…

学习笔记(41):Python实战编程-按钮

立即学习:https://edu.csdn.net/course/play/19711/343103?utm_sourceblogtoedu 按钮——用于指令的提交作用&#xff0c;如将文本中输入的信息进行提交等 button tkinter.Button(root,text linlianqin,image photo,compound bottom) 创建了一个图片按钮&#xff0c;并且…

第八章读后感

一&#xff0e;Linux驱动的代码重用有很多的方法&#xff0c;可以采用标准的C程序的方法将要重用的代码放在其他的文件&#xff08;在头文件中声明&#xff09;中。如果要使用某些功能&#xff0c;include相应的头文件即可&#xff0c;也可以是另外一种动态重用的方式&#xff…

linux系统基础优化小结

不用root&#xff0c; 添加普通用户&#xff0c;通过sudo授权管理 更改默认的远程ssh服务端口及禁止root用户远程登陆 定时自动更新服务器时间 ntpdate 配置yum更新源&#xff0c;从国内更新源下载安装软件&#xff0c;如啊里云&#xff0c;163等.http://mirrors.aliyun.com…

iOS8 【xcode6中添加pch全局引用文件】

前沿&#xff1a;xcode6中去掉了pch&#xff0c;为了一些琐碎的头文件引用&#xff0c;加快了 编译速度&#xff01; xcode6之前的版本建项目就自动添加了是这样的&#xff1a;xcode6后的版本要自己手动的添加步骤如下&#xff1a;1&#xff09; 2)3&#xff09; $(SRCROOT)/pc…

学习笔记(42):Python实战编程-pyinstaller程序打包

将程序打包可以使得所有Windows带有python虚拟机的电脑进行使用&#xff0c;打包的内容有代码加外部资源&#xff08;如logo图片等&#xff09; 步骤&#xff1a; 1&#xff09;创建程序的代码 2&#xff09;生成配置文件——用于获得打包的资源&#xff0c;将资源保存在运行程…

[js]BOM篇

一、什么是BOM BOM&#xff08;Browser Object Model&#xff09;即浏览器对象模型。BOM提供了独立于内容 而与浏览器窗口进行交互的对象&#xff1b;由于BOM主要用于管理窗口与窗口之间的通讯&#xff0c;因此其核心对象是window&#xff1b;BOM由一系列相关的对象构成&#x…

透视校正

1、需要解决的问题&#xff1a; 怎么用图像处理的办法将梯形转换为规则的矩形&#xff0c;进行一个视觉的透视校正 2、解决思路&#xff1a; 1&#xff09;先二值化图像&#xff0c;提取其轮廓&#xff08;其中使用到填充&#xff0c;形态学知识&#xff09; 2&#xff09;…

杂项备忘

svn导出 export LANGzh_CN.UTF-8 && svn --username shuai --password shuai checkout svn://192.168.14.111/safe.qq.com /update/webapps/safe.qq.com mysqlsla --sortc_sum slow.log 本文转自 liang3391 51CTO博客&#xff0c;原文链接:http://blog.51cto.com/liang…

安装Pywin32后无法正常引用pyd文件

1. 首先在官方下载pywin32 2.下载完成后,无法正常引用pyd文件 3.解决方案: python安装目录\Lib\site-packages\pywin32_system32\* 至 C:\Windows\System32 转载于:https://www.cnblogs.com/MonkeyKingK/p/4731960.html

pyinstaller运行时出现TCLError的错误该怎么办?

1)修改代码后需要重新按照以上步骤进行&#xff0c;尤其不能忘记了修改配置文件的datas 2)必须得先pyi-makespec -F *.py指定要打包的程序&#xff0c;再修改配置文件&#xff0c;再pyinstaller -F *.spec程序打包 3&#xff09;确保配置文件已经修改成功&#xff0c;即将以下图…

视觉统计计数方案

1、二值化分割 2、形态学 3、距离变换 4、再进行二值化 4、连通区域计算 输入&#xff1a; 输出&#xff1a;printf&#xff08;"统计玉米粒的个数 contours:%d\n",contours);//contours 17

SQL Server 查询表备注信息的语句

--name 字段名称--user_type_id --max_length 最大长度--is_nullable 是否允许空--remark 描述SELECT c.name, c.user_type_id, c.max_length, c.is_nullable, remark ex.value FROM sys.columns c inner JOIN sys.extended_properties ex ON ex.major_id c.object_id…

Filezilla 利用私钥无密码登录

Filezilla是常用的FTP客户端软件&#xff0c;这里介绍一个用私钥进行登录 主机:sftp://yourserver 用户名&#xff1a;yourname 点击“编辑”-“设置”菜单打开设置对话框&#xff0c;找到“连接”-“SFTP”设置项 添加密钥文件(A)”按钮,添加私钥文件&#xff0c;弹出对话框&a…