《算法设计与分析》之蛮力法

【算法】蛮力法/穷举法/枚举法 的基本问题分析 所有解空间:例如a,b,c取值范围都是 0~9,问abc组成的三位数的所有情况 所有路径:遍历图、遍历树 蛮力法的格式 蛮力法由循环和选择语句构成 使用循环,穷举所有情况 使用选择,判断当前情况是否成立 若成立,则得到问题的解 若不成立,则继续循环 循环 + 分支 for(){ for(){ // 获取X所有可能的情况 if(X满足条件){ printf("X"); } } } 蛮力法思想:穷举所有情况,找到符合条件的。 这也意味着,得能够穷举,因此问题规模不能太大。.. 阅读详情

目录

蛮力法的定义:

蛮力法的适用场景:

1、搜索所有的解空间:

2、搜索所有的路径:

3、直接计算:

4、模拟和仿真:

蛮力法的具体应用案例:

1、简单选择排序和冒泡排序:

2、求解最大连续子序列和问题:

3、求解幂集问题:

4、求解全排列问题:

5、求解组合问题:

6、求解迷宫问题:


蛮力法的定义:

对问题中的所有可能状态都进行测试,直到找到解或将全部可能状态都测试为止。

蛮力法的适用场景:

1、搜索所有的解空间:

问题的解存在于规模不大的解空间中。解决这类问题一般是找出某些满足特定条件或要求的解。使用蛮力法就是把所有的解都列出来,从中选出符合要求的解。

2、搜索所有的路径:

这类问题中不同的路径对应不同的解,需要找出特定解。使用蛮力法搜索所有可能的路径并计算路径对应的解,找出特定解。

3、直接计算:

基于问题的描述直接进行计算。

4、模拟和仿真:

根据问题要求直接模拟或仿真。

蛮力法的具体应用案例:

1、简单选择排序和冒泡排序:

简单选择排序代码展示:

package test;

public class Test {
	public static void main(String[] args) {
		int[] a= {7,3,5,9,4,2};
		sort(a);
		for(int i=0;i<a.length;i++)
			System.out.println(a[i]);
	}
	private static void sort(int[] nums) {
		for(int i=0;i<nums.length;i++) {
			int k=i;
			for(int j=i+1;j<nums.length;j++)
				if(nums[k]>nums[j])
					k=j;
			if(k!=i) {
				int temp=nums[i];
				nums[i]=nums[k];
				nums[k]=temp;
			}
		}
	}
}

冒泡排序代码展示:

package test;

public class Test {
	public static void main(String[] args) {
		int[] a= {7,3,5,9,4,2};
		sort(a);
		for(int i=0;i<a.length;i++)
			System.out.println(a[i]);
	}
	private static void sort(int[] nums) {
		for(int i=0;i<nums.length;i++) {
			boolean exchange=false;
			for(int j=nums.length-1;j>i;j--) {
				if(nums[j]<nums[j-1]) {
					int temp=nums[j];
					nums[j]=nums[j-1];
					nums[j-1]=temp;
					exchange=true;
				}
			}
			if(!exchange)
				break;
		}
	}
}

2、求解最大连续子序列和问题:

LeetCode 第53题 最大子数组和

剑指 Offer 42 连续子数组的最大和

思路:用一个变量sum表示当前子数组的最大和,用另一个变量max表示最终子数组最大和,然后从头到尾扫描整个数组,每扫描一个元素之前先判断sum是否小于0,若小于则将sum置为0;然后将sum加上扫描的元素,最后max取sum和max中的最大值。扫描一遍数组,答案就出来了,此方法的时间复杂度为O(n),而分治法解决此问题的时间复杂度为O(n\log n),故此方法效率更高。

完整代码展示:

package leetcode_7;

public class T_O_42 {
	public static void main(String[] args) {
		int[] a= {-2,1,-3,4,-1,2,1,-5,4};
		System.out.println(maxSubArray(a));
	}
	public static int maxSubArray(int[] nums) {
		int max=nums[0],sum=nums[0];
		for(int i=1;i<nums.length;i++) {
			if(sum<0)
				sum=0;
			sum+=nums[i];
			max=Math.max(max, sum);
		}
		return max;
	}
}

3、求解幂集问题:

面试题 08.04 幂集

思路:采用增量穷举法求解,此处借助了ArrayList。可以通过遍历或递归实现。

完整代码展示(遍历实现):

package leetcode_7;

import java.util.ArrayList;
import java.util.List;

public class T_mst0804 {
	public static void main(String[] args) {
		int[] a= {1,2,3};
		System.out.println(subsets(a));
	}
	public static List<List<Integer>> subsets(int[] nums){
		List<List<Integer>> ans=new ArrayList();
		List<Integer> p=new ArrayList();
		ans.add(p);
		for(int i=0;i<nums.length;i++) {
			int n=ans.size();
			for(int j=0;j<n;j++) {
				List<Integer> t=new ArrayList(ans.get(j));
				t.add(nums[i]);
				ans.add(t);
			}
		}
		return ans;
	}
}

完整代码展示(递归实现):

package leetcode_7;

import java.util.ArrayList;
import java.util.List;

public class T_mst0804 {
	public static void main(String[] args) {
		int[] a= {1,2,3};
		System.out.println(subsets(a));
	}
	public static List<List<Integer>> subsets(int[] nums){
		List<List<Integer>> ans=new ArrayList();
		ans.add(new ArrayList());
		f(nums,0,ans);
		return ans;
	}
	private static void f(int[] nums,int n,List<List<Integer>> ans) {
		if(n>=nums.length)
			return ;
		int count=ans.size();
		for(int i=0;i<count;i++) {
			List<Integer> t=new ArrayList(ans.get(i));
			t.add(nums[n]);
			ans.add(t);
		}
		f(nums,n+1,ans);
	}
}

4、求解全排列问题:

LeetCode 第46题 全排列

思路:也是采用增量穷举法求解,此处借助了LinkedList。同样也可以通过遍历或递归实现。

完整代码展示(遍历实现):

package leetcode_7;

import java.util.LinkedList;
import java.util.List;

public class T_46 {
	public static void main(String[] args) {
		int[] a= {1,2,3};
		System.out.println(permute(a));
	}
	public static List<List<Integer>> permute(int[] nums){
		List<List<Integer>> ans=new LinkedList();
		List<Integer> p=new LinkedList();
		p.add(nums[0]);
		ans.add(p);
		for(int i=1;i<nums.length;i++) {
			int n=ans.size();
			for(int j=0;j<n;j++) {
				List<Integer> t=new LinkedList(ans.get(0));
				ans.remove(0);
				int m=t.size();
				for(int k=0;k<=m;k++) {
					List<Integer> q=new LinkedList(t);
					q.add(k, nums[i]);
					ans.add(q);
				}
			}
		}
		return ans;
	}
}

(ArrayList与LinkedList的区别:ArrayList使用顺序存储结构存储对象元素,故其查找、遍历元素快,插入、删除元素慢;LinkedList使用链表结构存储元素,故其插入、删除元素快,查找、遍历元素慢。)

5、求解组合问题:

LeetCode 第77题 组合

思路:采用递归解决,大问题:从n个数中找k个数,小问题:从m个数中找k-1个数。(k-1<=m<n)当k=0时说明这是其中的一个组合,将其加入所求集合中。

完整代码展示:

package leetcode_7;

import java.util.LinkedList;
import java.util.List;

public class T_77 {
	public static void main(String[] args) {
		System.out.println(combine(4,2));
	}
	public static List<List<Integer>> combine(int n, int k){
		List<List<Integer>> ans=new LinkedList();
		List<Integer> p=new LinkedList();
		f(n,k,ans,p);
		return ans;
	}
	private static void f(int n,int k,List<List<Integer>> ans,List<Integer> t) {
		if(k==0) {
			ans.add(t);
			return ;
		}
		for(int i=k;i<=n;i++) {
			List<Integer> q=new LinkedList(t);
			q.add(i);
			f(i-1,k-1,ans,q);
		}
	}
}

6、求解迷宫问题:

问题:有一个8x8的迷宫如下图所示,其中O表示通路方块,X表示障碍方块。假设入口位置为(0,0),出口为右下角方块位置(7,7)。设计一个程序求指定入口到出口的一条迷宫路径。

迷宫
OXXXXXXX
OOOOOXXX
XOXXOOOX
XOXXOXXO
XOXXXXXX
XOXXOOOX
XOOOOXOO
XXXXXXXO

思路:采用枚举的思想解决此题,可通过DFS或BFS去实现。

完整代码展示(DFS):

package test;

public class Test3 {
	public static void main(String[] args) {
		char[][] maze={{'O','X','X','X','X','X','X','X'},
				 	   {'O','O','O','O','O','X','X','X'},
				 	   {'X','O','X','X','O','O','O','X'},
				 	   {'X','O','X','X','O','X','X','O'},
				 	   {'X','O','X','X','X','X','X','X'},
				 	   {'X','O','X','X','O','O','O','X'},
				 	   {'X','O','O','O','O','X','O','O'},
				 	   {'X','X','X','X','X','X','X','O'}};
		dfs(0,0,maze);//设置起点位置为左上角
		}
	private static void dfs(int x,int y,char[][] maze) {
		int row=maze.length,col=maze[0].length;
		if(x==col-1&&y==row-1) {//设置终点的位置为右下角
			for(int i=0;i<row;i++) {
				for(int j=0;j<col;j++)
					System.out.print(maze[i][j]+" ");
				System.out.println();
			}
			return ;
		}
		int[] H= {0,1,0,-1};
		int[] V= {-1,0,1,0};
		for(int k=0;k<4;k++) {
			if(0<=x&&x<col&&0<=y&&y<row&&maze[x][y]=='O') {
				maze[x][y]='T';
				dfs(x+H[k],y+V[k],maze);
				maze[x][y]='O';//如果退回来就恢复迷宫此处初始值
			}
		}
	}
}
算法设计与分析:蛮力法 算法分析与设计实验报告 第 四 次实验 姓名 裴朵朵 学号 5001170016 班级 计科一班 时间 2019.10.31 地点 实验名称 暴力法的使用 实验目的 1、理解暴力法的工作原理、过程技巧,掌握常用的暴力法案例(幂级数、全排列等) 2、应用暴力法求解日常生活中问题 实验原理 1.求数组a中大小相差最小的两个元素的差 2.给定一个整数数组A=(a0,a1,a2…an-1),若i<j... 阅读详情

相关推荐

头歌之算法设计与分析-蛮力法

请在右侧编辑器Begin-End处补充代码,完成本关任务,要求程序输出所有可行的方法,按公鸡的升序输出,输出格式为:公鸡有a只,母鸡有b只,小鸡有c只,每个输出结果后用空行隔开。请在右侧编辑器Begin-End处补充代码,完成本关任务,要求程序输出结果格式为:ABCAB*A=DDDDDD(A、B、C、D 为阿拉伯数字)。请在右侧编辑器Begin-End处补充代码,完成本关任务,最终程序输出格式为:士兵最少有X个(X 为具体数据)。平台会对你编写的代码进行测试,输出结果为正确答案时则通关。

2201_75304925的博客 923

第四章——蛮力法

蛮力法概述 蛮力法也称穷举法(枚举法)或暴力法,是一种简单的直接解决问题的方法,通常根据问题的描述和所涉及的概念定义,对问题所有可能的状态(结果)一一进行测试,直到找到解或将全部可能的状态都测试一遍为止。 蛮力法的“力”指的是计算机的运算能力,蛮力法是基于计算机运算速度快的特性,减少人的思考而把工作都交给计算机的“懒惰”策略(这里的懒惰指的是人懒,不是算法中的懒惰方法),一般而言是最容易实现的方法。 蛮力法的优点如下: 1.逻辑简单清晰,根据逻辑编写的程序简单清晰。 2.对于一些需要高正确性的重要问题,它产

weixin_55835175的博客 8374

算法设计与分析学习-蛮力法

参考 :  算法设计与分析   第三章  蛮力法 接下来的每章中,我们专注于一种特定的算法设计策略。 蛮力法是一种最简单和直接的解决问题的办法,往往是低效的,但我们不应该忽略它的地位, 1)它可以解决广阔领域的各种问题 2)在规模允许时,多少可以产生一些实用的算法 3)往往可以以蛮力法为准绳,来衡量高效的算法,或者找不到其他算法时,先设计蛮力算法,再做改进 好了,很

