蓄水池抽樣及Google搜尋之星分析
今日面試題,蓄水池抽樣,又稱隨機抽樣問題,表示如下:
要求從N個元素中隨機的抽取k個元素,其中N無法確定。
這種應用的場景一般是資料流的情況下,由於資料只能被讀取一次,而且資料量很大,並不能全部儲存,因此資料量N是無法在抽樣開始時確定的;但又要保持隨機性,於是有了這個問題。所以搜尋網站有時候會問這樣的問題。
這裡的核心問題就是“隨機”,怎麼才能是隨機的抽取元素呢?我們設想,買彩票的時候,由於所有彩票的中獎概率都是一樣的,所以我們才是“隨機的”買彩票。那麼要使抽取資料也隨機,必須使每一個資料被抽樣出來的概率都一樣。
Google 搜尋之星分析
題目:
給你一天的Google搜尋日誌,你怎麼設計演算法找出是否有一個搜尋詞,它出現的頻率佔所有搜尋的一半以上?如果肯定有一個搜尋詞佔大多數,你能怎麼提高你的演算法找到它?再假定搜尋日誌就是記憶體中的一個陣列,能否有O(1)空間,O(n)時間的演算法?
分析:
首先要看清題目,說的是“一半以上”,“大多數”,"majority",也就是大於50%。
很多情形下,尤其在面試比較緊張的情形下,經常會下意識的很快得出一個如下的方法(這個沒有錯,能有解決方案勝於完全沒想法)。定義一個雜湊表,裡面存放陣列裡面的每個元素以及出現的次數。可以通過兩個過程來做。
第一步是對映,將每個元素放進去,存在加一,不存在置一。同時統計元素個數。
第二步是遍歷整個雜湊表,判斷是否找到出現次數大於陣列長度一半的。如果有,找到。否則沒有。
顯然,這個要求O(n)的空間在儲存雜湊表,並不理想。
另外的下意識的方法, 比如說,先將元素排序,然後再進行判斷。因為如果有大多數的話,取陣列中間點的那個元素即為所要找的那個。不過這種方法首先排序就需要O(NlogN)的時間複雜度,並不是很理想。
題中說到肯定有一個搜尋詞是大多數,這個條件可能蘊藏著提高的空間。
面試時,我們會經常寫下一個例子,手工做些運算,也許能找到好的方案。
比如,1,2,2,3,2,2,3 顯然2是多數元素 去除1,2,在2,3,2,2,3 中2仍是多數元素 去除1,3,在2,3,2,2,3 中2更是多數元素
再比如,1,3,2,3,2,2,3 顯然沒有多數元素 去除1,3,在2,3,2,2,3 中2成了多數
觀察結論:在原序列中去除兩個不同的元素後,那麼在原序列中的多數元素在新序列中還是多數元素。但新序列中的多數元素在原序列不一定是多數,所以需要驗證。但原題說是肯定有多數,所以我們可以忽略驗證。
基於這個觀察,假設我們一開始從陣列的開頭,碰到某個元素的時候,就設定該元素為當前元素。當前出現的次數為1,後面,如果接著碰到的元素和該元素相同,則當前次數加1,否則減1。如果當前出現的次數為0,則表示當前元素不確定。如果結合我們有大多數元素這個前提的話,必然最後的結果是大於0的,而且最終獲取到的值就是大多數元素。
對於這個大多數演算法(Majority Algorithm), 國外有教授有研究並發表論文:《MJRTY - A Fast Majority Vote Algorithm》
本文來自微信:待字閨中,7月3日釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 又見Google搜尋之星;及須彌之境分析Go
- 熟悉的陌生人;及又見Google搜尋之星分析Go
- C# 蓄水池抽樣C#
- Google面試題搜尋之星和最多連續數的子集答案Go面試題
- Google搜尋大法Go
- Google搜尋API?GoAPI
- Google搜尋技巧Go
- LeetCode 398 Random Pick Index(蓄水池抽樣典型例題)LeetCoderandomIndex
- 快速使用Google搜尋Go
- GOOGLE搜尋祕籍Go
- google搜尋語法Go
- Google推出面部搜尋Go
- 諷刺&Google搜尋APIGoAPI
- Google搜尋指令大全(最新整理)Go
- 黃了。Google中國版搜尋Go
- Google的個性化搜尋Go
- Google 按圖搜尋的原理Go
- 使用Google百度等搜尋引擎的常用搜尋技巧Go
- 用Python寫演算法 | 蓄水池演算法實現隨機抽樣Python演算法隨機
- 2020.12.21-2020.12.27 leetcode刷題總結(拓撲排序&蓄水池抽樣&二叉搜尋樹&線段樹)LeetCode排序
- 轉:google搜尋聯盟與adsense搜尋廣告的區別Go
- Think with Google:印度搜尋洞察報告Go
- 如何使用GOOGLE高階搜尋技巧Go
- python抓取google搜尋結果PythonGo
- google圖書搜尋上線了~~Go
- 微軟挑戰Google 改道垂直搜尋微軟Go
- Google桌面搜尋:很好很強大!Go
- 深度優先搜尋(DFS)思路及演算法分析演算法
- 【JavaScript學習筆記】呼叫google搜尋JavaScript筆記Go
- google搜尋你想知道的東西Go
- Mashable:Google搜尋背後的資料Go
- 轉貼:google搜尋原理論文1Go
- google可以搜尋電子圖書了Go
- 【資料結構與演算法】蓄水池抽樣演算法(Reservoir Sampling)資料結構演算法
- 搜尋引擎原理及使用
- Google:24%的美國旅行者通過搜尋引擎搜尋住宿資訊Go
- 搜尋模組功能分析
- 廣度優先搜尋(BFS)思路及演算法分析演算法