因此就雜湊表這種資料結構。
先從淺來講。
如果給我們一串資料,每個資料的範圍是0-9。那如何求出現頻次最高的資料呢?
我們是不是可以定義乙個長度為10的陣列當作計數器。而陣列下標的範圍是不是恰好是0-9?那麼我們是不是可以遍歷這串資料,每次迴圈出現的資料就把當作計數器的下標,讓該下標對應計數器陣列元素+1就好了,比如給我一串資料就是 0 1 2 1
第一次是0 讓 計數器[0]加個1
第二次是1 讓 計數器[1]加個1
第三次是2 讓 計數器[2]加個1
最後乙個資料是1 再讓計數器[1]加個1
此時計數器的 0 1 2 號下標對應的值分別為 1 2 1,是不是就是我們需要的每個資料對應的出現頻次。最後我們只要比較出現頻次的高低就可以了。
結果但是,但是來了,以上的情況非常的巧,資料的大小剛好是0-9十種數,而且計數器也允許我們定義為10個長度
,可是如果我只讓你的計數器長度為5呢(或者更少),你會說何必這麼摳呢?
其實已經夠大方了。你想想,一般的整形數字的範圍是多少,是不是2^32個,不算負數的也2^31個了,假如給你一串資料,範圍就是正整形,你要定義的計數器長度難道要2^31個?乙個佔4個位元組,到2^30個的時候已經消耗了4g的記憶體了,然而還有一半還沒有定義,況且能給你使用的記憶體也遠遠不到4g。如果資料範圍是long long 呢double呢,你計數器涉及到資料的還不到冰山一角。這還只是數字,字串的組合就更多了。。。顯然按照以往的思想是行不通的。
扯得遠了,就拿10種資料 和 長度為5的計數器 來說。
有什麼辦法可以塞得下2倍於自己的東西呢?
是不是可以分開塞啊?搬家一趟搬不完的東西是不是可以多搬幾次?難道非要一次搬完?
關鍵是分開搬?
10種資料,每次只能搬5種,是不是劃分成2次,很容易聯想到奇數偶數的劃分。
10種資料,給你的計數器長度是2呢。是不是每次只能搬2種,要搬5次,是不是能聯想到對5取餘的5種情況呢?
2^31=3萬多種資料,給你的計數器長度是10000,是不是每次只能搬1萬種,起碼要搬4次。按每個數對4取餘情況分成4次處理就好了。
**如下
結果
然而上面的**還是有點low,能不能改的稍微通用點,不用我們每次修改內容,只要給資料範圍,和計數器大小,**就能自動劃分一下呢? 還有在被呼叫函式裡列印等很多問題都太freestyle了
因此有了下面的改進
這將把10萬個隨機生成的資料中最頻資料列印出來。
結果然而我們知道一般的資料又都是存放在檔案中,一般不可能處理程式中生成的無意義的隨機數。因此結合檔案操作才是我們進一步需要掌握的。
由於沒有資料檔案,就建立了乙個haha.txt ,裡面存放10萬個隨機數。
結果
大資料處理之(top k)
top k 簡介 在大量資料中找出重複次數最多的前k個。問題分析 聽起來這個問題十分簡單,只需對這些資料進行一次排序即可得到前k個。如果這樣的話,首先得定義乙個資料結構來儲存這些資料,大量的資料會消耗過大的程序資源,甚至 耗盡 程序的資源。還有乙個問題是排序的時間複雜度是非常高的,一般來說,較快的排...
大資料處理
大資料處理的流程主要包括以下四個環節 採集 匯入 預處理 統計 分析 挖掘,下面針對這四環節進行簡單闡述。大資料處理之一 採集 在大資料的採集過程中,其主要特點和挑戰是併發數高,因為同時有可能會有成千上萬的使用者來進行訪問和操作,比如火車票售票 和 它們併發的訪問量在峰值時達到上百萬,所以需要在採集...
資料結構之雜湊(hash)表
最近看php陣列底層結構,用到了雜湊表,所以還是老老實實回去看結構,在這裡去總結一下。這裡先說一下雜湊 hash 表的定義 雜湊表是一種根據關鍵碼去尋找值的資料對映結構,該結構通過把關鍵碼對映的位置去尋找存放值的地方,說起來可能感覺有點複雜,我想我舉個例子你就會明白了,最典型的的例子就是字典,大家估...