您好,登錄后才能下訂單哦!
中途相遇法,這是一種特殊的算法,大體思路是從兩個不同的方向來解決問題,最終“匯集”到一起。“雙向廣度優先搜索”算法就有一點中途相遇的味道。
下面我們通過一道具體的題目,來了解一下這種算法思想的應用。
和為0的4個值(4 Value Whose Sum is Zero,ACM/ICPC SWERC 2005,UVa 1152)
給定4個n(1<=n<=400)元素集合A,B,C,D,要求分別從中選取一個元素a,b,c,d,使得a+b+c+d=0。問有多少種選法?
例如,A={-45,-41,-36,26,-32},B={22,-27,53,30,-38,-54},C={42,56,-37,-75,-10,-6},D={-16,30,77,-46,62,45},則有5中選擇法:(-45,-27,42,30),(26,30,-10,-46),(-32,22,56,-46),(-32,30,-75,77),(-32,-54,56,30)。
分析如下:
我們最容易想到的就是寫一個四重循環枚舉a,b,c,d,看看加起來是否等于0,時間復雜度為O(n^4),超時。一個稍好的方法就是枚舉a,b,c,則只需要再集合D里面找找是否有元素-a-b-c,如果存在,則方案加1.如果排序后使用二分查找則算法可以適當優化。
把剛才的方法加以推廣就可以得到一個更快的算法:首先枚舉a,b,把所有的a+b記錄下來存放在一個有序數組里,然后枚舉c,d,看看有多少種方法寫成a+b的形式。這里就用到了“中途相遇“的思想。但如果數據量較大,以上所述算法也可能會超時。所以,在此處,小編推薦一種更高效的實現方法,就是把a+b放在自己實現的一個哈希表里。這樣,就可以適當程度上優化算法。
由于,此博文重在通過一道簡單的例題講述”中途相遇“的思想,重點不在次例題的具體實現算法上。所以,此處沒有寫出具體的實現代碼。小編建議讀者,親自試一下此博文中提到的幾種思想,以便于讓自己對執行效率有更加清楚的認識。
由于小編水平有限,歡迎讀者發現錯誤,并提出錯誤,小編一定積極改正。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。