算法设计与分析之二 蛮力法

目录


1.蛮力法的设计思想
2.蛮力法优点
3. 冒泡排序分析
4. 选择排序分析
5. 蛮力法中冒泡排序与选择排序的时间空间复杂度分析
6. 蛮力法C语言实现
7. 算法稳定性的问题
8. 百钱买百鸡的问题
9. 补充:鸡尾酒排序法
10.蛮力法的思考


作为算法设计技术中最简单的一种设计策略,蛮力法从最先开始接触编程语言时就一直伴随着我们。

1. 蛮力法的设计思想

课本上的定义:蛮力法是指一种简单直接

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

蛮力法解决问题的方法

根据问题中的条件将可能的情况一一列举出来,逐一尝试从中找出满足问题条件的解。但有时一一列举出的情况数目很大,如果超过了我们所能忍受的范围,则需要进一步考虑,排除一些明显不合理的情况,尽可能减少问题可能解的列举数目。

蛮力法解决问题的算法设计:

1)找出枚举范围:分析问题所涉及的各种情况。
2)找出约束条件:分析问题的解需要满足的条件,并用逻辑表达式表示。

2.蛮力法优点


  1. 逻辑清晰,编写程序简洁
  2. 对于一些重要的问题(比如:排序、查找、矩阵乘法和字符串匹配),可以产生一些合理的算法
  3. 解决问题的实例很少时,可以花费较少的代价
  4. 可以解决一些小规模的问题(使用优化的算法没有必要,而且某些优化算法本身较复杂)
  5. 可以作为其他高效算法的衡量标准

3. 冒泡排序分析(稳定性排序方法)

第i趟排序对序列的前n-i+1个元素从第一个元素开始依次作如下操作:相邻的两个元素比较大小,若前者大于后者,则两个元素交换位置,否则不交换位置。该n-i+1个元素中最大值元素移到该n-i+1个元素的最后。冒泡排序方法比较适合于参加排序的序列的原始状态基本有序的情况。

4. 选择排序分析(非稳定性排序方法)

选择排序开始的时候,扫描整个序列,找到整个序列的最小记录和序列中的第一个记录交换,从而将最小记录放到它在有序区的最终位置上,然后再从第二个记录开始扫描序列,找到n-1个序列中的最小记录,再和第二个记录交换位置。一般地,第i趟排序从第i个记录开始扫描序列,在n-i+1(1≤i≤n-1)个记录中找到关键码最小的记录,并和第i个记录交换作为有序序列的第i个记录。
每一趟排序从序列中未排序的元素中选择一个值最小的元素,将其置于没有排好序的元素的最前面。已排好序的元素不必交换。

5. 蛮力法中冒泡排序与选择排序的时间空间复杂度分析

1.选择排序:

平均时间复杂度o(n^2 )
最好时间复杂度o(n^2 )
最坏时间复杂度o(n^2 )
空间复杂度o(1)

2.冒泡排序:

平均时间复杂度o(n^2 )
最好时间复杂度o(n)
最坏时间复杂度o(n^2 )
空间复杂度o(1)

6.1蛮力法中冒泡排序C语言实现

#include <stdio.h>
void maopaopaixu(int s[],int n);
void main()
{int s[20];int i;int n;printf("请输入要输入的个数:");scanf("%d",&n);printf("请输入要排序的序列:\n");for (i = 0; i < n; i++){scanf("%d",&s[i]);}maopaopaixu(s,n);printf("排序后的序列:\n");for (i = 0; i < n; i++){printf("%d\t",s[i]);}
}
void maopaopaixu(int s[],int n)
{int i, j;int temp;for(i = 0; i < n; i++){for (j = 0; j < n-1; j++){if(s[i] < s[j]){temp = s[i];s[i] = s[j];s[j] = temp;}}}
}

6.2蛮力法中选择排序C语言实现

