管道修建问题的算法思考

问题:某区域有n口油井,需要修建输油管道. 根据设计要求,水平方向有一条主管道,每口油井修一条垂直方向的支管道通向主管道. 如何选择主管道的位置,以使得支管道长度的总和最小?
pipe

一、最优解:Y 坐标的中位数

pipe
主管道最优的位置其实就是这些油井的纵坐标排起来后的中位数的位置,然后我们做了说明,如果不是这个位置,不管是这个位置是往下还是往上移动,移动之后都会导致总的直管线向主管道的距离增加。

二、简单的算法实现

1、算法一:
调用 k 次选最小算法
时间复杂度为 O (k n)

2、算法二:
先排序,然后输出第 k 小的数
时间复杂度为 O(n logn)

三、分治算法

假设元素彼此不等,设计思想:
1、 用某个元素 m作为标准将 S 划分成 S1 与 S2,其中 S1的元素小于 m, S2 的元素大于等于 m*.

2、如果 k ≤ |S1|,则在 S1中找第 k 小.
如果 k = |S1|+1,则 m*是第 k 小
如果 k > |S1|+1,则在 S2中找第 k-|S1| - 1小

S分5个一组, 共 nM = n/5组 
每组排序,中位数放到集合 M 
m* Select(M, |M|/2) //S分A,B,C,D 
A,D元素小于m*放 S1,大于m*放S2 
S1  S1 C;   S2  S2 B 
if  k = |S1| + 1  then  输出 m*    
else if  k  |S1|       
       then  Select (S1, k) 
          else  Select (S2, k-|S1|1)  

猜你喜欢

转载自blog.csdn.net/Prototype___/article/details/123993426