线性时间算法解决最大间隙问题

1. 问题描述:

   最大间隙问题:给定n个实数x1,x2,...,xn,求这n个实数 在实轴上 相邻2个数之间 最大差值

2. 实现要求:

   (1)算法复杂度为线性时间;

   (2)输入数据由input.txt的文件提供,文件第一行有1个正整数n,接下来的一行有n个实数x1,x2,x3...

   (3)程序结束时,将找到的最大间隙输出到文件output.txt中。

3. 解决思想:

(1)找到n个数据中最大和最小数据maxx和minx;

(2)用n-2个点等分区间[minx,maxx],即将[minx,maxx]等分为n-1个区间(前闭后开区间),将这些区间看做桶,编号为1,2,...,n-2,n-1,且桶i的上界和桶i+1的下界相同,即每个桶的大小相同,每个大小为: dblAvrGap=(maxx-minx)/(n-1);

(3)将n个数放入n-1个桶中:按如下规则将x[i]分配到某个桶(编号index)中:  index=int((x[i]-minx)/dblAvrGap)+1;

(4)求最大间隙:除最大最小数据maxx和minx以外的n-2个数据被放入n-1个桶中,因此至少有一个桶是空的,又因肯定有空桶存在,所以最大间隙            不会在同一桶中出现,而是在空桶两侧!又因求的是实数轴相邻两数的差值,因此和空桶两侧桶中间的数无关,即最大间隙在桶i的上界和桶j的下界之间产生(j>=i+1)。

4. 源代码:

/************************************************************************
* 最大间隙问题:给定n个实数x1,x2,...,xn,求这n个实数在实轴上相邻2个数之间
*   的最大差值,要求设计线性的时间算法
************************************************************************/

#include
#include
//#include
using namespace std;
#define FILENAMELENGTH 50

//声明函数
template
int indexofmin(int n, T *x);

template
int indexofmax(int n, T *x);

//类
class CMaxGap
{
public:

	int m_nCount;        //数据的个数
	double m_dblMaxGap;    //最大间隙
	double *m_dblNumber;//存放数据的数组

	CMaxGap(const char *filename);
	~CMaxGap();

	double GetMaxGap(int n, double *x);
	void Display();
};

//读入数据
CMaxGap::CMaxGap(const char *filename)//指定目录用单斜杠
{
	FILE *fp = fopen(filename, "r");
	if (fp == NULL)
	{
		printf("can not open file!");
		exit(0);
	}

	//读入数据个数
	fscanf(fp, "%d", &m_nCount);//fscanf遇到空格和换行时结束

	m_dblNumber = new double[m_nCount];
	//读入每个具体的数据
	for (int i = 0; i=1)
		index = int((x[i] - minx) / dblAvrGap) + 1;

		//若x[i]=maxx,则被分到桶n中(max为桶n的下界桶n-1的上界)
		//    但没有桶n,此时可人为将其移入桶n-1中,或者再加一个桶
		//该步操作不影响下面的求最大间隙
		if (index == n)
			index--;

		count[index]++;// 统计实际分到每个桶的数据个数
		//调整分到该桶的最大最小数据
		if (x[i]high[index])
			high[index] = x[i];
		//只需确定每个桶的上界下界即可,中间的数无用
	}

	//除最大最小数据maxx和minx以外的n-2个数据被放入n-1个桶中,因此至少有一个桶是空的
	//又因肯定有空桶存在,所以最大间隙不会在同一桶中出现,而是在空桶两侧
	//因求得是实数轴相邻两数的差值,因此和空桶两侧桶中间的数无关
	//  即最大间隙在桶i的上界和桶j的下界之间产生(j>=i+1)

	//计算最大间隙
	double dblMaxGap = 0, dblHigh = high[1], dblTempGap;
	for (int i = 2; i
int indexofmin(int n, T *x)
{
	int index;
	T temp = x[0];
	for (int i = 1; i
int indexofmax(int n, T *x)
{
	int index;
	T temp = x[0];
	for (int i = 1; itemp)
		{
			temp = x[i];
			index = i;
		}
	}
	return index;
}

//显示菜单
void show_menu()
{
	printf("--------------------------------------------- \n");
	printf("input command to test the program \n");
	printf("   i or I : input filename to test \n");
	printf("   q or Q : quit \n");
	printf("--------------------------------------------- \n");
	printf("$ input command >");
}

void main()
{
	char sinput[10];
	char sfilename[FILENAMELENGTH];

	show_menu();

	scanf("%s", sinput);
	while (_stricmp(sinput, "q") != 0)//比较字符串,且不区分大小写
	{
		if (_stricmp(sinput, "i") == 0)
		{
			printf("\nplease input a filename:");
			scanf("%s", sfilename);

			//求文件中数据的最大间隙
			CMaxGap gap(sfilename);
			double dblMaxGap = gap.GetMaxGap(gap.m_nCount, gap.m_dblNumber);
			gap.Display();

		}

		//输入命令
		printf("$ input command >");
		scanf("%s", sinput);
	}
}





 

你可能感兴趣的:(Algorithm)