ThinkCode的专栏 2927

蛮力法详解

蛮力法是一种简单但有效的算法设计方法。它通过穷举所有可能的解来找到符合条件的最优解。以下是对蛮力法的总结:直观简单:蛮力法的思想直观明了,容易理解和实现。适用性广泛:蛮力法可以解决各种问题,特别适用于小规模问题或作为其他算法的基础。可靠性高:由于穷举了所有可能的解,蛮力法能够找到确切的最优解。效率低:蛮力法需要枚举所有可能的解,当问题规模较大时,时间复杂度通常很高,运行效率较低。需要大量计算资源:由于需要遍历所有解空间,蛮力法可能需要大量的计算资源,尤其是在搜索空间很大的情况下。

2201_75879431的博客 4590

算法设计与分析笔记5-蛮力法

算法设计与分析讲义4 蛮力法(穷举法)例子: 穷举所有可能的解 1、选择排序 冒泡排序 2、顺序查找 3、简单的字符串匹配,简单匹配算法(依次匹配)最差时间复杂度 O(n*m) 4、最近点对问题 5、凸包问题 6、旅行推销员问题(TSP,Traveling Salesman Problem /货郎担问题)(图论相关):类似于哈密尔顿回路问题 全排列问题:乘法原理:多步决策 7、背包问题(等价于leecode78题Subsets问题) 8、迷宫问题 9、N皇后问题 发现大部分用

