查詢提示;及重排陣列分析
今日面試題:查詢提示
搜尋引擎的查詢提示(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陣列如下:
則對S陣列進行掃描,找到第一個於T陣列中相應數字不相等的數a,a不為0,
則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的最終位置。
得到如下的表格:
重複掃描S陣列,找到第一個不相同的元素,a=2,位置為index,查詢P[a]=0,則表明,直接swap(S[index],S[p0])即可。
最終得到:
上面的思路,是首先考慮在目標陣列中的位置,那把原來陣列中的這個位置的騰出來,即可。同樣的,也可以反過來考慮,思路是相同的,大家可以自己畫畫表格。 如果這個題目,進一步問,要使用最少的交換次數,該如何處理呢?按照如下方式構造圖
陣列中的n個元素的每一種排列方式,都是圖中的一個節點
如果一個節點所代表的排列方式,通過題目中的一次變換,可以得到另一個節點,則兩個節點之間,存在一條邊
剩下就是求圖中最短路徑。具體過程,留給大家了。
大家可以進一步思考,這個題目,還有優化空間麼?還有更加巧妙的方法麼?希望看到大家的分享。
【分析完畢】
本文來自微信:待字閨中,2013-08-24釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 重排陣列;及消失的數字分析陣列
- 字母表;及查詢提示分析
- 陣列多重排序陣列排序
- 二維陣列查詢陣列
- JavaFX教程-查詢陣列Java陣列
- JavaScript --二維陣列查詢一維陣列JavaScript陣列
- 陣列的主元素查詢陣列
- Java陣列排序和查詢Java陣列排序
- js查詢陣列元素位置JS陣列
- 陣列使用find查詢用法陣列
- 陣列和;及此起彼伏分析陣列
- 二維陣列中的查詢陣列
- MongoDB之資料查詢(陣列)MongoDB陣列
- 陣列中查詢給定值陣列
- 燈;及陣列統計分析陣列
- MYSQL A、B表陣列關聯查詢MySql陣列
- MongoDB(12)- 查詢嵌入文件的陣列MongoDB陣列
- 【JZOF】二維陣列中的查詢陣列
- 【Java】陣列二分查詢元素Java陣列
- Javascript刷題 》 查詢陣列元素位置JavaScript陣列
- 糖果;及子串查詢分析
- 雙指標查詢陣列的連續規律子陣列問題指標陣列
- 又見排序;及陣列和分析排序陣列
- 陣列的查詢(搜尋):線性查詢和二分法查詢陣列
- 查詢陣列中第K大的元素陣列
- Mongodb內嵌陣列的完全匹配查詢MongoDB陣列
- MongoDB查詢(陣列、內嵌文件和$where)MongoDB陣列
- 九度 二維陣列中的查詢陣列
- 面試題——二維陣列中的查詢面試題陣列
- 慢查詢最佳化及分析
- mongodb索引及查詢優化分析MongoDB索引優化
- 陣列統計;及樹的高度分析陣列
- 【劍指offer】二維陣列中的查詢陣列
- 九度 1384 二維陣列中的查詢陣列
- mysql查詢語句陣列下標擷取MySql陣列
- 樹狀陣列模板題 & (樹狀陣列 1:單點修改,區間查詢)陣列
- L2-022 重排連結串列【陣列】陣列
- 【LeetCode-陣列】查詢大多數元素LeetCode陣列