天天看點

分治法的基本思想_算法設計:分治法(開會等日程安排)

一、算法思路

1、思路

分治算法的思想是:對于一個規模為N的問題,若該問題可以容易解決(比如規模N較小),則直接解決,否則将其分解為M個規模較小的子問題,這些子問題互相獨立,并且與原問題形式相同,遞歸的解決這些子問題,然後将各子問題的解合并得到原問題的解

2、分治法适用範圍

一般具有以下特征的問題可以使用分治算法求解:

(1)求解問題可以分解為若幹個規模較小的相同問題

(2)求解問題的規模分解到一定程度,就能夠很容易地求解

(3)合并子問題的解可以得到問題的解

(4)由求解問題所分解的各個子問題是互相獨立的

3、分治法的步驟

(1)分解:将要求解的問題劃分為規模較小的同類問題

(2)求解:當子問題劃分的足夠小的時候,用比較簡單的方法求解,得到子問題的解

(3)合并:按求解問題的要求,将子問題的解逐層合并,即可構成最終的解

二、分治法執行個體:比賽日程的安排

1、問題描述

某學校舉行乒乓球比賽,在初賽階段設定為循環賽,設有n位選手參賽,初賽共進行n-1天,每位選手要與其他每一位選手進行一場比賽,然後按積分排名選拔進入決賽的選手。根據學校作息時間,要求每位選手每天必須比賽一場,不能輪空。按此要求為比賽安排具體日程,即決定每天各選手對陣的對手

2、解題思路

可考慮使用分治法來簡化日程的安排。按照分治政策,可以将所有的參賽選手分為兩半,則n個選手的比賽日程可以通過n/2個選手比賽日程來決定。繼續用這種一分為二方法對選手進行劃分,直到隻剩2位選手時情況就很簡單了

設n位參賽選手按順序編号為1,2,3,…,n,比賽的日程表制作為一個二維表格,其中每一行為一位選手各天對陣的各選手編号,例如8位選手7天的比賽日程如下表所示:

分治法的基本思想_算法設計:分治法(開會等日程安排)

在上表中,每一清單示當天的比賽安排,由左側選手編号對陣當天這列中對應編号的選手,如:

第1天,1号選手對陣2号選手,3号選手對陣4号選手

第3天,1号選手對陣4号選手,3号選手對陣2号選手

對于8位選手的情況,仍然比較複雜,通過分治法将其分為兩半,即隻考慮4位選手的比賽情況,可以編寫如下日程:

分治法的基本思想_算法設計:分治法(開會等日程安排)

對于4位選手的對陣情況,可繼續采用分治法,将4個選手的比賽分解為2個選手的情況來考慮。隻有2個選手時,比賽日程的制定就變得很簡單了,比賽隻需要1天,有1号和2号選手對陣即可,如下圖所示:

分治法的基本思想_算法設計:分治法(開會等日程安排)

上面的分解過程可以描述如下:

分治法的基本思想_算法設計:分治法(開會等日程安排)

在日程安排還有個重要問題,就是通過分治法将問題分解後,怎樣将得到的結果合并在一起。觀察4位選手的日程情況,可以看到一些規律:

1、第1天的日程隻需将1、2号選手和3、4号選手的日程直接合并

2、第2、3天的日程相對就要複雜些,将4人的表格劃分為4部分,這時會發現,将表格左下角的值複制到右上角,左上角複制到右下角即可

分治法的基本思想_算法設計:分治法(開會等日程安排)

是以使用分治法,要找到合并結果的規律