又見Google搜尋之星;及須彌之境分析

紫鳳發表於2013-07-22

今日面試題:又見Google搜尋之星

給定一批查詢日誌,數量為n。其中,有的查詢出現了多於n/3次,請線上性時間內,找到所有滿足條件的查詢。

須彌之鏡面試題分析

原題:

有k個有序的陣列,請找到一個最小的數字範圍。使得這k個有序陣列中,每個陣列都至少有一個數字在該範圍中。

例如:

1: 4, 10, 15, 24, 26

2: 0, 9, 12, 20

3: 5, 18, 22, 30

所得最小範圍為[20,24],其中,20在2中,22在3中,24在1中。

分析:

遇到一個題目,我們要通過分析找到突破口。這個題目的突破口是什麼呢?其實比較好找。就是“有序”,而且k個陣列都是有序的,那麼我們腦海裡就會浮現出各種可以嘗試的方法:可以對有序的陣列進行二分查詢、可以對多個有序的陣列進行歸併排序,生成一個有序的陣列等等。

那這個題目選擇哪個方法繼續嘗試呢?那我們再分析一下要解決的問題。找到一個最小的範圍,每一個有序陣列中,都至少有一個元素在這個範圍中。找到這樣一個範圍並不難,可是如何確定最小的範圍呢?最終得到的最小的範圍,至少包含三個元素,並且在所有陣列整體的排序中,是相鄰的。假設最小範圍是[a, b, c],a < b < c。 c-a是最小的。並且,a,b,c來自不同的有序陣列。還有一種情況是[a,b,d,c],a,b,c不是緊鄰的,中間有一個d即: a< d < c。這時,d只能是來自b所在的陣列,如下分析:

d來自a所在的陣列,那麼應有更短的範圍c - d

d來自c所在的陣列,那麼應有更短的範圍d - a

d來自b所在的陣列,範圍大小是不變的,就是無論是考慮d,還是考慮b。都沒有影響。

從上面的分析,我們得出,只需要考慮在最終的排序中,考慮鄰近的、並且來自不同有序陣列的元素,作為備選的範圍。那麼該怎麼樣做到只考慮臨近的、並且來自不同的有序陣列的元素呢?這裡就用到了歸併排序的思想。以原題中的例子為例,假設有三個指標指,p1,p2,p3,分別指向三個陣列的第一個元素:

步驟 指標當前值 最大值 最小值 min_range_value 移動指標
1 4,0,5 5 0 5 p2
2 4,9,5 9 4 5 p1
3 10,9,5 10 5 5 p3
4 10,9,18 18 9 9 p2
5 10,12,18 18 10 8 p1
6 15,12,18 18 12 6 p2
7 15,20,18 20 15 5 p1
8 24,20,18 24 18 6 p3
9 24,20,22 24 20 4 p2
end

結束是因為第二個陣列已經沒有元素可以再進行遍歷了。最終得到最小的min_range_value為4,即為題目例子的答案。

上面這個方法,通過歸併排序的思想,確保每次都是k個來自不同的陣列的元素進行比較,得到最大值、最小值。就可以得到一個範圍,包含了所有陣列中的數字。

這個題的著名變種是從網頁中產生包含所有查詢詞的最小的摘要。如果你 面過Google,你應該聽說過這題。

本文來自微信:待字閨中,2013-07-17釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章