最大间隙问题(线性时间算法)
来源:互联网 发布:ubuntu安装gcc5.3 编辑:程序博客网 时间:2024/04/30 15:17
问题:
最大间隙问题。给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。
分析:
该问题最先想到可能就是排序后计算,但排序的时间复杂度最少为O(nlongn),不能满足题意的线性时间算法。所以有一个解决该问题的算法,筒排序。
该算法的思想为,将n个数的最大值、最小值找到,在[ min ,max ]区间内,分成n-1个等大的区间,每个区间的大小为
len = (max - min)/(n-1),然后将n个数字填入到这n-1个区间中,并根据填入的数,找到该区间内数字的最大值与最小值。除去两边的最大值和最小值,只需要将n-2 个数字填入到 n-1个区间中,根据抽屉原理,那至少有一个空的区间,所以,最大间隙一定产生在两个不同区间之间。
代码如下:
#include <stdio.h>#define INF 1<<30struct node{double left,right;double max=-INF,min=INF;int index=0; }x[105];int main(){int i,j;int n;double ans[105],max=-INF,min=INF; scanf("%d",&n);for(i=0;i<n;i++){scanf("%lf",ans+i);if(max<ans[i])max=ans[i];if(min>ans[i])min=ans[i];}double len = (max-min)/(n-1);x[0].left=min;x[0].right=min+len;for(i=1;i<n-1;i++){x[i].left = x[i-1].right;x[i].right = x[i].left + len;}for(i=0;i<n;i++){int temp = (ans[i]-min)/len;if(temp>=n-1)temp=n-2; x[temp].index++;if(ans[i] > x[temp].max)x[temp].max=ans[i];if(ans[i] < x[temp].min)x[temp].min = ans[i];}double Max = -INF;for(i=1;i<n-1;i++){if(x[i].min==INF)x[i].min = x[i-1].max;if(Max<x[i].min - x[i-1].max)Max = x[i].min - x[i-1].max;if(x[i].max==-INF)x[i].max=x[i].min;}printf("%lf\n",Max);return 0;}
0 0
- 最大间隙问题(线性时间算法)
- 最大间隙问题(线性时间算法)
- 最大间隙问题 线性时间算法
- 线性时间算法解决最大间隙问题
- 算法笔记 //02_最大间隙问题(线性时间)
- 最大间隙问题(线性时间)
- 经典算法(3)——最大间隙问题(线性时间算法)
- 线性时间实现最大间隙问题
- 鸽舍原理 线性时间计算最大间隙问题
- 算法设计:最大间隙问题
- 最大间隙问题。给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。
- 最大间隙问题。给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。
- 算法导论(最大子数组问题-线性时间复杂度算法分析与实现)
- 求解最大子序列和问题的线性时间算法
- 最大间隙问题
- 最大间隙问题
- 最大间隙问题
- nuaa1330 最大间隙问题
- 压缩与解压
- 线性表的链式存储
- [32] Vijos P1359 Superprime(深搜)
- 制作手机短信发送助手
- PATB1018:石头剪刀布
- 最大间隙问题(线性时间算法)
- LeetCode 85. Maximal Rectangle(最大子矩阵)
- UVa 1585 Score 得分 (java版本)
- JQuery特点
- 缩放系列(二):所有子控件也随着缩放、手势缩放、多点触控layout
- DescriptionResourcePathLocationType web.xml is missing and <failOnMissingWebXml> is set to true
- 目前国内常见的计算机语言
- PATB1032:挖掘机哪家强
- leetcode Distinct Subsequences