蛮力算法的应用一:排序算法
问题描述:(冒泡排序)
给出一系列的随机数并对其按照从大到小或者从小到大的顺序进行排列
原理:通过每一个位置当前元素都跟后面的元素进行比较,满足条件的话进行交换
伪代码:
void exchange(int str[],int n)
{
for(i=1;i<n;i++)
for(j=i+1;j<n;j++)
{if(str[i]<str[j]) 交换两者位置}
}
在运算时发现所要经过的运算过程是可以优化的,每经过一个过程,都可以使下一次的循环次数减少一次,因为被交换到后面的元素不需要再次进行比较
所以我们可以优化交换算法
排序算法的优化
void exchange(int str[],int n)
{
for(i=1;i<n;i++)
for(j=n-i+1;j>=1;j--)
{if(str[i]<str[j]) 交换两者位置}
}
选择排序
原理:
扫描整个序列,找出当前整个序列中最小(大)的数字并放入合适的位置
void select()
{
For(i=1;i<=n-1;i++)
{
index=i;
for(j=i+1;j<=n-1;j++)
if(r[j]<r[index]) index=j;
If(index!=i)r[index]与r[j]交换;
}
}
蛮力算法的应用二:组合问题
问题描述:
给出一个数n,求其从1到所有的排列 如n=2,1 12 21
伪代码:首先生成初始排序{1}
原理:通过
for(i=2;i<n;i++)
for(j=1;j<(n-1)!;j++)
for(k=i;k>=1;k--){将i插入第j个数列的k个位置};
这样就完成了一次全排列
蛮力算法的应用三:背包问题
0/1背包问题:需要考虑n个给定物品的子集,找出所有重量不超过背包容量的子集,并计算他们的价值,找出价值最大的子集
首先生成初始排序{1}
for(i=2;i<n;i++)
for(j=1;j<(n-1)!;j++)
for(k=i;k>=1;k--){将i插入第j个数列的k个位置};
筛选处理后的满足小于背包容量的排列并计算出总价值
- #define N 3 // N件宝贝
- #define V 5 // C是背包的总capacity
- int main()
- {
- int value[N + 1] = {0, 60, 100, 120}; // 价值
- int weight[N + 1] = {0, 1, 2, 3}; // 重量
- int f[N + 1][V + 1] = {0}; // f[i][j]表示在背包容量为j的情况下, 前i件宝贝的最大价值
- int i = 1;
- int j = 1;
- for(i = 1; i <= N; i++)
- { for(j = 1; j <= V; j++)
- {// 递推关系式出炉
- if(j < weight[i])
- { f[i][j] = f[i - 1][j]; }
- else
- {
- int x = f[i - 1][j];
- int y = f[i - 1][j - weight[i]] + value[i];
- f[i][j] = x < y ? y : x;
- }
- }
- }
蛮力算法的拓展:蚁群问题
问题描述:
自然界中蚂蚁每次在搬运食物中,几乎每次可以路径最优的方法寻找食物,意大利学者在1991年通过观察发明了蚁群算法,原理如下
原理:
有极多的一群蚂蚁,通过信息素来标记经过的位置,信息素浓度随着距离和时间不断降低,假设有两只蚂蚁甲乙发现了食物,甲走最近的路,乙走比较远的路,甲来回用的时间更少,信息素浓度损耗的也最低,这时候有一只蚂蚁乙发现了信息素并沿着信息素浓度最高的地方前进,乙搬运完食物后浓度变得更高,经过无数次循环后,大量蚂蚁沿着甲的路径搬运食物,乙走过的路径被荒废