topk elements 問題用於找出一組數中最大的 k 個的數。
此外還有一種叫 kth element 問題,用於找出一組數中第 k 大的數。
其實要求解 topk elements,可以先求解 kth element,因為找到 kth element 之後,再遍歷一遍,大於等於 kth element 的數都是 topk elements。
方法1:
經典演算法之快速選擇演算法
相信快速排序演算法這種經典的演算法大家並不陌生。但是基於快速演算法的各種變形,你了解嗎?
其中很重要的一種變形就是快速選擇演算法, 通常用來在未排序的陣列中尋找第k小/第k大的元素。快速選擇及其變種是實際應用中最常使用的高效選擇演算法。
快速選擇的總體思路與快速排序一致,選擇乙個元素作為基準來對元素進行分割槽,將小於和大於基準的元素分在基準左邊和右邊的兩個區域。不同的是,快速選擇並不遞迴訪問雙邊,而是只遞迴進入一邊的元素中繼續尋找。這降低了平均時間複雜度,從o(
nlog
n)至o(n
),不過最壞情況仍然是o(n2
)。 方法2:
維護乙個大小為 k 的最小堆,堆頂元素就是 kth element。
使用大頂堆來維護最小堆,而不能直接建立乙個小頂堆並設定乙個大小,企圖讓小頂堆中的元素都是最小元素。
維護乙個大小為 k 的最小堆過程如下:在新增乙個元素之後,如果大頂堆的大小大於 k,那麼需要將大頂堆的堆頂元素去除。
這也是最常見的
使用 hashmap 進行頻率統計,然後使用快速選擇或者堆的方式找出頻率 topk。在海量資料場景下,也是使用先拆分再整合的方式來解決空間問題。
維護 d*w 大小的二維統計陣列,其中 d 是雜湊函式的個數,w 根據情況而定。
該演算法的思想和布隆過濾器類似,具有一定的誤差,特別是當 w 很小時。但是它能夠在單機環境下解決海量資料的頻率統計問題。
trie 樹可以用於解決詞頻統計問題,只要在詞彙對應節點儲存出現的頻率。它很好地適應海量資料場景,因為 trie 樹通常不高,需要的空間不會很大。
分布式情況下如何利用分布的計算資源來進行詞頻統計
把這堆牌分配給多個玩家;
讓每個玩家統計自己手中有多少張黑桃;
把所有玩家統計的黑桃數量加起來就是最終的結果。
某些計算任務能夠並行地進行,這些任務可拆分並且不能有資料依賴。例如斐波那契數列 f(n) = f(n-1) + f(n - 2),第 n 項的計算依賴於第 n - 1 項和第 n - 2 項的計算結果,因此就不能並行。但是對於將乙個二維陣列中每個元素都進行加 1 的計算,每個元素的計算都沒有資料依賴,因此能夠並行。
mapreduce 用來對海量資料進行離線分析,通過將計算任務分配給集群的多台機器,使得這些計算能夠並行地進行。
它分為 map 和 reduce 兩個階段:
在下圖中,
shuffle 過程主要是對 map 階段輸出的鍵值對進行整合,將鍵相同的鍵值對整合到一組中,得到 [k2, ] 的整合資料,作為 reudce 階段的輸入。
reduce 處理完之後得到 [k3, v3] 鍵值對,hadoop 會將輸出的資料存到分布式檔案系統 hdfs 中。
the weather is good
today is good
good weather is good
today has good weather
split-0: [0, "the weather is good]
split-1: [1, "today is good"]
split-2: [2, "good weather is good"]
split-3: [3, "today has good weather]
將輸入的字串 v1 進行切分,輸出 k2 為單詞, v2 為詞頻。
排序並將擁有相同鍵的資料整合,得到 [k2, ]。
["good", ]
["has", ]
["is", ]
["the", ]
["today", ]
["weater", ]
遍歷 shuffle 階段輸出的 集合,進行最終的統計。
reducer-0: ["good", 5]
reducer-1: ["has", 1]
reducer-2: ["is", 3]
reducer-3: ["the", 1]
reducer-4: ["today", 2]
reducer-5: ["weather", 3]
cyc20 大資料零基礎學習框架Hadoop HDFS
hadoop檔案系統使用分布式檔案系統設計開發。它是執行在普通硬體。不像其他的分布式系統,hdfs是高度容錯以及使用低成本的硬體設計。hdfs擁有超大型的資料量,並提供更輕鬆地訪問。為了儲存這些龐大的資料,這些檔案都儲存在多台機器。這些檔案都儲存以冗餘的方式來拯救系統免受可能的資料損失,在發生故障時...
大資料零基礎入門學習之Hadoop技術優缺點
hadoop的優點 1 hadoop具有按位儲存和處理資料能力的高可靠性。2 hadoop通過可用的計算機集群分配資料,完成儲存和計算任務,這些集群可以方便地擴充套件到數以千計的節點中,具有高擴充套件性。3 hadoop能夠在節點之間進行動態地移動資料,並保證各個節點的動態平衡,處理速度非常快,具有...
大資料零基礎入門學習之Hadoop技術優缺點
hadoop的優點 1 hadoop具有按位儲存和處理資料能力的高可靠性。2 hadoop通過可用的計算機集群分配資料,完成儲存和計算任務,這些集群可以方便地擴充套件到數以千計的節點中,具有高擴充套件性。3 hadoop能夠在節點之間進行動態地移動資料,並保證各個節點的動態平衡,處理速度非常快,具有...