演算法分析與設計實踐大作業

2021-10-07 05:36:10 字數 1073 閱讀 4043

圓排列問題:給定n個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,求具有最小排列長度的圓排列。

首先,已知圓的個數n以及記錄各圓半徑的陣列r[i],i=1~n ,記錄各圓圓心橫座標的陣列x[i],i=1~n。要記錄最短排列長度minlen,最終求出排列順序。要注意,只要大小合適,目標圓就有可能與排列中的任意乙個圓相切。要求x[n]時,要從前往後的一一比較,先得到x[1]+a1的值,再得到x[2]+a2的值……一直到x[n-1]+an-1的值,與上一次的值相比較,若距離更大則更新,否則不做處理。

圓排列的解空間是一棵排列樹。假設有n個圓排列:1,2,3……n。只要計算出n!/2種排列:

所以,只要知道第乙個和第n個位置的數,那麼排列時,就只剩下第2個到第n-1個位置。

另外,如果有m個圓的半徑相同,那麼交換後總長度也相同,所以只要計算乙個。

如果有n個圓,前m個已經排好位置,那麼還有n-m個待排序定位。當搜尋到第m+1個圓時:

兩個長度相加就是新的最短長度。

求每個圓的圓心座標:

計算當前圓排列的長度:

回溯:

時間複雜度:

在回溯演算法中,搜尋子結點的時間複雜度是o(n!)次,而backtrack()函式每次計算需要o(n)計算時間,從而整個演算法的計算時間複雜性為o((n+1)!)。

空間複雜度:

由於r陣列,x陣列的大小都為n,故空間複雜度為o(n)。

演算法分析與實踐 大作業

給定n個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,求具有最小排列長度的原序列。一般而言我們會想到這種做法 但是這種只是其中一種,我們並沒有考慮完全,還有一些如 小球本來可以放到兩個大球的中間,不增加長度的 這個就類似於最短路的問題,由此我們想到了回溯演算法。開始時設a r1,r2,rn ...

演算法分析與設計實踐 大作業 圓排列問題

給定n個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,求具有最小排列長度的圓排列。圓排列問題的解空間是一棵排列樹。按照回溯法搜尋排列樹的演算法框架,設開始時a r1,r2,rn 是所給的n個元的半徑,則相應的排列樹由a 1 n 的所有排列構成。定義乙個函式center 來計算圓在當前圓排列中...

演算法分析與實踐 大作業 圓排序問題

圓排列問題 給定n個圓的半徑序列,將它們放到矩形框中,各圓與矩形底邊相切,求具有最小排列長度的圓排列。圓排列問題主要用到了回溯法。問題的解空間是一棵排列數。按照回溯法遍歷每種排列,求得最小排列長度的最優解。變數n為圓的個數 陣列r n 儲存每個圓的半徑,x n 儲存每個圓的圓心座標,bestr n ...