算法设计

2020-09-20  本文已影响0人  谭英智

稳定匹配问题

algorithm-stable-match

描述

有若干个男和若干个女,每个男对每个女都有一个偏好值,女同理,怎么找出一个算法,使得匹配适当

适当性

配对结果不存在单方面更改使得获取到更好得一方,而那方也正好更喜欢此方

Gale-Shapley算法

分析

上述算法,男总是能选择到最优,但是女总是选择到次优,所以算法是不公平得。

如果在信息不对称的情况,男的并不能获取到女的优先偏好,那么女可以通过说谎,把优先顺序置换,那么此时女可以获得更优解

DAG的拓扑顺序

algorithm-dag

DAG定义

有向无环图

拓扑

DAG可以转化为从左到右序列的结构

转换算法

贪婪算法

Coin Changing Problem(最小硬币问题)

问题

有若干面值硬币,给定一个金额,求出使用最小硬币可以达到金额的组合

贪婪算法

分析

贪婪算法并不能总是得到最优解

例如面值为1 4 5,金额为8,那么如果使用贪婪算法,得到{5,1,1,1},并不是最优解{4, 4}

对于此问题,可以化解为f(n) = min(1+f(n-k_1) ,1+ f(n-k_2),1+ f(n-k_3))

k_1>k_2>k_3...

如果使得对于任意n,满足f(n-k_1)<f(n-k_2)<f(n-k_3)...

那么此时可以使用贪婪算法得到最优解

Interval Scheduling(贪心区间调度)

algorithm-interval-scheduling

求最大任务数

列出动态规划公式

f(startTime) = max( 1+ f(endTime1) , 1+ f(endTime2) ....1+ f(endTimen) )

如果按照endTime从小到达排序,可得

f(endTime_k-1)>=f(endTime_k-2)

所以此时如果使用贪婪算法,每次取endtime最早的任务处理,可得最优解

Interval Partitioning Problem(时段区间最小问题)

algorithm-interval-partitioning

描述

安排若干个区间,把相容得任务放在同一个区间,求区间的最小数

算法

使用贪婪算法,分别使用最早开始时间优先,最后结束时间优先,最长覆盖优先

分析上述三种算法,容易得到最后结束时间优先和最长覆盖优先反例。

下面分析最早开始时间优先的证明

先给出算法:

证明

sheduling to minimize lateness(最小延迟调度)

algorithm-lateness

问题

算法

优先选择

容易得到1和3,容易得到反例,故不能得到最优解

algorithm-lateness-not

以下分析第2钟情况

过程
证明

shortest path(最短路径)

Dijkstra算法

最小生成树

algorithm-spanning-tree

Kruskal算法

分治

求逆序对个数

algorithm-inversions

通过归并算法

algorithm-inversions_merge

动态规划

最大权重区间调度问题

列出动态规划

f(startTime) = max(w_i+f(endTime_i), w_i-1 + f(endTime_i-1)....) if startTime_i>startTime

通过分析上述公式,虽然f(endTime_i)>f(endTime_i-1),但是无法保证w_i>w_i-1,可知无法通过贪婪算法求得最优解

背包问题

algorithm-knasack

字串对齐问题

问题

有两个字符串

实现diff算法,得出它们之间最小的不同

algorithm-diff

算法

cost(i,j) = j if i==0

cost(i,j) = i if j==0

cost(i,j) = cost(i-1, j-1) if s1[i] == s2[j]

else

cost(i,j) = min(cost(i-1, j) + 1, cost(i, j-1) + 1)

最短路径(带负权重边)

f(u->v) = min(w1 + f(n1->v), w2 + f(n2->v), w3 + f(n3->v) ... )

其中n为u的下一节点,w为u到n的cost

网络最大流

algorithm-network

网络如图所示,如何找到网络从s到t能通过的最大流量?

最小割

algorithm-network-min-cut

此为网络中的一种流量,我们把图分为两部分,把它从其中一部分流向另一部分的流量叫做割。不难证明,网络的最大流量,必然是割的最小值。

Ford-Fulkerson算法

algorithm-network-ff

choosing good augmenting paths算法

algorithm-network-goodarg

如图,在选择增广路策略中,如果选择不当,例如总是选择1,那么可能会导致在多项式时间内不能让算法终止。

此算法,通过引入多尺度,来控制增广路的选择

二分图问题

algorithm-network-two

描述

图被分为左右两个子图,子图内的节点不会有边相连,有若干条边关联左右两个子图的节点。

问怎么匹配,使得左右子图匹配的节点数最多

算法

algorithm-network-two-2-max

通过引入s和t节点,每条边设置为流量1,二分图问题转化为最大流问题。

通过FF算法,能够找出从左子图流向右子图的最大流,则它们的最大匹配

近邻搜索

通过爬山法局部找更优的点

详细可看另外一篇--人工智能

上一篇 下一篇

猜你喜欢

热点阅读