邮局选址问题

  邮局选址问题
★问题描述:
在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的
街区中。用x 坐标表示东西向,用y坐标表示南北向。各居民点的位置可以由坐标(x,y)表示。
街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值|x1-x2|+|y1-y2|度量。
居民们希望在城市中选择建立邮局的最佳位置,使n个居民点到邮局的距离总和最小。
★编程任务:
给定n 个居民点的位置,编程计算n 个居民点到邮局的距离总和的最小值。
★数据输入:
由文件input.txt 提供输入数据。文件的第1 行是居民点数n,1£n£10000。接下来n 行
是居民点的位置,每行2 个整数x 和y,-10000£x,y£10000。
★结果输出:
程序运行结束时,将计算结果输出到文件output.txt 中。文件的第1 行中的数是n 个居
民点到邮局的距离总和的最小值。
★输入文件示例 输出文件示例
Input.txt   output.txt
5
1 2
2 2
1 3
3 -2
3 3             10
运行环境: Windows XP,(开发环境:VC6.0)
运行过程说明: 本实验设计并实现了三种算法,
双击postOfficeQuickSort.exe或postOfficeRandomSelect.exe或postOfficeTimeLinearSelect.exe
按照提示输入 数据文件:input_assign01_xx.dat,每次输入一个文件名,回车,即可在output.txt中查看输出结果。
算法设计(包括算法设计过程中相关内容的说明、数据结构的选择、 算法详细描述及算法分析):
●1.设计说明:
设给定的n个居民点的位置坐标为:(x0,y0),(x1,y1),...,(xn-1,yn-1)。
设x0,x1,...,xn-1的中位数为median(x) 。通过进一步观察可知, median(x) 是的最优解。
邮局选址问题实际上是求中位数的问题。
●2.算法设计:
2.1数据结构:
将文件中读入的居民点坐标存放于数组中,横纵坐标各保存在一个数组中。
2.2算法描述:

postOffice()
{
int dx = getMidX(); //求横坐标中位数
int dy = getMidY(); //求纵坐标中位数
for(int i=0;i<n;i++) //计算距离总和
Distance += abs(x[i]-dx)+abs(y[i]-dy);
}
求中位数的过程用三种算法进行了设计:
快速排序选择中位数
快速排序算法qsort将n个居民点的x 坐标和y坐标分别排序后,计算出中位数median(x)和median( y),由此容易求得n个居民点到邮局的距离总和的最小值。
//--------------------------------------------
//求居民点到邮局的距离和的最小值
//prameter:横坐标数组,纵坐标数组,数组大小
//return:居民点到邮局的距离和的最小值
//--------------------------------------------
int postOffice(int * x, int * y, int size)
{
qsort(x,size,sizeof(int),compare); //快排数组x
qsort(y,size,sizeof(int),compare);
int min = getMinSumDistance(x,size) + getMinSumDistance(y,size);
//居民点到邮局的距离和的最小值
return min;
}
(2)随机选择法求中位数
用随机选择算法randomizedSelect 选择一个基准数,以此进行二分划分,计算出中位数median(x) 和median( y),然后计算n个居民点到邮局的距离总和的最小值。
//--------------------------------------------
//求居民点到邮局的距离和的最小值
//prameter:横坐标数组,纵坐标数组,数组大小
//return:居民点到邮局的距离和的最小值
//--------------------------------------------
int postOffice(int * x, int * y, int size)
{
int minX = randomizedSelect(x, 0, size - 1,(size + 1)/2);
int minY = randomizedSelect(y, 0, size - 1,(size + 1)/2);
int min = getMinSumDistance(x, size, minX) + getMinSumDistance(y, size, minY);
return min;
}
(3)线性时间选择求中位数
用最坏情况下的线性时间选择算法select计算出中位数median(x)和
median( y),然后计算n个居民点到邮局的距离总和的最小值。
//--------------------------------------------
//求居民点到邮局的距离和的最小值
//prameter:横坐标数组,纵坐标数组,数组大小
//return:居民点到邮局的距离和的最小值
//--------------------------------------------
int postOffice(int * x, int * y, int size)
{
int minX = select(x, 0, size - 1,(size + 1)/2);
int minY = select(y, 0, size - 1,(size + 1)/2);
int min = getMinSumDistance(x, size, minX) + getMinSumDistance(y, size, minY);
return min;
}
最坏情况下的线性时间选择算法select:
(1)将n个输入元素划分成n/5的上界 个组,每组5个元素,只可能有一个组不是5个元素。用冒泡排序算法,将每组中的元素排好序,并取出每组的中位数,共n/5的上界 个。
 (2)找出这n/5的上界个元素的中位数。如果n/5的上界是偶数,就找它的2个中位数中较大的一个,以这个元素作为划分基准。
2.3算法分析
快速排序选择中位数
快排时间复杂度:O(nlogn),求距离和:O(n)
总复杂度:O(nlogn)。
(2)随机选择法求中位数
最坏情况下,randomizedSelect的时间复杂度是:O(n2),平均时间为O(n)
故时间复杂度为:O(n2)。
线性时间选择求中位数
最坏情况下,select算法时间复杂度为O(n),求距离和:O(n)
总复杂度:O(n)。
以上三种算法的空间复杂度均为O(n)。
其他说明:
本算法 设计说明部分 部分内容(公式)来自互联网

 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值