收藏 分销(赏)

算法实验报告实验21输油管道问题.docx

上传人:精**** 文档编号:3762690 上传时间:2024-07-17 格式:DOCX 页数:5 大小:70.24KB 下载积分:6 金币
下载 相关 举报
算法实验报告实验21输油管道问题.docx_第1页
第1页 / 共5页
算法实验报告实验21输油管道问题.docx_第2页
第2页 / 共5页


点击查看更多>>
资源描述
算法分析与设计 实验报告 实验名称: 输油管道问题 实验日期: 2011/03/13 学生姓名: 学生学号: 一、实验目的 某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。如果给定n口油井的位置,即它们的x坐标(东西向)和y坐标(南北向),应如何确定主管道的最优位置,即使各油井到主管道之间的输油管道长度总和最小的位置?证明可在线性时间内确定主管道的最优位置。   给定n口油井的位置,编程计算各油井到主管道之间的输油管道最小长度总和。 二、实验环境 Windows7 + Visual Studio 2010 三、实验内容 1. 设计思路 因为输油管道是东西走向,每口油井到管道的最短路径都是垂直于管道的。所以,该问题实际是求得所有油井的Y坐标的中位数。利用线性时间选择算法找到坐标中位数。再求出最小长度总和。 2. 相关模块 #include<iostream> #include<fstream> #include<string> #include<cstdlib> #include<cmath> using namespace std; void write(char* filename,int length); int RandomizedSelect(int *a,int p,int r,int k); int RandomizedPartition(int *a,int p,int r); int Partition(int *a,int p,int r); void swap(int&,int&); int Random(int p,int r); int lengthOfPipeline(int *a,int size,int length); int main() { int size=0; char* inFileName = "H:\\C++\\Algorithms\\in.txt"; char* outFileName = "H:\\C++\\Algorithms\\out.txt"; ifstream input(inFileName,ios::in); //从文件读取数据 input >> size; int *a = new int[size]; int readcount=1,i=0; while(readcount<=(size*2)) { int temp = 0; input >> temp; if(readcount%2==0) a[i++]=temp; readcount++; } input.close(); //获取数据中位数y,即为通道Y坐标 int length = RandomizedSelect(a,0,size-1,(size+1)/2); //将总的管道长度写入out.txt文件中 write(outFileName,lengthOfPipeline(a,size,length)); system("pause"); return 0; } //将最后结果写入文件中 void write(char* filename,int length) { ofstream output; output.open(filename,ofstream::out); output<<length; output.close(); } //随机获取p到r中的数 int Random(int p,int r) { return p + rand()%(r - p + 1); } //划分 int Partition(int *a,int p,int r) { int i = p, j = r + 1; int x = a[p]; //将<x的元素交换到左边区域 //将>x的元素交换到左边区域 while(true) { while(a[++i]<x&&i<r); while(a[--j]>x); if(i>=j)break; swap(a[i],a[j]); } a[p]=a[j]; a[j]=x; return j; } //产生随机划分优化算法 int RandomizedPartition(int *a,int p,int r) { int i= Random(p,r); swap(a[i],a[p]); return Partition(a,p,r); } //利用随机划分来找到中位数 int RandomizedSelect(int *a,int p,int r,int k) { if(p>=r)return a[p]; int i = RandomizedPartition(a,p,r), j = i-p+1; if (k == j) return a[i]; if(k<j) return RandomizedSelect(a,p,i-1,k); else return RandomizedSelect(a,i+1,r,k-j); } //交换两个数据 void swap(int &n,int &m) { int temp = n; n = m; m = temp; } //计算输油管道最小长度总和 int lengthOfPipeline(int *a,int size,int length) { int distance = 0; for(int i=0; i<size; ++i) distance += abs(a[i] - length); return distance; } 四、实验结果分析及结论 算法RandomizedSelect 可以在O(n)平均时间内找出n个坐标中的中位数。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服