1. 程式人生 > >常見大資料和空間限制面試題

常見大資料和空間限制面試題

過濾100億黑名單

題目

假設有100億個URL的黑名單,每個URL最多佔用64B,設計一個過濾系統,判斷某條URL是否在黑名單裡。

要求

不高於萬分之一的判斷失誤率;額外記憶體不超過30GB

答案

100億個64B的URL需要640GB的記憶體,顯然直接存雜湊表不合理。考慮布隆過濾器,假設有一個長度為m的bit型別陣列
輸入階段:
有k個雜湊函式,函式的輸出域S大於或等於m,假設雜湊函式彼此獨立,對於同一個輸入(以字串表示的URL),經過k個雜湊函式的計算結果也是相互獨立。對計算的每一個結果Mod m,將bit array上對應的位置置1,
一個輸入物件會將bitmap某些位置塗黑,處理完所有輸入物件,會將bitmap相當多位置塗黑,至此,布隆過濾器生成完畢,代表之前所有輸入物件的集合。

20億個數中出現最多的數

問題

包含20億個全是32位整數的大檔案,在其中找出出現次數最多的數。

要求

記憶體限制:2GB

答案

將20億個數用hash函式分成16個檔案。然後統計每個小檔案中,哪個數字出現次數最多。最後再比較每個小檔案的次數最多的數。(本題分成16個也是根據題目來的。考慮最極端情況。20億個數都不同)32位的整數要佔4b,key佔4b,value佔4b。共8b。記憶體只有2G。所以大概每個小檔案存2億條。就需要10個小檔案。但是hash函式必須2的n次方。所以2的4次方。16個

40億個數找沒出現的數

問題

有一個包含40億個無符號整數的檔案,最多使用1GB記憶體,找到所有沒出現的數

分析

最差情況,40億個數都不同,雜湊表儲存出現過的數,需要記憶體4B*40億,大約16GB記憶體。

答案

使用bitmap,申請一個長度為4294967295bit型別的bitArray,每個位置只表示0或1,該陣列佔用空間約500MB。遍歷這20億個數,例如遇到7000,就將bitArray[7000]置1。遍歷完成後,再依次遍歷bitArray,哪個位置沒有置1,哪個數就不在40億個數中。

40億個數找第一個沒出現的數 。記憶體只有10M

答案

具體的,第一次遍歷,申請長度64的整形陣列countArr[0…63],統計每個區間計數增加。例如,當前數是34225522090,34225522090/67108864=51,countArr[51]++。遍歷完之後,必定有一個countArr[i]小於67108864,表示i區間內至少有一個數沒出現過。此時countArr[]使用的記憶體是64*4B。

假設在37區間有一個數沒出現,申請一個長度為67108864的bitmap,記憶體大約8MB,記為bitArr[0~67108863]。再一次遍歷40億個數,只關心37區間的數,記為num。將bitAry[num-67108864*37]的值置位1。遍歷完之後,bitArr必然有沒有置1的位置,記為i,則67108864*37+i就是沒出現過的數。

找出100億個重複URL以及搜尋詞彙topK問題

問題

有一個包含100億URL的大檔案,每個URL佔64B,找出重複URL;補充,找出top100搜尋詞彙

常規答案

  1. 大檔案通過雜湊函式分配到不同機器
  2. 雜湊函式將大檔案拆分成小檔案。
    對於每一個小檔案,利用雜湊表遍歷,找出重複的URL,或者分給機器或拆分檔案完之後,進行排序,看是否有重複的URL。

補充問題的思路也是通過雜湊函式分流,對於每個小檔案,簡歷詞頻雜湊表,建一個大小為100的小根堆,選出每個小檔案的top100.每個小檔案的top100進行外排序或者接著使用小根堆,就能得到100億資料的top100.

出現兩次的數以及中位數問題

問題

有40億個無符號32位整數,最多可以使用1GB記憶體,找出所有出現了兩次的數;補充問題,最多使用10MB記憶體,找到40億個數的中位數

答案

第一個問題可以用bitmap做,申請長度為2?232bit的bitArr,2個bit表示一個數出現的詞頻。遍歷40億個數,假設出現num,將bitArr[2*num]和bitArr[2*num+1]設定為01,第二次出現,設定為10,第三次,設定為11。以後再遇到11的,就不做處理。遍歷完成後,再遍歷一次,若發現bitArr[2*num]和bitArr[2*num+1]是10,則num是出現了兩次的數。

