附:蛮力法

  • 格式:ppt
  • 大小:1.37 MB
  • 文档页数:32

下载文档原格式

  / 32
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

cover false; break; if (cover = true |V’| < |C|) then C V'; return C; end
O(mn2n)
3.5.4 最大独立集/最小顶点覆盖
最大独立集与最小顶点覆盖的关系? 给定图G = <V,E>,IV是G的一个独立集,当
且仅当V \ I是G的一个顶点覆盖
时间复杂度O(n2)
3.5 若干最优化问题
最优化问题:在问题的可行域F中找到一个解 x, 使得某目标函数值f(x)最小或最大。
约束条件:解x应满足某项约束c(x)=true 连续优化问题:解的数量可能有无穷多 组合优化问题:解的数量有限时,总是可以用
蛮力法求解,但算法效率可能很低。
3.5 若干最优化问题
输入:两个字符串T 和P 输出:T 中P首次出现的位置(T中不包含P则返
回−1) T (Text), P (Pattern)
3.1 字符串匹配
蛮力法:从左到右扫描T,检查T中是否含有子串P
m i c r o s o f t wi n dows sof t
3.1 字符串匹配
蛮力法:从左到右扫描T,检查T中是否含有子串P
O(m(m−n)) 存在改进可能?
3.2 矩阵相乘
输入:m×n型矩阵A和n×p型矩阵B 输出:C = A×B
3.2 矩阵相乘
[矩阵相乘算法]
Algorithm MatrixMultiple(A, B: int[,])
begin
let (m,n) = |A|, (n,p)= |B|, C = new int[m,p];
时间复杂度:O(2n)
3.4 冒泡排序
冒泡排序过程
1. 令 k = 1; 2. for i = 1 to nk do
if (A[i1] > A[i]) then A[i1] ↔ A[i]
3. 当k = n时算法结束;否则令 k = k+1, 转第2步
[排序问题] 输入:任意一个长度为n的数组A 输出:这组数的一个重排列A′ ,其满足 A′[0]≤A′[1]≤…≤A′[n−1]
end
3.5.3 子集和问题的最优化版本
输入:一组n个整数的集合S,以及一个目标数z 输出:S的一个子集S*,使其元素之和不大于z
的情况下尽可能地大
3.5.3 子集和问题的最优化版本
蛮力法:检查S的每个子集 S’,找出其中满足约 束且元素之和最大的一个子集
可视为0-1背包的特殊情况
3.5.4 最大独立集/最小顶点覆盖
3.1 字符串匹配
蛮力法:从左到右扫描T,检查T中是否含有子串P
m i c r o s o f t wi n dows sof t
3.1 字符串匹配
蛮力法:从左到右扫描T,检查T中是否含有子串P
m i c r o s o f t wi n dows sof t
匹配成功,返回位置索引5
3.1 字符串匹配
图的独立集:图中两两互不相邻的顶点所组成 的集合。
输入:一个无向图G = <V,E> 输出:G中顶点数最多的一个独立集
3.5.4 最大独立集/最小顶点覆盖
蛮力法:穷举V的所有子集V′,判断每个子集是 否为独立集,并从中选出规模最大的一个
foreachA(lguoritVh’m) dBorute_IndependentSet(V: set<int>; E: forseeatc<hin(tvintV>)’\{u}) do ibfe(g(iun,v) E) then independent false; break; if (inledteIp=enΦde; nt = false) then break; foreach V’ Powerset(V) do
let d_best = +∞, n = |P|, a = b = -1;
for i = 0 to n-2 do
for j = i+1 to n-1 do
let (dx, dy) = (P[i].x-P[j].x, P[i].y-P[j].y);
d = dx*dx + dy*dy;
if (d<d_best) then d_best d;
和等于z
3.3 子集和问题
蛮力法:检查S的每个子集 S’,直至找到一个元素 之和等于z的子集,失败则返回空集。
[子集和问题的蛮力算法] Algorithm Brute_Subset(z: int; S: int[] ) begin
foreach S’ Powerset(S) do if (Sum(S’) = z) then return S'; return Φ; end
蛮力法:检查S的每个子集S′,并在物品重量之 和小于W的子集中选出价值之和最大的一个。
[0-1背包问题的蛮力算法]
Algorithm Brute_Knapsack(W: int; S: Item[])
begin
let v_best = 0, S_best = Φ; foreach S’ Powerset(S) do
O(mn22n)
return I;
end
3.5.4 最大独立集/最小顶点覆盖
图G = <V,E>顶点覆盖:V的一个子集V′,它包 含E中每条边的至少一个端点。
输入:一个无向图G = <V,E> 输出:G中顶点数最少的一个顶点覆盖
3.5.4 最大独立集/最小顶点覆盖
蛮力法:穷举V的所有子集V′,判断每个子集是否 为图的顶点覆盖,并从中选出规模最小的一个
for i = 0 to m-1 do
for j = 0 to p−1 do
O(mnp)
for k = 0 to n−1 do
不存在改进
C[i,j]) C[i,j] + A[i,k]*B[k,j]; 可能
return C;
end
3.3 子集和问题
输入:一组n个整数的集合S,以及一个目标数z 输出:判断是否存在S的一个子集S*,其元素之
Algorithm Brute_VertexCover(V: set<int>; E: set<intint>) begin let C = V; foreach V’ Powerset(V) do
let cover = true; foreach ((u,v) E) do if (u V’ v V’) then
let d = 0; foreach (eL) do
d d + w[e.a, e.b]; d d + w[L.tail, L.head]; if (d < d_best) then
d_best d; L_best L; return L_best; end
O((n+1)!)
课后作业:
1、习题3-15 2、习题3-17 3、习题3-19
时间复杂度O(n2n)
let w = 0, v = 0;
foreach x S’ do
w w + x.w; v v + x.v;
if (w ≤ W v > v_best) then v_best v; S_best S’; return (v_best, S_best);
其他更优的 方法?
3.4 冒泡排序
[冒泡排序算法] Algorithm BubbleSort(A: int[]) begin
let n = |A|; for k = 1 to n-1 do for i = 1 to n−k do
if (A[i-1] > A[i]) then (A[i-1], A[i]) (A[i], A[i-1]); end
最近点对问题 0-1背包问题 最优子集和问题 最大独立集和最小顶点覆盖 旅行商问题
3.5.1 最近点对问题
输入:二维平面上n个点的集合P 输出:其中距离最近的两个点
Байду номын сангаас
3.5.1 最近点对问题
蛮[最力近法点:对计问算题出的P蛮中力所算有法顶]点对之间的距离,并取其 A中lgo距ri离thm最小Br的ute一_C对lo顶se点tPo。ints(P: Point[]) begin
[字符串匹配算法] Algorithm Brute_Match(T, P: string) begin let i = 0, n = |T|, m = |P|; while (i ≤ n−m) do
let j = 0; while (j < m) do if (T[i+j] ≠ P[j]) then break; j j + 1; if (j = m) then return i; //匹配成功 i i + 1; return −1; end
m i c r o s o f t wi n dows sof t
3.1 字符串匹配
蛮力法:从左到右扫描T,检查T中是否含有子串P
m i c r o s o f t wi n dows sof t
3.1 字符串匹配
蛮力法:从左到右扫描T,检查T中是否含有子串P
m i c r o s o f t wi n dows sof t
3.5.5 旅行商问题
输入:一个加权连通图G = <V,E,w> 输出:通过G中所有顶点且距离最短的一条回路
3.5.5 旅行商问题
蛮力法:穷举图中n!条回路,并从中选出距离最短 的一条
Algorithm Brute_TSP(G: Graph; w: int[,]) begin
let d_best = +∞, L_best = Φ; foreach L Perms(G.V) do
O(n2)
(a,b) (i,j);
存在改
return (a,b); end
进可能?
3.5.2 (0-1)背包问题
输入:n件物品的集合S (其中第i件物品的重量 和价值分别为S[i].w和S[i].v),以及背包的最大 承重量W
输出:S的一个子集A,其重量之和不大于W, 且价值之和尽可能大。
3.5.2 (0-1)背包问题
第3章 蛮力法
3.1 字符串匹配 3.2 矩阵相乘 3.3 子集和问题 3.4 冒泡排序 3.5 若干最优化问题
蛮力法
思想:穷尽所有可能的情况来寻找问题的解
优势:思路简单,设计难度低
缺点:运行效率低
适用范围: 1、一些问题只能采用蛮力法求解 2、蛮力法设计简单,用其求解一些小问题 也是可接受的
3.1 字符串匹配
let independent = true;
foreach (u V’) do
foreach (v V’\{u}) do
if ((u,v) E) then independent false; break;
if (independent = false) then break;
if (independent = true |V’| > |I|) then I V';