<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java軟件報表軟件技術博客

    java報表軟件技術匯總 java報表軟件制作 報表軟件新聞
    posts - 355, comments - 100, trackbacks - 0, articles - 3
       :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理


    下面的方法是我對海量數(shù)據的處理方法進行了一個一般性的總結,當然這些方法可能并不能完全覆蓋所有的問題,但是這樣的一些方法也基本可以處理絕大多數(shù)遇到的問題。下面的一些問題基本直接來源于公司的面試筆試題目,方法不一定最優(yōu),如果你有更好的處理方法,歡迎與我討論。 

    1.Bloom filter 

    適用范圍:可以用來實現(xiàn)數(shù)據字典,進行數(shù)據的判重,或者集合求交集 

    基本原理及要點: 

    對 于原理來說很簡單,位數(shù)組+k個獨立hash函數(shù)。將hash函數(shù)對應的值的位數(shù)組置1,查找時如果發(fā)現(xiàn)所有hash函數(shù)對應位都是1說明存在,很明顯這 個過程并不保證查找的結果是100%正確的。同時也不支持刪除一個已經插入的關鍵字,因為該關鍵字對應的位會牽動到其他的關鍵字。所以一個簡單的改進就是 counting Bloom filter,用一個counter數(shù)組代替位數(shù)組,就可以支持刪除了。 

    還有一個比較重要的問題,如 何根據輸入元素個數(shù)n,確定位數(shù)組m的大小及hash函數(shù)個數(shù)。當hash函數(shù)個數(shù)k=(ln2)*(m/n)時錯誤率最小。在錯誤率不大于E的情況 下,m至少要等于n*lg(1/E)才能表示任意n個元素的集合。但m還應該更大些,因為還要保證bit數(shù)組里至少一半為0,則m應 該>=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以2為底的對數(shù))。 

    舉個例子我們假設錯誤率為0.01,則此時m應大概是n的13倍。這樣k大概是8個。 

    注意這里m與n的單位不同,m是bit為單位,而n則是以元素個數(shù)為單位(準確的說是不同元素的個數(shù))。通常單個元素的長度都是有很多bit的。所以使用bloom filter內存上通常都是節(jié)省的。 

    擴展: 

    Bloom filter將集合中的元素映射到位數(shù)組中,用k(k為哈希函數(shù)個數(shù))個映射位是否全1表示元素在不在這個集合中。Counting bloom filter(CBF)將位數(shù)組中的每一位擴展為一個counter,從而支持了元素的刪除操作。Spectral Bloom Filter(SBF)將其與集合元素的出現(xiàn)次數(shù)關聯(lián)。SBF采用counter中的最小值來近似表示元素的出現(xiàn)頻率。 

    問題實例:給你A,B兩個文件,各存放50億條URL,每條URL占用64字節(jié),內存限制是4G,讓你找出A,B文件共同的URL。如果是三個乃至n個文件呢? 

    根 據這個問題我們來計算下內存的占用,4G=2^32大概是40億*8大概是340億,n=50億,如果按出錯率0.01算需要的大概是650億個bit。 現(xiàn)在可用的是340億,相差并不多,這樣可能會使出錯率上升些。另外如果這些urlip是一一對應的,就可以轉換成ip,則大大簡單了。 

    2.Hashing 

    適用范圍:快速查找,刪除的基本數(shù)據結構,通常需要總數(shù)據量可以放入內存 

    基本原理及要點: 

    hash函數(shù)選擇,針對字符串,整數(shù),排列,具體相應的hash方法。 

    碰撞處理,一種是open hashing,也稱為拉鏈法;另一種就是closed hashing,也稱開地址法,opened addressing。 

    擴展: 

    d-left hashing中的d是多個的意思,我們先簡化這個問題,看一看2-left hashing。2-left hashing指的是將一個哈希表分成長度相等的兩半,分別叫做T1和T2,給T1和T2分別配備一個哈希函數(shù),h1和h2。在存儲一個新的key時,同 時用兩個哈希函數(shù)進行計算,得出兩個地址h1[key]和h2[key]。這時需要檢查T1中的h1[key]位置和T2中的h2[key]位置,哪一個 位置已經存儲的(有碰撞的)key比較多,然后將新key存儲在負載少的位置。如果兩邊一樣多,比如兩個位置都為空或者都存儲了一個key,就把新key 存儲在左邊的T1子表中,2-left也由此而來。在查找一個key時,必須進行兩次hash,同時查找兩個位置。 

    問題實例: 

    1).海量日志數(shù)據,提取出某日訪問百度次數(shù)最多的那個IP。 

    IP的數(shù)目還是有限的,最多2^32個,所以可以考慮使用hash將ip直接存入內存,然后進行統(tǒng)計。 

    3.bit-map 

    適用范圍:可進行數(shù)據的快速查找,判重,刪除,一般來說數(shù)據范圍是int的10倍以下 

    基本原理及要點:使用bit數(shù)組來表示某些元素是否存在,比如8位電話號碼 

    擴展:bloom filter可以看做是對bit-map的擴展 

    問題實例: 

    1)已知某個文件內包含一些電話號碼,每個號碼為8位數(shù)字,統(tǒng)計不同號碼的個數(shù)。 

    8位最多99 999 999,大概需要99m個bit,大概10幾m字節(jié)的內存即可。 

    2)2.5億個整數(shù)中找出不重復的整數(shù)的個數(shù),內存空間不足以容納這2.5億個整數(shù)。 

    將bit-map擴展一下,用2bit表示一個數(shù)即可,0表示未出現(xiàn),1表示出現(xiàn)一次,2表示出現(xiàn)2次及以上。或者我們不用2bit來進行表示,我們用兩個bit-map即可模擬實現(xiàn)這個2bit-map。

    轉載自:finereport愛好者論壇



    主站蜘蛛池模板: 久久国产精品免费专区| 午夜不卡AV免费| 99无码人妻一区二区三区免费| 国产成人精品日本亚洲专区61| igao激情在线视频免费| 亚洲精品成人a在线观看| 一级毛片视频免费观看| 亚洲日韩中文在线精品第一| 一级免费黄色大片| 亚洲码国产精品高潮在线| 成人妇女免费播放久久久| 亚洲αv久久久噜噜噜噜噜| 久久久久成人精品免费播放动漫| 亚洲国产精品一区| 国产乱子精品免费视观看片| 亚洲精品第一国产综合野| 午夜私人影院免费体验区| 免费看美女午夜大片| 亚洲综合图色40p| 一级毛片在线观看免费| 激情五月亚洲色图| 免费女人18毛片a级毛片视频| aa午夜免费剧场| 久久久久久亚洲精品成人| 国产福利在线观看免费第一福利| 在线精品亚洲一区二区| 亚洲国产天堂久久综合| 日本人成在线视频免费播放| 亚洲永久在线观看| 亚洲伦乱亚洲h视频| 99精品热线在线观看免费视频| 精品久久亚洲中文无码| 亚洲国产精品无码久久青草| 91福利视频免费观看| 亚洲av永久中文无码精品| 亚洲精品国产精品乱码不卡√| 美女视频黄的全免费视频网站| 污视频网站免费观看| 亚洲在成人网在线看| 亚洲精品高清在线| 天天影视色香欲综合免费|