第二個問題,分割槽間討論。長度為2MB的unsigned int陣列佔用8MB,將區間數目定位232/2M,取整為2148個區間,第0區間0~2M-1,第i區間2M*i~2M*(i+1)-1

申請一個長度為2148的unsigned int整數陣列arr[0..2147],arr[i]表示i區間有多少個數,arr佔用記憶體小於10MB。遍歷40億個數,當前數num為num,落在區間(num/2M),對應arr[num/2M]++。累加統計每個區間的累計數目,就能找到40億個數的中位數。例如0~K-1區間數目個數為19.998億,加上第K個區間就超過了20億,說要中位數一定在K區間中,並且一定是第K區間的第0.002億個數。

接著申請長度2M的unsigned int陣列countArr[0..2M-1],佔用8MB。遍歷40億個數,只關心第K區間的數numi,countArr[numi-K*2M]++。統計完之後在第K區間找地0.002億個數字即可。

一致性雜湊

分散式資料庫叢集快取,例如memcached,將資料的id通過雜湊函式轉換為key,假設有N個機器,計算key%N,得到及其所屬編號,增刪改查都在這臺機器上。一致性雜湊能在機器擴容(N發生變化),使得不用重新計算一遍key%N

三臺機器處於雜湊環,id通過雜湊對映為key,在雜湊環中順時針找距離最近的機器。

機器較少的時候可能會出現負載不均衡,如圖所示:

答案

引入虛擬節點,增加結點數

相關推薦

常見資料空間限制試題

過濾100億黑名單 題目 假設有100億個URL的黑名單,每個URL最多佔用64B,設計一個過濾系統,判斷某條URL是否在黑名單裡。 要求 不高於萬分之一的判斷失誤率;額外記憶體不超過30GB 答案 100億個64B的URL需要640GB

資料每日默寫(試題)整理(持續更新)

2018.10.22 1.抽象類與介面的區別? 1.語法層面上的區別   1)抽象類可以提供成員方法的實現細節,而介面中只能存在public abstract 方法;   2)抽象類中的成員變數可以是各種型別的,而介面中的成員變數只能是public static final型別的;   3)

資料結構】【試題】找N個數據中最的K個數據

    如果不限定條件的話,這個問題還是很好解決的,但是當我們要求時間複雜度為O(N),空間複雜度為O(1)時,問題就沒那麼好解決了。    簡單的思路就是,建立一個大小為K=100的小堆,調整好,然後

資料結構】佇列&棧佇列的試題

佇列 只允許在一端(隊尾)進行插入資料操作(入佇列),在另一端(對頭)進行刪除資料操作(出佇列)的特殊線性表 對於順序佇列,若採用隊頭不動,出佇列要移動隊頭後的所有元素;若移動出佇列後向後移動隊頭,會造成“假溢位” 若採用取模迴圈法來實現迴圈佇列,又需要解決新的

資料結構--棧佇列的試題

實現一個棧,要求實現Push(出棧)、Pop(入棧)、Min(返回最小值)的時間 複雜度為O(1) 方法1、棧Push時:當棧為空時,push兩次第一個資料。棧頂的數來儲存當前狀態的最小值。 再次Push資料時候,先拿將要Push的資料與棧頂的最小值進行比較,更

入我新美的Java後臺開發試題總結

情況 查詢優化 做什麽 工作 我認 人的 方便 xpl 別人   靜兒最近在總結一些面試題,那是因為做什麽事情都要認真。面試也一樣,靜兒作為新美大金融部門的面試官,負責任的告訴大家,下面的問題回答不上來,面試是過不了的。不過以下絕不是原題,你會發現自己實力不過硬,最終肯定是

互聯網企業Java試題匯總,看我如何成功拿到百度的offer

ati nta 評價 可能 代碼 context 最好 alt ice 前言 本人Java開發,5年經驗,7月初來到帝都,開啟面試經歷,前後20天左右,主面互聯網公司,一二線大公司或者是融資中的創業公司都面試過,拿了一些offer,其中包括奇虎360,最後綜合決定還是去百

阿裏、網易騰訊試題 C/C++

不同的 三次握手 進程組 HR 是什麽 ret 區分 point 兩個 一、線程、鎖 1、Posix Thread互斥鎖 線程鎖創建 a.靜態創建 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; b.動態創建 pt

神奇的C語言,這才是C語言牛操作,作為試題,怕是秒殺眾人