#include <stdio.h>
void suanzepaixu(int s[],int n);
void main()
{int n;int i;int s[20];printf("请输入要输入的个数");scanf("%d",&n);printf("请输入要排序的数据\n");for(i = 0; i < n; i++){scanf("%d",&s[i]);}suanzepaixu(s,n);for (i = 0; i < n; i++){printf("%d\t",s[i]);}
}
void suanzepaixu(int s[],int n)
{int i,j;int k;int temp;for (i = 0; i < n; i++){k = i;for(j = i + 1; j < n; j++){if(s[j] < s[k]){k = j;}}if(k != i){temp = s[k];s[k] = s[i];s[i] = temp;}}
}

7.算法稳定性的问题

冒泡排序:

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,不用交换;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

选择排序:

选择排序即扫描整个序列,找到整个序列的最小记录和序列中的第一个记录交换,从而将最小记录放到它在有序区的最终位置上,然后再从第二个记录开始扫描序列,找到n-1个序列中的最小记录,再和第二个记录交换位置。一个序列当如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。因此选择排序是非稳定性的。

8.百钱买百鸡问题

数学家张丘建提出百鸡百钱问题,今有鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡,问鸡翁,鸡母,鸡雏各几何?翻译后:设鸡翁,鸡母,鸡雏分别为x,y,z,给出一百钱要买百鸡。如果全买公鸡最多买20只,显然x在0—20之间,同理y的取值在0-33之间,所以根据分析,不难用枚举法求出问题的所有符合情况的解。
这是个经典问题,从我们学数学就避不开的问题,用蛮力法实现应该是最不费脑筋的。首先,简单分析一下枚举范围,都买公鸡最多二十只,x的范围0-20,都买母鸡最多30只,y的范围0-30。

#include <stdio.h>
//鸡翁x,鸡母y,鸡雏z
void main()
{int z = 0;int x, y;//鸡翁的数量变化范围for (x= 0; x < 20; x++){//鸡母的数量变化范围for (y = 0; y < 33; y++){z = 100 - x - y;//鸡雏的受制约范围if (z % 3 == 0 && 5 * x + 3 * y + z / 3 == 100){printf("x = %d,y = %d,z = %d\n",x,z,y);}}}
}

9.鸡尾酒排序


鸡尾酒排序法,又名双向冒泡排序法,算法传统冒泡法的一点改进。但是对于鸡尾酒排序,算法的时间复杂度与空间复杂度并没有改进。
  不同的是排序的交换次数。某些情况下鸡尾酒排序比普通冒泡排序的交换次数少。比如{2,3,4,1},鸡尾酒排序只需交换2次,而冒泡排序需要三次。总体上,鸡尾酒排序可以获得比冒泡排序稍好的性能。但是完全逆序时,鸡尾酒排序与冒泡排序的效率都非常差。
  鸡尾酒排序的思想就是在从前往后依次循环依靠邻近数据交换实现结果的同时,依次从后往前循环数据交换。前者交换获取未排序最大值,而后者交换获取未排序最小值。实现过程如下图:
  
  



python代码

l = [2,3,4,1,90,6]
size = len(l)
sign = 1
for i in range(int(size / 2)):if sign:sign = 0for j in range(i, size - 1 - i):if l[j] > l[j + 1]:l[j], l[j + 1] = l[j + 1], l[j]for k in range(size - 2 - i, i, -1):if l[k] < l[k - 1]:l[k], l[k - 1] = l[k - 1], l[k]sign = 1  else:break
print(l)

10.蛮力法的思考

用蛮力法设计的算法,一般来说,经过适度的努力后,都可以对算法的第一个版本进行一定程度的改良,改进其时间性能,但只能减少系数,而数量级不会改变。

