算法导论第十六章-贪心算法-Cpp代码实现
贪心算法其实是利用动态规划思想,简化后的一种方法。它强调的是贪心选择和最优子结构的结合。
利用贪心策略设计的算法很多,包括最小生成树算法,单源最短路径的Dijkstra算法等。这一章通过一个活动选择问题引出贪心算法,分别实现了递归贪心算法和迭代贪心算法两种。贪心算法还可以用来解决分数(部分)背包问题,但是不能用于解决0-1(完全)背包问题。16.2给出了贪心算法的原理说明。
Huffman树的构建也利用到了贪心原理,结合了prefix code的优势。这里Huffman树比较简单,这里代码没有实现。
greedy.h
#pragma once
/*************************************************
Author:董小歪
Date:2016-06-17
Description:算法导论第十六章-贪心算法-Cpp代码实现
**************************************************/
#ifndef GREEDY_H
#define GREEDY_H
#include <iostream>
#include <vector>
using namespace std;
class Greedy
{
public:
vector<int> recursive_activity_selector(const vector<int> &s, const vector<int> &f); //递归贪心算法
vector<int> greedy_activity_selector(const vector<int>& s, const vector<int>& f); //迭代贪心算法
private:
void recursive_activity_selector(const vector<int> &s, const vector<int> &f, int k, int n, vector<int> &res);
};
#endif // !GREEDY_H
#include "greedy.h"
vector<int> Greedy::recursive_activity_selector(const vector<int> &s, const vector<int> &f)
{
vector<int> res;
recursive_activity_selector(s, f, 0, s.size() - 1, res);
return res;
}
void Greedy::recursive_activity_selector(const vector<int> &s, const vector<int> &f, int k, int n, vector<int> &res)
{
int m = k + 1;
while (m <= n && s[m] < f[k])
++m;
if (m <= n)
{
res.push_back(m);
recursive_activity_selector(s, f, m, n, res);
}
}
vector<int> Greedy::greedy_activity_selector(const vector<int> &s, const vector<int> &f)
{
int n = s.size();
vector<int> res = { 1 };
int k = 1;
for (int m = 2; m < n; ++m)
{
if (s[m] >= f[k])
{
res.push_back(m);
k = m;
}
}
return res;
}
测试代码:
main_entrence.cpp
#include "greedy.h"
int main()
{
Greedy greedy;
const vector<int> s = { 0,1,3,0,5,3,5,6,8,8,2,12 };
const vector<int> f = { 0,4,5,6,7,9,9,10,11,12,14,16 };
cout << "活动开始时间Si:";
for (auto i : s)
cout << i << "\t";
cout << endl << "活动结束时间Fi:";
for (auto i : f)
cout << i << "\t";
vector<int> res = greedy.recursive_activity_selector(s, f);
cout << endl << "递归贪心算法的结果是:";
for (auto i : res)
cout << i << " ";
res = greedy.greedy_activity_selector(s, f);
cout << endl << "迭代贪心算法的结果是:";
for (auto i : res)
cout << i << " ";
cout << endl;
system("pause");
}
测试结果: