如何使用C++中的活動(dòng)選擇算法
活動(dòng)選擇算法(Activity Selection Algorithm)是一種經(jīng)典的貪心算法,用于解決活動(dòng)安排問(wèn)題。在給定一組活動(dòng)的起始時(shí)間和結(jié)束時(shí)間的情況下,算法的目標(biāo)是選擇出最大的相容活動(dòng)集合,即這些活動(dòng)互不沖突且可以同時(shí)進(jìn)行的最大數(shù)量的活動(dòng)。本文將介紹如何使用C++實(shí)現(xiàn)活動(dòng)選擇算法,并附上具體的代碼示例。
算法思路:
活動(dòng)選擇算法的基本思路是,首先根據(jù)活動(dòng)的結(jié)束時(shí)間對(duì)活動(dòng)進(jìn)行排序。然后依次選擇結(jié)束時(shí)間最早的活動(dòng),同時(shí)排除與該活動(dòng)沖突的其他活動(dòng)。具體的步驟如下:
- 首先,需要定義一個(gè)結(jié)構(gòu)體來(lái)表示每個(gè)活動(dòng)。結(jié)構(gòu)體中包含活動(dòng)的起始時(shí)間和結(jié)束時(shí)間。
struct Activity { int start; int end; };
登錄后復(fù)制
- 然后,定義一個(gè)函數(shù)來(lái)實(shí)現(xiàn)活動(dòng)選擇算法。函數(shù)的輸入是一個(gè)活動(dòng)數(shù)組和數(shù)組的大小,輸出是一個(gè)最大相容活動(dòng)集合。
vector<Activity> activitySelection(Activity arr[], int n) { // 根據(jù)結(jié)束時(shí)間對(duì)活動(dòng)進(jìn)行排序 sort(arr, arr + n, [](Activity a, Activity b) { return a.end < b.end; }); vector<Activity> selectedActivities; selectedActivities.push_back(arr[0]); //選擇第一個(gè)活動(dòng) int lastSelected = 0; //遍歷剩余的活動(dòng) for (int i = 1; i < n; i++) { if (arr[i].start >= arr[lastSelected].end) { selectedActivities.push_back(arr[i]); lastSelected = i; } } return selectedActivities; }
登錄后復(fù)制
- 最后,在main函數(shù)中構(gòu)造一個(gè)活動(dòng)數(shù)組并調(diào)用活動(dòng)選擇函數(shù),打印輸出最大相容活動(dòng)集合。
int main() { Activity arr[] = {{1, 2}, {3, 4}, {0, 6}, {5, 7}, {8, 9}, {5, 9}}; int n = sizeof(arr) / sizeof(arr[0]); vector<Activity> selectedActivities = activitySelection(arr, n); cout << "最大相容活動(dòng)集合:" << endl; for (int i = 0; i < selectedActivities.size(); i++) { cout << "(" << selectedActivities[i].start << ", " << selectedActivities[i].end << ")" << endl; } return 0; }
登錄后復(fù)制
代碼示例解析:
首先,在定義的結(jié)構(gòu)體中,將每個(gè)活動(dòng)的起始時(shí)間(start)和結(jié)束時(shí)間(end)作為結(jié)構(gòu)體的成員。
然后,在實(shí)現(xiàn)的活動(dòng)選擇函數(shù)中,首先根據(jù)活動(dòng)的結(jié)束時(shí)間對(duì)活動(dòng)數(shù)組進(jìn)行排序,以便后續(xù)選擇活動(dòng)時(shí)可以方便地按照結(jié)束時(shí)間的順序。
接著,定義一個(gè)vector容器 selectedActivities 來(lái)保存最大相容活動(dòng)集合,并將第一個(gè)活動(dòng)加入其中。
然后,從第二個(gè)活動(dòng)開(kāi)始遍歷剩余的活動(dòng)。如果當(dāng)前活動(dòng)的起始時(shí)間大于等于已選擇的最后一個(gè)活動(dòng)的結(jié)束時(shí)間,則將該活動(dòng)加入到最大相容活動(dòng)集合中,并將該活動(dòng)設(shè)為當(dāng)前已選擇的最后一個(gè)活動(dòng)。
最后,在main函數(shù)中創(chuàng)建一個(gè)活動(dòng)數(shù)組,調(diào)用活動(dòng)選擇函數(shù),并打印輸出最大相容活動(dòng)集合。
總結(jié):
通過(guò)以上的示例代碼,我們可以看到C++中如何實(shí)現(xiàn)活動(dòng)選擇算法。通過(guò)貪心策略,根據(jù)活動(dòng)的結(jié)束時(shí)間來(lái)選擇最大的相容活動(dòng)集合。活動(dòng)選擇算法在實(shí)際生活中有廣泛的應(yīng)用,比如會(huì)議安排、項(xiàng)目管理等。
【參考文獻(xiàn)】
[1] Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2009). Introduction to Algorithms (3rd edition). MIT Press.
以上就是如何使用C++中的活動(dòng)選擇算法的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注www.xfxf.net其它相關(guān)文章!