查詢提示;及重排陣列分析

紫鳳發表於2013-08-28

今日面試題:查詢提示

搜尋引擎的查詢提示(suggestion)是非常重要的一個功能。現在給定查詢列表,以及每一個查詢對應的頻率。請設計一種查詢提示的實現方案,要兼顧效果和速度。如果有其他更好的優化點,請給出詳細說明。

==========================================

重排陣列分析

原題

有原陣列S和目標陣列T兩個陣列,它們分別是0-n-1 n個數字的某一種排列的結果。

請給出程式,完成從S到T的變換,注意:只允許使用一種操作:陣列中的其他元素可以0交換。

例如:S={0,1,2},T={0,2,1}。變換過程中,只允許1和2於0進行交換。

下面是一種可行方法:{0,1,2}=>{2,1,0}=>{2,0,1}=>{0,2,1}

分析

這個題目還是比較有意思的:至於與0進行不斷的交換,並且沒有要求採用最少的變換。

要變換到T陣列,就要知道S陣列中的值,再T陣列中的位置。則有P陣列,P[s]表示,T陣列中值s的位置, 用p0表示0的位置。如,對於T={0,2,1}而言,P陣列如下:

enter image description here

則對S陣列進行掃描,找到第一個於T陣列中相應數字不相等的數a,a不為0,

enter image description here

則a=1,位置為index。查詢P,a在T中的位置為2。如果要把a換到2的位置,則要先把2的位置中的元素換走,及首先swap(S[p0], S[P[a]]),然後swap(S[index], S[p0])。此時p0已經更新為S[P[a]]。兩次交換,即找到a=1的最終位置。

得到如下的表格:

enter image description here

重複掃描S陣列,找到第一個不相同的元素,a=2,位置為index,查詢P[a]=0,則表明,直接swap(S[index],S[p0])即可。

最終得到:

enter image description here

上面的思路,是首先考慮在目標陣列中的位置,那把原來陣列中的這個位置的騰出來,即可。同樣的,也可以反過來考慮,思路是相同的,大家可以自己畫畫表格。 如果這個題目,進一步問,要使用最少的交換次數,該如何處理呢?按照如下方式構造圖

陣列中的n個元素的每一種排列方式,都是圖中的一個節點

如果一個節點所代表的排列方式,通過題目中的一次變換,可以得到另一個節點,則兩個節點之間,存在一條邊

剩下就是求圖中最短路徑。具體過程,留給大家了。

大家可以進一步思考,這個題目,還有優化空間麼?還有更加巧妙的方法麼?希望看到大家的分享。

【分析完畢】

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

相關文章