XTL151384的博客 1303

算法设计与分析复习(第4章 蛮力法)

【代码】算法设计与分析复习(第4章 蛮力法)

qq_62898666的博客 457

算法设计与分析—蛮力法

蛮力法解决 查住问题,排序问题,串匹配问题,哈密顿问题,01背包问题

wxh的博客 3170

算法分析与设计——蛮力法0/1背包

蛮力法0/1背包 蛮力法 蛮力法是一种简单直接解决问题的方法,常常直接基于问题的描述,所以蛮力法也是最容易应用的方法。 蛮力法所依赖 的基本技术是遍历,即采用一定的策略依次处理待求解问题的所有元素,从而找出问题的解。由于其需要依次穷举待处理的元素,因此蛮力法是一种典型的指数级时间算法。 问题 给定n个重量为{w1,w2,···,wn}、价值为{v1,v2,···,vn}的物品和一个容量为C的背包,0/1背包是一个求解这些物品中的一个最有价值的子集,并且能够装入到背包中。 应用实例 有n项可投资的项目,每个项

Flamingo的博客 1万+

算法设计与分析之蛮力法

蛮力法是指采用遍历(扫描)技术,即采用一定的策略将待求解问题的所有元素依次处理一次,从而找出问题的解。依次处理所有元素是蛮力法的关键,为了避免陷入重复试探,应保证处理过的元素不再被处理。

