100000個數找出最小或最大的10個

  • 大體思路:
    1. 首先一點,對於海量數據處理,思路基本上是確定的,必須分塊處理,然後再合併起來。
    2. 對於每一塊必須找出10個最大的數,因爲第一塊中10個最大數中的最小的,可能比第二塊中10最大數中的最大的還要大。
    3. 分塊處理,再合併。也就是Google MapReduce 的基本思想。Google有很多的服務器,每個服務器又有很多的CPU,因此,100億個數分成100塊,每個服務器處理一塊,1億個數分成100塊,每個CPU處理一塊。然後再從下往上合併。注意:分塊的時候,要保證塊與塊之間獨立,沒有依賴關係,否則不能完全並行處理,線程之間要互斥。另外一點,分塊處理過程中,不要有副作用,也就是不要修改原數據,否則下次計算結果就不一樣了。
    4. 上面講了,對於海量數據,使用多個服務器,多個CPU可以並行,顯著提高效率。對於單個服務器,單個CPU有沒有意義呢?
        也有很大的意義。如果不分塊,相當於對100億個數字遍歷,作比較。這中間存在大量的沒有必要的比較。可以舉個例子說明,全校高一有100個班,我想找出全校前10名的同學,很傻的辦法就是,把高一100個班的同學成績都取出來,作比較,這個比較數據量太大了。應該很容易想到,班裏的第11名,不可能是全校的前10名。也就是說,不是班裏的前10名,就不可能是全校的前10名。因此,只需要把每個班裏的前10取出來,作比較就行了,這樣比較的數據量就大大地減少了。
  • 對每個分塊怎麼處理:
    1. 如果是找到最大的10個元素,則用大小爲10的最小堆,先將10個元素放入其中,之後從第11個元素開始,如果比根元素小,就丟棄,如果比根元素大,那麼就丟棄根元素,將新元素加入。
    2. 如果是找到最小的10個元素,同理。
    3. 最後將每一塊再進行合併。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章