1、问题描述

修建输油管道或者挖水渠,方向都是指向正南正北或者正东正西。然后有多个油井或者水井需要向管道或者水渠修建小分支管道或者水渠,求输油管道或者水渠的位置,使得所有的油管小分支长度总和最小或者所有的水渠小分支长度总和最小。

例题:

某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。如果给定n口油井的位置, 即它们的x坐标(东西向)和y坐标(南北向), 应如何确定主管道的最优位置, 即使各油井到主管道之间的输油管道长度总和最小的位置。示意图如下:

2、分析

(1)问题本质是求一条直线y = yk,使得所有给定点到此直线的距离和最短。又因为直线y=y0平行于x轴,所以可以不用考虑横坐标,降维化简成一维问题:有n个数值y1,y2,y3.......yn,找一个数值yk,使得n个数值与yk的距离和最小。

(2)图例分析:n取值可以为奇数和偶数,两种情况有些差异,此处分开讨论

n为奇数时:

当yk位于a2处时,距离和D=a3-a1,当yk偏离a2,比如位于a1-a2间时,距离和D=(yk-a1)+(a2-yk)+(a3-yk) =a3-a1+(a2-yk),因为a2-yk >0,所以可知只有直线位于中位数a2位置时,距离和最短,中位数就是我们要找的数值。

n为偶数时:

设有4个值a1、a2、a3、a4,当yk位于a2-a3之间时,距离和D=(a3-a2)+(a4-a1),当yk处于别的数值区间时,

比如在a1-a2时,距离和D=(yk-a1)+(a2-yk)+(a3-yk)+(a4-yk),

其中a3-yk=(a3-a2)+(a2-yk),(a4-yk) = (a4-a2)+(a2-yk),带入上式可得到:

D=(yk-a1)+(a2-yk)+(a3-a2)+(a2-yk)+(a4-a2)+(a2-yk) =(a3-a2)+(a4-a1)+2(a2-yk),其中a2-yk > 0,记2(a2-yk)为d,最终化简为

D=(a3-a2)+(a4-a1)+d,其中d>0。我们会发现只有yk属于[a2,a3]时,距离和才会最小,而且在[a2,a3]任意位置,距离和都是固定的。所以yk可以取(a2,a3)区间的任意整数,也可以取a2或者a3,当取a2或者a3时,也就是取n个数值的中位数,与上述n为奇数时讨论的情况相同,都是找n个数的中位数问题。所以综合上述对于n为奇和偶的讨论,此问题本质是求n个数的中位数。

3、求中位数算法(分治)

(1)写个random_partition(A,p,r)方法,随机选择一个主元,通过多次比较和交换找到主元在数组A中的最终位置i使得A[p]到A[p+i-1]的元素都小于等于主元,而A[p+i]到A[r]的元素都大于主元,最后把主元交换到位置i,同时返回主元的下标i;

(2)分治算法循环调用random_partition(A,p,r),如果返回值i==中位数的下标位置m,则直接返回;如果i小于m则递归调用右侧部分数组;如果i大于m则递归调用左侧部分数组。

4、代码

import java.util.*;public class Main {public static void main(String[] args) {int [] arr = {1,8,2,9,8,0,2,9,1,8,7};int len = arr.length;if(len == 1){System.out.println(arr[0]);return;}if(len % 2 == 0){System.out.println(getMiddle(arr,0,len-1,len/2));}else{System.out.println(getMiddle(arr,0,len-1,(len+1)/2));}}//此问题是找出第k小的数值static int getMiddle(int [] arr,int left,int right,int k){if(left == right){return arr[left];}int temIndex = random_partition(arr,left,right);int goalIndex = temIndex - left + 1;if(goalIndex == k){return arr[temIndex];}else if(goalIndex > k){return getMiddle(arr,left,temIndex-1,k);}else{return getMiddle(arr,temIndex+1,right,k - goalIndex);}}static int random_partition(int [] arr,int left,int right){// 随机获取主元,可以是left到right之间的任意一个数,包括头尾int randomIndex = getRandom(left,right);// 随机获取的主元与最后一个元素交换位置if(randomIndex != right){swap(arr,randomIndex,right);}// 接下来通过多次比较和交换,找到主元的位置,并把主元放到最终的位置,同时返回主要最终位置的下标int leftIndex = left - 1;int mainFactor = arr[right];// 下标为right的不参与比较,j上界为right-1for(int j = left; j <= right - 1;j++){if(arr[j] < mainFactor){// leftIndex标定的元素是目前所知的比主元小的最右面的元素leftIndex++;swap(arr,leftIndex,j);}}// 下面这个交换是把主元放到最终的位置swap(arr,leftIndex+1,right);return leftIndex+1;}// 交换数组中下标为left和right的元素static void swap(int [] arr,int left,int right){int tem = arr[left];arr[left] = arr[right];arr[right] = tem;}// 获取min到max之间的随机一个数,包括min和maxstatic int getRandom(int min,int max){// 返回[0.0,1.0)的double型数值return (int)(Math.random()*(max-min)+min);}
}

