1、选择排序和冒泡排序
1.1、选择排序
时间复杂度:
即
1.2、冒泡排序
蛮力法在排序问题上还有另外一个应用,它比较表中相邻的元素,如果它们是逆序的话,就交换它们的位置。重复多次以后,最终最大的元素就沉到列表的最后一个位置。第二遍操作将第二大的元素沉下去。这样一直做,直到n-1遍后,该列表就排序好了。
下面是该算法的伪代码
时间复杂度:
2、顺序查找和蛮力字符串匹配
2.1、顺序查找
顺序查找只是将给定列表中的连续元素和和给定的查找键进行比较,直到遇到一个匹配的元素(成功查找),或者在遇到匹配元素前就遍历了整个列表(失败查找)。实现顺序查找时,用到一个小技巧:如果我们把查找键添加到列表的末尾,那么查找就一定会成功,所以不必在算法的每次循环时都检查是否到了列表的末尾。以下是这个增强代码的伪代码:
如果已给定的数组是有序的,我们可以对该算法做另外一个改进:在这种列表中,只要遇到一个大于或等于查找键的元素,查找就可以停止了。
时间复杂度:线性时间复杂度
2.2、蛮力字符串匹配
给定一个n字符组成的字符串【称为文本】,一个m个字符的串【称为模式】,从文本中寻找匹配模式的子串。
如果还需要寻找另一个匹配子串,字符串匹配算法可以继续工作,直到搜索到全部的匹配子串。
最坏时间复杂度O(nm)
3、最近对和凸包问题的蛮力算法
3.1、最近对问题
该算法的基本操作是求平方,平方操作的执行次数可以计算如下,
3.2、凸包问题
对于平面上的一个点集合(有限的或者无限的),如果以集合中任意两点p和q为端点的线段都属于该集合,我们说这个集合是凸的。
定义:一个点集合S的凸包是包含S的最小凸集合(最小指,S的凸包一定是所有包含S的凸集合的子集)
如果S是凸的,它的凸包很明显是它本身。如果S是两个点的集合,它的凸包就是连接这两个点的线段。如果S是由三个不同线的点组成的集合,它的凸包就是以这三个点为顶点的三角形;如果三点同线,凸包是以距离最长的两个点为端点的线段。
凸包案例:
定理:任意包含n > 2个点(不共线的点)的集合S的凸包是以S中的某些点为顶点的凸多边形(如果所有的点都位于同一条直线上,多边形退化为一条线段,但它的两个端点任包含在S中)。
缺乏效率蛮力算法:对于一个n个点集合中的两个点pi和pj,当且仅当该集合中的其它点都位于穿过这两点的直线的同一边时,它们的连线是该集合凸包边界的一部分。对每一个点都做一遍检验之后,满足条件的线段就构成了该凸包的边界。
其次,这样一根直线把平面分为两个半平面:其中一个半平面中的点都满足ax+by>c,而另一个半平面中的点都满足ax+by<c(对于线上的点来说ax+by=c)。因此为了检验某些点是否位于这条直线的同一边,只需把每个点代入ax+by-c,检验这个表达式的符号是否相同。
该算法的时间效率:它属于
对于不同点的每一个n(n-1)/2来说,我们要对其它n-2个点求出ax+by-c的符号。
4、穷举查找
4.1、旅行商问题
哈密顿回路也可以定义为n+1个相邻顶点
的一个序列。其中序列的第一点顶点和最后一个顶点是相同的,而其它n-1个顶点都是互不相同的。并且,在不失一般性的前提下,可以假设,所有的回路都开始和结束于相同的特定顶点。因此,可以通过生成n-1个中间城市的组合来得到所有的旅行线路,计算这些线路的长度,然后求得最短的线路。
案例:
4.2、背包问题
4.3、分配问题
5、深度优先查找和广度优先查找
略