測試算法階段學習成果

測試算法階段學習成果

針對入門的趣味書

《大話數據結構》

《算法圖解》

針對Python的是《數據結構與算法:Python語言描述》

清華 鄧俊輝 《數據結構(C++語言版) 第三版》

面試必刷的寶典

《劍指offer》

《編程珠璣》

《編程之美》

殿堂級經典書

《計算機程序設計藝術》

代碼GITHUB地址爲:< https://github.com/wangzheng0822/algo >

實戰測試題(一):

假設獵聘網有10W名獵頭顧問,每個獵頭顧問都可以通過做任務(比如發佈職位)來積累積分,然後通過積分來下載簡歷,如果你是獵聘網的一名工程師,如何在內存中存儲這10W名獵頭ID和積分信息,讓他支持幾個操作:

  • 根據獵頭的ID快速查找、刪除、更新這個獵頭的積分信息
  • 查找積分在某個區間的獵頭ID列表
  • 查找積分從小到大排在第X位的獵頭ID信息
  • 查找按照積分從小到大排在第X位到第y位之間的獵頭ID信息

相關章節:跳錶、散列表、紅黑樹

解析:

要通過ID來查詢,又要通過積分來查詢,所以對於獵頭這樣一個對象,需要將其組織成兩種數據結構,才能支持兩類操作,按照ID,將獵頭信息組織成散列表,這樣就可以根據ID信息快速的查找、刪除、更新獵頭的信息,按照積分將獵頭信息組織成跳錶,再將跳錶的每個索引結點中加入一個span字段,記錄這個索引結點到下一個索引結點的包含的鏈表結點的個數,這樣就可以利用跳錶索引,快速計算出排名在某一位的獵頭或者排名在某個區間的獵頭列表。或者可以直接利用Redis的有序集合完成

實戰測試題(二)

電商交易系統中,訂單數據很大,假設分了10個庫並存儲在不同的機器上,在不引入複雜分庫分表中間件的情況下,希望能夠快速的查詢金額最大的前K個訂單

  • 數據庫中,訂單表中金額字段上建有索引,可以通過select order by limit語句獲取數據庫中數據
  • 機器可用內存有限,只有幾百M剩餘可用內存
相關章節

排序、堆和堆排序、堆的應用

題目解析

藉助歸併排序中的合併函數,從每個數據庫中,通過select order by limit語句各取局部金額最大的訂單,把取出來的10個訂單放到優先級隊列中取出最大值,就是全局金額最大的訂單,然後再從這個全局金額最大的訂單對應的數據庫中,取出下一條訂單(訂單金額從大到小排序)然後放入優先級隊列中,直到找到金額前K個大訂單

數據庫讀取數據的性能是效率不高的問題,儘量減少SQL請求,每次多取一些數據,一次性不能取太多數據也不能太少數據,根據實際的硬件環境做benchmark測試找合適的

實戰測試題(三)

CPU資源是有限的,任務的處理速度與線程個數並不是線性正相關,相反,過多的線程反而會導致CPU頻繁切換,性能下降,線程池的大小需要綜合考慮要處理任務的特點和硬件環境事先設置的,當我們向固定大小的線程池中請求一個線程時,如果線程池中沒有空閒資源,這時線程池如何處理請求?拒絕請求還是排隊請求?

相關章節:隊列:隊列在線程池等有限資源池中的應用

題目解析

隊列可以用在任何有限資源池中,用於排隊請求,比如數據庫連接池中,大部分資源有限的場景,沒有空閒資源時候,都可以通過隊列來實現請求排隊

實戰測試題(四)

通過IP地址來查找IP歸屬地,在內存中有12W條這樣的IP區間與歸屬地的對應關係,如何快速定位IP地址的歸屬地?

相關章節:

二分查找

題目解析:

需要用到二分查找的變形算法,查找最後一個小於等於某個給定值的數據

實戰測試題(五)

設計一個簡單的海量圖片存儲系統,最大預期能夠存儲1億張圖片,並希望這個海量圖片存儲具有

  • 存一張圖片及其它的元信息,主要的元信息有:圖片名稱和一組tag信息,比如圖片名稱叫玫瑰花,tag信息是{紅色,花,情人節}
  • 根據關鍵詞搜索一張圖片,比如關鍵詞是“情人節”“花”“玫瑰花”
  • 避免重複插入相同的圖片,不能單純的使用圖片的元信息,來對比是不是同一張圖片

設計一個符合上面要求,操作高效,使用機器資源少的存儲系統

相關章節:

哈希算法

題目解析:

兩個功能,一是根據元信息的搜索功能,二是圖片判重

第一部分,藉助搜索引擎中的倒排索引結構 , 一個圖片對應一組元信息,比如玫瑰花對應{紅色,花,情人節},牡丹花對應{白色,花},將這個圖片與元信息之間的關係,倒置過來建立索引,“花”對應{玫瑰花,牡丹花},“紅色”對應{玫瑰花},“白色”對應{牡丹花},“情人節”對應{玫瑰花},當搜索“情人節 花”的時候拿兩個搜索關鍵詞分別在倒排索引中查找,“花”找到了{玫瑰花 牡丹花},“情人節”查找到了{玫瑰花},兩個關鍵詞對應的 結果取交集就是結果,第二部分關於圖片判重,基於圖片本身來判重,可以用哈希算法,對圖片內容取哈希值,對哈希值建立散列表,通過哈希值以及散列表快速判斷圖片是否存在

實戰測試題(六) ***

散列表的查詢效率跟散列函數、裝載因子、散列衝突有關係,如果散列表中有10W個數據,退化後的散列表查詢的效率下降了10W倍,如果之前運行100次查詢只需要0.1S,現在需要1W秒,可能因爲查詢操作消耗大量CPU或者線程資源導致系統無法響應其他請求,從而達到拒絕服務攻擊(DoS)的目的,這是散列表碰撞攻擊的基本原理

如何設計一個可以應對各種異常情況的工業級散列表,來避免在散列衝突的情況下,散列表性能的急劇下降,並能抵抗散列膨脹攻擊?

相關章節:

散列表

題目解析:

散列表是最常用的數據結構

img

初學者:

  • 自行分析專欄中大部分數據結構和算法時間、空間複雜度
  • 自己實現動態數組、棧、隊列
  • 輕鬆寫出經典鏈表題目代碼,比如鏈表反轉、求中間節點等 ***
  • 輕鬆寫出斐波那契、求階乘、歸併、快排、二叉樹遍歷、求高度、八皇后、揹包、DFS遞歸代碼
  • 寫各種排序算法、二分查找及其變體
  • 實現一個拉鍊發解決衝突的散列表
  • 實現二叉樹的三種遍歷算法、按層遍歷、求高度 ***
  • 實現堆、堆排序、掌握堆的三種應用(優先級隊列、TOP k、中位數)
  • 圖的三種表示方法(鄰接矩陣、鄰接表、逆鄰接表)
  • 實現廣度優先、深度優先搜索算法
  • 實現BF算法、RK算法
  • 實現一個位圖結構
  • 貪心、分治、回溯、動態規劃,實現Leetcode Medium難度的題目

列、TOP k、中位數)

  • 圖的三種表示方法(鄰接矩陣、鄰接表、逆鄰接表)
  • 實現廣度優先、深度優先搜索算法
  • 實現BF算法、RK算法
  • 實現一個位圖結構
  • 貪心、分治、回溯、動態規劃,實現Leetcode Medium難度的題目
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章