参考博客:https://blog.csdn.net/u010111016/article/details/51446497?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBa

输油管道或水井挖水渠中路径和最短问题相关推荐

  1. quartusii开发过程中路径不能出现空格或中文

    quartusii开发过程中路径不能出现空格或中文,否则软件出现.stf文件错误提示,开发环境搭建的时候也不能出现空格和中文,否则也会报错.

  2. Java Web开发中路径问题小结

    Java Web开发中,路径问题是个挺麻烦的问题,本文小结了几个常见的路径问题,希望能对各位读者有所帮助. (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 ...

  3. 挖一挖C#中那些我们不常用的东西之系列(3)——StackTrace,Trim

    挖一挖C#中那些我们不常用的东西之系列(3)--StackTrace,Trim 原文:挖一挖C#中那些我们不常用的东西之系列(3)--StackTrace,Trim 时间太快了,三月又要过去了,告别一 ...

  4. servlet——web应用中路径问题

    servlet--web应用中路径问题 target.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//E ...

  5. PHP中路径怎么用?

    PHP中路径怎么用? 在HTML一般使用网络路径: 例如:http://local.icframe.com/App/Home/Controller/IndexController.class.php ...

  6. 直播笔记 | Unity中路径的疑难杂症剖析

    本文首发于洪流学堂微信公众号. 洪流学堂,学Unity快人几步 你好,我是郑洪智,你的技术探路者. 昨天我们直播剖析了Unity中路径的疑难杂症,以下是直播内容精华部分笔记. 完整录播:https:/ ...

  7. 关于cmd中路径包含空格的解决办法

    关于cmd中路径包含空格的解决办法 很多人曾经都纠结于cmd中路径没有空格,昨天看到一篇文章,深受启发 1)最简单的方法就是给路径名上加上"" 然后cd或执行即可: 2)用缩写.比 ...

  8. 【板栗糖GIS】arcmap—如何批量修复mxd中路径失效的数据

    [板栗糖GIS]arcmap-如何批量修复mxd中路径失效的数据 目录 1.出现感叹号的原因 2. 修复办法 2.1 单个修复 2.2 批量修复 1.出现感叹号的原因 当数据和快捷键的发生移动,mxd ...

  9. java log4j 路径配置_log4j配置文件中路径配置一般有三种方法:

    log4j配置文件中路径配置一般有三种方法: (1)绝对路径法:直接配置为系统觉得路径: (2)相对路径法: log4j.appender.logfile.File=../logs/app.log,将 ...

最新文章

  1. Ext.ux.form.SearchField使用方法
  2. 企业运营对 DevOps 的「傲慢与偏见」
  3. IOS-input元素光标偏移乱跑,是什么原因
  4. weblogic从入门到起飞(wlst)(四)
  5. Windows 8消费者预览版发布啦(附离线分享)
  6. unity深度查找某个子物体和遍历所有子物体方法
  7. C#与mongoDB初始环境搭建
  8. HTML5前端开发学习路线建议,学习前端的必备知识点
  9. 单例设计模式-双重检查
  10. python面试题之Python 的特点和优点是什么
  11. USB HID学习:MFC检测USB拔插事件
  12. 原始套接字与抓包过滤规则setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, ...)
  13. 《JAVA程序设计教程(第7版)英文版》pdf 附下载链接
  14. 园林景观cad_9套CAD平面设计素材图,上千个绘图模板随意用,全部打包带走
  15. python步态识别算法_步态识别问题3
  16. 单层感知器python_深度学习之(神经网络)单层感知器(python)(一)
  17. acu风格是什么意思_acu 是什么意思,是一个品牌吗???
  18. 计算机天空之城音乐谱,天谕手游天空之城乐谱代码是什么
  19. [IOS]从零开始搭建基于Xcode7的IOS开发环境和免开发者帐号真机调试运行第一个IOS程序HelloWorld
  20. 如何打造自己有创意的平面设计灵魂作品

热门文章

  1. MySQL的MDL元数据锁
  2. 实验08 软件设计模式及应用
  3. 万字技术干货 |YMatrix 高性能时序数据库引擎的技术实践
  4. Windows 2008R2 +MDT2013+WDS(1)
  5. 【数据分析与挖掘实战】B站影视区数据分析
  6. 一个逗比 程序员 web前端的理想!
  7. 实验六 MPEG音频编码
  8. 什么品牌的护眼台灯比较好?护眼效果最好的台灯推荐
  9. 定形相变复合材料热性能标准测试方法及其改进
  10. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java课堂考勤管理系统t6x5x