算法分析学习笔记二 蛮力法相关推荐

  1. 算法分析学习笔记(二) - 栈和队列(上)

    一. 写在前面的话 本篇为"算法分析学习笔记"系列的第二篇,我们来聊一些跟基础数据结构有关的知识.对于网上无数的算法高手来说,这里讨论的东西都太小儿科了,但是作为一个系列的文章,我 ...

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

    算法设计与分析------蛮力法(c语言) 一.蛮力法(穷举法 枚举法) 1.定义 2.蛮力法使用情况 3.蛮力法的优点 4.蛮力法的缺点 5.采用蛮力法设计算法的2类: 6.简单选择排序和冒泡排序 ...

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

    蛮力法 蛮力法概述 蛮力法也称穷举法(枚举法)或暴力法,是一种简单的直接解决问题的方法,通常根据问题的描述和所涉及的概念定义,对问题所有可能的状态(结果)一一进行测试,直到找到解或将全部可能的状态都测 ...

  4. 数据结构与算法 整理笔记---二叉搜索树

    二叉搜索树 查找问题是计算机中非常重要的基础问题 二分查找法 对于有序数组,才能使用二分查找法(排序作用) public class BinarySearch {public static int b ...

  5. 08_Python算法+数据结构笔记-二叉搜索树查询/删除-AVL树旋转/插入/应用-贪心算法

    b站视频:路飞IT学城 清华计算机博士带你学习Python算法+数据结构_哔哩哔哩_bilibili #71 二叉搜索树:查询 import randomclass BiTreeNode:def __ ...

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

    文章目录 一.蛮力算法简介 二.蛮力--枚举法 题目及运行 三.总结 前言 算法语言--Java语言 一.蛮力算法简介 蛮力法是基于计算机运算速度快这一特性,在解决问题时采取的一种"懒惰&q ...

  7. 经典排序算法学习笔记二——快速排序

    快速排序 数据结构 不定 最差时间复杂度 O(n^2) 最优时间复杂度 O (n*log n) 平均时间复杂度 O (n*log n) 最差空间复杂度 根据实现的方式不同而不同 https://zh. ...

  8. 数据结构与算法分析学习笔记

    @前言 迎来了本学期的重头专业课--数据结构与算法分析. 这次我们的老师是来自英国威尔士亚伯大学(Aberystwyth University)的Fred Long教授!!!老师曾以访问学者的身份来到 ...

  9. 数据结构和算法分析学习笔记(三)--二叉查找树的懒惰删除(lazy deletion)

    这次的问题来自<数据结构与算法分析(C++描述)>的习题4.16,如下: -------------------------- 4.16  重做二叉查找树类以实现懒惰删除.注意,这将影响所 ...

最新文章

  1. 「二分查找」之我见!今天刷一道leetcode算法!
  2. MIT发布“全球最快AutoML”,刷新DARPA比赛成绩
  3. Outlook中自定义新邮件提醒
  4. 状态压缩 HDU 1565
  5. AI in RTC 创新挑战赛 | 超分辨率挑战开始了!
  6. idea没有git选项
  7. AngularJS与Angular的区别
  8. 花式模拟【栈结构】做“日志分析”(洛谷P1165题题解,Java语言描述)
  9. c语言第4章作业,《C语言程序设第4章作业.doc
  10. javascript 经常会用到的东西
  11. DJANGO中操作数据库
  12. python fileinput处理多文件
  13. 趋势:指数基金如何做大做强?
  14. 使用 kubeadm快速部署Kubernetes-v1.18
  15. 计算机网络图标显示不出来,网络连接图标不见了的原因和解决方法【详细介绍】...
  16. MongoDB下载安装教程 全
  17. linux 下配置可视化git 冲突合并工具kdiff3
  18. 青光眼 程序员_青光眼-如何不失明:让我们谈谈治疗方法…
  19. Envoy架构理解--理解xDS/Listener/Cluster/Router/Filter
  20. 太原市山大附中2021年高考成绩查询,太原高中排名及分数线,2021太原市高中排名榜最新...

热门文章

  1. Web全栈开发学习笔记—Part2 与服务端通信—d.在服务端将数据Alert出来
  2. 目标检测和感受野的总结和想法
  3. 爱江山更爱美人 Win 10 下利用计划任务自动种地喂猫
  4. 从git下载代码到本地
  5. 高德地图 缩放级别(Zoom) 和 比例尺(scale)之间 的关系
  6. 度盘搜失效?这款网盘搜索神器万万别错过!
  7. perp系列之四:perp下载
  8. 项目部署的常用进程管理命令
  9. dlink虚拟服务器设置,dlink虚拟服务器设置
  10. 苹果发布会:未来代替电脑的产品诞生了?