qq_44075108的博客 1万+

Meta DINOv3实战指南:如何用7B参数ViT模型搞定图像分割与检测(附Hugging Face配置)

本文提供了Meta DINOv3模型的实战应用指南,重点介绍了如何利用这个7B参数的视觉Transformer模型进行图像分割与目标检测。通过详细的Hugging Face配置步骤、环境搭建、模型加载与推理优化,帮助开发者快速上手这一强大的自监督视觉模型,并高效应用于实际计算机视觉任务中。

s3t4u的博客 906

用Java实现对接豆包ai火山引擎详细版简单明了ai对话

第二部分代码实现。

m0_72637700的博客 8608

算法设计与分析——蛮力法

蛮力法感觉是在用最笨的方法解决问题,但是对一些问题不乏适用性。对于算法中的多种问题的求解我们大多时候还是会用其他算法技术,这里只是大概看看有哪些静电的问题。

m0_74164311的博客 2716

deepin搭建samba服务器

一.为什么要用Samba? Samba的主要任务就是实现Linux系统和Windows系统之间的资源共享。二.需要的软件? 我是在deepin上实现的,在终端中使用一下两句命令,就可以安装Samba的软件包 $sudo apt-get install samba //安装samba 三.Samba服务的组成 Samba的核心是两个守护进程smbd和nmbd。当然,它

