⑴ 简要叙述蛮力法,基本常用的例子有哪些
蛮力法(brute force method,也称为穷举法或枚举法)是一种简单直接地解决问题的方法,常常直接基于问题的描述,所以,蛮力法也是最容易应用的方法。
蛮力法特性:
(1)理论上,蛮力法可以解决可计算领域的各种问题。
(2)蛮力法经常用来解决一些较小问规模的问题。
(3)对于一些重要的问题(如排序、查找、串匹配),蛮力法可以设计一些合理的算法,这些算法具有实用价值,而且不受输入规模的限制。
(4)蛮力法可以作为某类问题时间性能的下界,来衡量同样问题的其他算法是否具有更高的效率。
查找问题中使用蛮力法。
顺序查找:
是指在查找集合中一次查找值为k的元素,若查找成功,则给出元素在查找集合中的位置;若查找失败,则给出失败信息。
【想法】:将查找集合放在一维数组中,然后从数组的一端向另一端逐个将元素与带查找值进行比较,若相等,则查找成功,给出该元素在查找中的序号;若整个数组检测完仍未找到与带差值相等的元素,则查找失败,给出失败标志0。我们在查找过程中还要注意下标是否越界的问题。
算法的实现方法一:
int SeqSearch1(int r[] ,int n, int k) //数组r[1] r[n]中存放查找集合。
{
int i = n;
while(i>0 && r[i]!k) //注意检测比较位置是否越界。
{ i--; }
return i;
}
上述算法我们每次都要去判断数组的下标是否越界,为了避免在查找过程中每一次比较前都要判断查找位置是否越界,可以设置观察哨,即将待查值放在查找方向的“尽头”处,则比较位置i至多移动到下标0处。
⑵ 算法设计 线性规划 蛮力法 给出详细设计过程
解:#include<iostream>
using namespace std;
//在此现行规划列子:
//第一个约束方程的最大X1 max=4; Y1 max=4;
//第二个约束方程的最大X2 max=6 Y2 max=2;
//取X1,X2 的最小值 X=4+1,包括0
// Y1,Y2的最小值为y=2+1,包括0
//因此时间复杂度为 x*y=8
////////////////////////
int main()
{
int i,j,max=0;
for(i=0;i<=4;i++)
for(j=0;j<=2;j++)
{
if(max < 3*i+5*j)
{
if((i+j <=4) && (i+3*j<=6))
max=3*i+5*j;
}
}
cout<<max<<endl;
return 0;
}
⑶ 蛮力法求解旅行商问题 求C++代码
#include<stdlib.h>
#include<cmath>
#include<algorithm>
using namespace std;
static double Tmax = 10, Tmin = 0.1, r = 0.999999;
static int k = 100;
inline void random_sele(int &fl, int &fp, int arr[], int n)
{
do
{
fl = rand() % n;
fp = rand() % n;
} while (fl == arr[fp] || arr[fl] == arr[fp]);
};
inline bool accept(double r1, double r2, double T)
{
const unsigned int MASK((1 << 30) - 1);
double p = 1.0 / (1.0 + exp((r2 - r1) / T));
unsigned int temp1=((rand()<<20)^(rand()<<10)^rand())&MASK;
unsigned int temp2=((rand()<<20)^(rand()<<10)^rand())&MASK;
double res=(1.0*temp1+1.0*temp2/MASK);
return res < p*MASK;
}
void set_SA()
{
printf(" Tmax Tmin r k ");
printf(" %.8f %.8f %.8f %d ",Tmax,Tmin,r,k);
printf("Input Tmax,Tmin,r,k: ");
scanf("%lf%lf%lf%d",&Tmax,&Tmin,&r,&k);
}
void TSP_SA(int arr[], double &evl, int n, double map[][2000])
{
double r1, r2, T = Tmax;
int i, fl, sl, fp, sp;
int show_s=0;
srand(11827);
while (T >= Tmin)
{
for (i = 0; i < k; i++)
{
random_sele(fl, fp, arr, n);
sl = arr[fl], sp = arr[fp];
r1 = map[fl][sl] + map[fp][sp] + map[sp][arr[sp]];
r2 = map[fl][sp] + map[sp][sl] + map[fp][arr[sp]];
if (accept(r1, r2, T))
{
arr[fp] = arr[sp];
arr[fl] = sp;
arr[sp] = sl;
sl = sp;
evl = evl + r2 - r1;
}
}
if(++show_s==1000000/k)
{
printf("T=%f evl=%f ",T,evl);
show_s=0;
}
T *= r;
}
}
⑷ 求最大子序列连续求和写程序 (1)用蛮力法写程序 (2)用分治法写程序 (3)哪个算
最简单且最快的是线段树,线段树每个节点维护对应区间 从左开始最大连续序列和(从区间左端点开始)lmax,从右开始最大连续序列和(从区间右端点开始)rmax,区间最大连续子序列和 mmax,区间和s。设lc为线段树当前节点x左节点,rc为右节点(#define下好写一些),那么mmax[x]=max(rmax[lc]+lmax[rc],max(mmax[lc],mmax[rc])),lmax[x]=max(lmax[lc],s[lc]+lmax[rc]),rmax[x]=max(rmax[rc],s[rc]+rmax[lc]),s[x]=s[lc]+s[rc]。初始化即将每个叶子节点赋值。此方法好在还可以logn修改并且除了第一次O(nlogn)查询外,其余都是O(1)查询,输出mmax[rt](rt为根节点)即可。
⑸ C语言编程,设计一个蛮力算法,第13题
给个顺横向的例子
for (x = 0 ; x < map_cx ; x++)
for (ifrom = 0 ; ifrom <map_cx;i++)
for(ito =ifrom;ito<map_cx;ito++){
if (isac(map ,ifrom,ito ,strlist ,buff))
printf("%s\n",buff);
}
⑹ 蛮力法最近对问题的伪代码怎么写啊,求计算机大神指点!!!!~
请明确给个题目,其实你可以在网上搜索到很多这样的源代码的,仔细寻找就可以找到,很简单的。
⑺ 算法中怎么在一个数组中查找某个元素(使用蛮力法)
python">result=false
#c=数组,j=元素
foriinc:
ifi==j:
result=true
break
returnresult
⑻ C#蛮力法给出空间n个点求出两点之间的最短距离代码
为什么不用FLOYD(弗洛伊德)算法,代码简洁容易理解。自己就能看懂,网络一下。我就不再废话了。
⑼ 蛮力法是什么样的算法
《算法设计与分析基础》学习 --- 蛮力法
要重温算法思想,并以《算法设计与分析基础》这本书作为教材。该书每一章介绍一种算法设计思想。今天从最简单的开始写起,打好基础。以后再逐步深入,学习更深入的算法。 蛮力法就是一种解决问题的最简单最直观的最容易理解方法,虽然它简单,而且在实际应用中因为效率的原因可能不能派上用场,但是还是不能忽略它。正如书中作者所说,在解决小规模问题的时候也不失为一个方法,而且也是更复杂算法的基础。 一、选择排序
01/* 02 蛮力法-选择排序 03 将输入数组排成非递减数组 04 05 array:待排数组 06 n:数组大小,即[0,n-1] 07*/08void SelectionSort(int array[],unsigned int n) 09{ 10 int min; 11 for(int i=0;i
⑽ 使用python贪心算法和蛮力算法解决问题~~
# coding:utf-8 """定义一个函数,名字为sameSums(aList),alist是一个整形list(限定重复元素不超过2个,排2f0e除这样的list,元素前后差为1,[4,5,6,7,8]),函数作用是判断能分成两组,使得两组数字的和相等。若可以择返回值是true,若不可以返回值是false。如下例:sameSums([4, 7, 6, 3]) --> True //4+6 = 10 and 7 + 3 = 10sameSums([3, 3]) --> TruesameSums([4, 12, 16]) --> True //4+12= 16 and 16sameSums([5, 1]) --> False 特别提示:这个题目,贪心算法只能计算上面这样的情况。这个题目,对初学者来说,有点难度,但稍微有点算法基础,编程思路,就不难。先讲一个故事:二个小孩儿时从树上采板栗,最后合并一堆,分板栗,采集一人选一个的分。假定人性是贪婪的,第一个先选的人,选最大的,第二个选的人,选次大的,一直循环下去。贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。这个题目:先将list从大到小排序,中间设置2个空的list,从大的开始选,下一次选的时候,需要比较一下和,如果谁的和小,再添加一个,直到最后一个元素。 """ def sameSums(int_list): """ www.iplaypy.com python教程 """ >>> sameSums([4, 7, 6, 3]) True >>> sameSums([3, 3]) True >>> sameSums([4, 12, 16]) True >>> sameSums([5, 1]) False """ new_lst = sorted(int_list, reverse=True) list1 = list() list2 = list() for n in new_lst: if sum(list1) < sum(list2): list1.append(n) else: list2.append(n) return sum(list1) == sum(list2) if __name__ == "__main__": import doctest doctest.testmod() lst = [3, 9, 10, 30, 8] print sameSums(lst)