想想 自己 初始 fun 怎麽 指向 都是 計算 換行 當然下面列出來的幾點都是C的基礎用法,只不過是這些用法可能平時不會被註意。所以很多東西第一次看到的時候,可能會覺得很怪異,但是細細想想就能很好的理解,也就能更好的清楚C語言的一些特性。但是在具體的編碼過程當中,我還是希

大數據學習資料,大數據試題分享

性能調優 客戶 內存 貝葉斯 運行原理 項目 常見 reg oop 大數據學習資料,大數據面試題分享: 1、 針對每場面試來說必問的一個問題:自我介紹。 2、講述HDFS上傳文件和讀文件的流程 3、HDFS在上傳文件的時候,如果其中一個塊突然損壞了怎麽辦 4、NameNod

Java面試:投行的15個多線程並發試題

寫入 tex 等等 arm 就是 通過 並發 競態 undle 多線程和並發問題已成為各種 Java 面試中必不可少的一部分。如果你準備參加投行的 Java 開發崗位面試,比如巴克萊銀行(Barclays)、花旗銀行(Citibank)、摩根史坦利投資公司(Morgan S

資料雲端計算技術週報(第8期):NoSQL特輯

寫在第8期特輯 “大資料” 三個字事實上是個marketing語言,從技術角度看,包括範圍非常廣。計算、儲存、網路都涉及。 為了滿足眾多同學學習和工作的須要。後面社群依據情況逐漸推出專門的分類集錦。希望大家喜歡! 究竟什麼是NoSQL?公眾號一系列

hashCodeequals的試題

hashCode和equals的面試題  /*   *   兩個物件  Person  p1 p2   *   問題: 如果兩個物件的雜湊值相同 p1.hashCode()==p2.hashCode

SSHSSM框架試題

SSH和SSM框架面試題 僅用於自己學習筆記,有錯誤請指出 1、Struts2的執行流程是什麼 瀏覽器向伺服器發起請求,請求被提交到web.xml前端過濾器 前端過濾器解析出請求的路徑,再根據struts.xml中的action配置,決定將請求交給那個方法來進行處

讀書印記 - 《智慧時代:資料智慧革命重新定義未來》

這本書所謂的智慧,主要是指依靠資料尤其是大資料實現的智慧,所以關於大資料方面佔主要篇幅而我非想象中的智慧方面,書名難說非常合理。不過現在人工智慧的主要突破來自資料驅動方向,這可能也確實是事實。書裡提到的一些小故事很有趣。搜尋引擎演化到現在,“點選資料……在搜尋排序中佔70%-80%的權重”“如果一家公司能夠在

常見的 易混淆 Java 基礎試題

1、說說&和&&的區別。 &和&&都可以用作邏輯與的運算子,表示邏輯與(and),當運算子兩邊的表示式的結果都為true時,整個運算結果才為true,否則,只要有一方為false,則結果為false。 &&還具有短路的功能,即如果第

一道關於js聲明變量,varlet的試題

引用 str spa 聲明 但是 strong ole 聲明變量 結果 1 function aa(flag) { 2 // var test // 變量提升,函數最頂部 3 if(flag) { 4

傳統遇上現代科技,資料人工智慧的醫療應用【楚才國科】

近年來,人工智慧已經成為熱詞,從製造業、智慧家居、交通,教育到醫療,人工智慧的迅速發展已經不斷在提高人們的生活水平。在多檔科技節目的推動下,如《機智過人》、人工智慧交流群 862729908《我是未來》等等,包括青少年都在關注! 那麼將大資料和人工智慧與我們中醫相結合,這又會擦出怎樣的火花呢

資料機器學習有什麼區別

大資料的定義 大資料(big data),指無法在一定時間範圍內用常規軟體工具進行捕捉、管理和處理的資料集合,是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力的海量、高增長率和多樣化的資訊資產。 大資料是一個籠統的概念暫未發現和準確的定義。 大資料的核心是利用資料的價值,機器學

公司後端開發試題總結

2、Java記憶體模型: Java虛擬機器規範中將Java執行時資料分為六種。 1.程式計數器:是一個數據結構,用於儲存當前正常執行的程式的記憶體地址。Java虛擬機器的多執行緒就是通過執行緒輪流切換並分配處理器時間來實現的,為了執行緒切換後能回覆到正確的位置,每條執行緒都需要一個獨立的程式