散列沖突與作為特征值的散列

緣起

寫這篇文章,源于這么一個問題:假設目前有一千萬個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.pswp.cn/news/256886.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256886.shtml
英文地址,請注明出處:http://en.pswp.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…