xbrother123的博客 8598

算法设计与分析第四章(蛮力法) 课后习题答案(c++)

该文章是算法设计与分析(第二版)中各章的课后习题 主编 : 李春葆 在本文中,主要是对该书第四章-蛮力法章节中的上机实验题以及在线编程题进行代码解答。

qq_46664080的博客 2290

告别SquareLine!用免费的NXP GUI-Guider为海思3516AV300开发LVGL界面(附完整移植流程)

本文详细介绍了如何利用免费的NXP GUI-Guider工具为海思Hi3516AV300开发LVGL界面,包括环境配置、代码移植和性能优化等全流程实战指南。特别针对二维码组件缺失等常见问题提供解决方案,帮助开发者零成本构建高效嵌入式GUI系统。

weixin_28292761的博客 416

雷达回波仿真

文章目录前言一、基础理解1.慢时间维度和快时间维度2.脉冲压缩3.MTI4. 脉冲多普勒处理5.cacfar检测二、具体流程1.产生回波信息加入目标时延以及噪声2.解调回波得到基带信号3.脉冲压缩 MTI MTD cafar检测 前言 雷达算法仿真学习,主要流程包括生成目标回波,将基带信号加在载波上其次是加上目标信息和干扰信号后发射,解调回波信号得到基带信号然后MTI,MTD,最后再检测。 一、基础理解 1.慢时间维度和快时间维度 连续M个脉冲回波经过相干解调之后的基带数据形成的一个二维数据矩阵,.

qq_42961235的博客 1万+

《算法设计与分析基础》Chapt 3 蛮力法

非

weixin_33991418的博客 165

YOLO系列算法改进 | 主干改进篇 | 替换LSKNet主干特征提取网络 | 通过动态调整感受野自适应融合长程上下文,显著提升小目标与复杂背景下的检测精度!

YOLO系列算法改进 | 主干改进篇 | 替换LSKNet主干特征提取网络 | 通过动态调整感受野自适应融合长程上下文,显著提升小目标与复杂背景下的检测精度! (以YOLO26最新目标检测模型为基础,利用LSKNet替代Backbone)

2502_91881744的博客 212

算法设计与分析基础(第三版)Part 3 蛮力法

蛮力法3.1选择排序和冒泡排序3.1.1选择排序3.1.2冒泡排序3.2顺序查找和蛮力字符串匹配3.2.1顺序查找3.2.2蛮力字符串匹配3.3最近对和凸包问题蛮力算法3.3.1最近对问题凸包问题3.4穷举查找3.4.1 旅行商问题3.4.2 背包问题3.4.3分配问题3.5深度优先查找和广度优先查找3.5.1 深度优先查找3.5.2 广度优先查找 蛮力法——简单直接地解决问题的方法 3.1选择排序和冒泡排序 3.1.1选择排序 选择排序开始的时候,扫描整个列表,找到它的最小元素,然后和第一个元素交换,将

