鸽舍原理 线性时间计算最大间隙问题
来源:互联网 发布:linux mv 不覆盖 编辑:程序博客网 时间:2024/04/27 20:50
首先明白鸽舍原理的内容:
1.将n+1个元素划分为n类,则至少有一类含有2个或2个以上
2。把多于M*N个物体放到N个抽屉中,则至少有一个抽屉含有M+1或以上个元素。
计算最大间隙问题:
显然元素已知,则我们要定义这个抽屉,元素为n,所以我们以首尾两个元素为边界,剩下n-2个元素,所以抽屉应该为n-1,这样可以保证至少有一个抽屉是空的,由于采用等分,所以这个最大的间隙就是遍历一遍,将这个有元素的抽屉中的元素减去前一个抽屉中最小的元素就是这个最大的间隙。
代码如下:
#include<stdio.h>
int minii(int n,double *x)
{
double tmp=x[0];
int index,i;
for(i=1;i<n;i++)
if(x[i]<tmp)
{
tmp=x[i];
index=i;
}
return index;
}
int maxii(int n,double *x)
{
double tmp=x[0];
int index,i;
for(i=1;i<n;i++)
if(x[i]>tmp)
{
tmp=x[i];
index=i;
}
return index;
}
double maxGap(int n,double x[])
{
double mini=x[minii(n,x)];
double maxi=x[maxii(n,x)];
int counts[20];
double low[20];
double high[20];
int i;
for(i=0;i<n;i++)
{
counts[i]=0;
low[i]=maxi;
high[i]=mini;
}
for(i=0;i<n;i++)
{
int bucket=int((n-1)*(x[i]-mini)/(maxi-mini))+1;
counts[bucket]++;
if(x[i]<low[bucket])
low[bucket]=x[i];
if(x[i]>high[bucket])
high[bucket]=x[i];
}
double tmp=0,left=low[0];
for(i=1;i<n;i++)
{
if(counts[i])
{
double thisGap=high[i]-left;
if(thisGap>tmp)
tmp=thisGap;
left=low[i];
}
}
return tmp;
}
int main()
{
double x[5]={2.3,3.1,7.5,1.5,6.3};
int n=5;
printf("%lf\n",maxGap(n,x));
}
- 鸽舍原理 线性时间计算最大间隙问题
- 最大间隙问题(线性时间算法)
- 最大间隙问题 线性时间算法
- 最大间隙问题(线性时间算法)
- 最大间隙问题(线性时间)
- 线性时间实现最大间隙问题
- 线性时间算法解决最大间隙问题
- 算法笔记 //02_最大间隙问题(线性时间)
- 鸽舍原理求最大间隙
- 经典算法(3)——最大间隙问题(线性时间算法)
- 最大间隙问题。给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。
- 最大间隙问题。给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。
- 最大间隙问题
- 最大间隙问题
- 最大间隙问题
- nuaa1330 最大间隙问题
- 最大间隙问题
- 最大间隙问题
- IC3比赛学到的(2)
- 学一点Git--20分钟git快速上手
- 关于UDPThread这个类的使用方法
- 【PHP】nginx下file_get_contents导致cpu 100%的问题
- Java NIO框架Mina、Netty、Grizzly介绍与对比
- 鸽舍原理 线性时间计算最大间隙问题
- 多线程中rand()的使用
- 地風升 (易經大意 韓長庚)
- Java语言基础组成——关键字,标识符,注释,常量和变量,运算符
- ubuntu12.04 64挂载其他ubuntu主机samba共享的文件夹
- 黑马程序员_Java基础_集合框架
- javascript event对象:当前事件
- 黑马程序员_继承
- Exception in thread http-8080-exec-