暖阳Shine 1064

Python爬虫实战教程:如何高效爬取税务局通知通告

税务局发布的通知通告包含政策法规、办税指南、公告信息等,是纳税人、企业合规经营的重要参考。官网发布频率高,手动查看不便,自动爬取并保存,方便信息及时掌握及历史数据归档。本文以合法合规的方式示范,建议实际应用前确认目标网站允许爬取的范围和方式。建议使用pandas进行数据清洗,如去重、空值处理等。对于研究税务政策、进行大数据分析、搭建行业信息平台,爬取税务局通知通告信息尤为关键。公告列表以分页形式展现,包含标题、发布时间和详情页链接。进行政策趋势图、发布频率统计等可视化。爬取公开数据时,务必遵守网站的。

2201_76125261的博客 1781

K8s(二十二):k8s集群如何部署一个Spring Boot项目(依赖于MySQL和Redis外部服务)

🔴 K8s(二十二):k8s集群如何部署一个Spring Boot项目(依赖于MySQL和Redis外部服务)

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2万+

〈算法设计与分析基础〉读书笔记2——蛮力法

蛮力法蛮力法是一种简单直接地解决问题的方法,常常直接基于问题的描述和所设计的概念定义。1.       选择排序和冒泡排序SelectionSort(A[0…n-1])   C(n) = n(n-1)/2  算法效率为平方级别,但是键的交换次数仅为n-1次。BubbleSort(A[0…n-1])  最坏情况是键的交换次数和比较次数都为平方级别,不如前者。应用蛮力法得出的第

2231

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

算法设计与分析------蛮力法

算法设计与分析------蛮力法(c++) 一、蛮力法(穷举法 枚举法) 1、定义 ​ 蛮力法是一种简单直接地解决问题的方法,通常直接基于问题的描述和所涉及的概念定义,找出所有可能的解。 然后选择其中的一种或多种解,若该解不可行则试探下一种可能的解。 2、蛮力法使用情况 索所有的解空间:问题的解存在于规模不大的解空间中。 索所有的路径:这类问题中不同的路径对应不同的解。 直接计算:按照基于问题的描述和所涉及的概念定义,直接进行计算。往往是一些简单的题,不需要算法技巧的。 拟和仿真:按照

唯一的博客 9662

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

算法设计与分析第五章:蛮力法

本文介绍了蛮力法(穷举法)的基本概念、设计思想及在各类问题中的应用。蛮力法通过依次处理所有可能解来寻找答案,具有简单直接的特点,但时间性能较低。文章重点探讨了蛮力法在查找问题(如顺序查找、串匹配的BF和KMP算法)、排序问题(选择排序和冒泡排序)以及图问题(哈密顿回路和TSP问题)中的应用,并分析了各算法的时间复杂度。蛮力法虽然效率不高,但在小规模问题中具有实用价值,并可作为算法效率的衡量基准。

Justicer_Young的博客 260

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

算法设计与分析:实验三 蛮力法

通过设置各棋子的取值为不同字母,利用题目给出的条件,兵炮马卒+兵炮车卒=车卒马兵卒,可以得出(兵*1000+炮*100+马*10+卒*1)+(兵*1000+炮*100+车*10+卒*1)=车*10000+卒*1000+马*100+兵*10+卒*1,且各棋子小于等于9,各不相等,利用这些条件,即可以算出各棋子的取值。列举出给出的序列的所有连续子序列,即通过起始下标和终止下标列举出来,然后求所有连续子序列的各所有元素和,通过比较各个元素和得出最大值,将最大值存储起来,得出最大连续子序列和。

菜鸟的博客~ 1683
上一篇: 《算法设计与分析》之分治法
下一篇: 《算法设计与分析》之回溯法
qq_60587708
博客等级 码龄5年 7粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值