C语言实现最大间隙问题实例

本文实例展示了C语言实现最大间隙问题的方法,对于算法的设计有一定的借鉴价值。分享给大家供大家参考。具体如下:

问题描述如下:

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

解决思路:

注意题中要求设计线性时间算法。如果没有这个要求,就可以先排序,找出来就很方便。但我们知道排序最优良的算法的时间效率也是nlogn的。所以不可行。

采用一种区间算法。具体步骤就不说了,给出C语言代码,有注释加以说明。

具体实现代码如下:

#include "stdio.h"
#include "stdlib.h"
#define MAX 10000
float findmin(float data[],int n){/*寻找数据序列中的最小值*/
   int index,i;
   float min,temp;
   temp=data[0];
   for(i=1;i<n;i++){
     if(data[i]<temp){
       temp=data[i];
       index=i;
     }
   }
   min=data[index];
   return min;
}
float findmax(float data[],int n){/*寻找数据序列中的最大值*/
   int index,i;
   float max,temp;
   temp=data[0];
   for(i=1;i<n;i++){
     if(data[i]>temp){
       temp=data[i];
       index=i;
     }
   }
   max=data[index];
   return max;
}
void initial(int n,int count[],float low[],float high[],float min,float max){/*初始化区间*/
   int i;
   for(i=0;i<n;i++){
     count[i]=0; //区间是否有数据存入
     low[i]=max; //将区间的左端赋值最大值
     high[i]=min; //将区间的右端复制最小值
   }
}
void dataIn(float m,int count[],float low[],float high[],int n,float data[],float min){/*将数据序列依次放入对应区间*/
   int i,location;
   for(i=0;i<n;i++){
     location=int((data[i]-min)/m)+1; //判断数据进入哪个区间:按照等分区间,数据与最小值的差与区间大小的比值+1就是区间编号
     if(location==n)
       location--;
     count[location]++; //有数据存入,计数值加1
     if(data[i]<low[location]) //如果数据比左端值小,则作为左端值
       low[location]=data[i];
     if(data[i]>high[location]) //如果数据比右端值大,则作为右端值
       high[location]=data[i];
   }
}
float findMaxGap(int n,float low[],float high[],int count[]){ /*找出最大间隙,整个问题的核心*/
/*函数说明*/
/*上面已经把对应数据放入相应的区间,在之前可以知道,总共有n-1区间,相应的只有n-2个值,那么就一定有一个区间不会有数据*/
/*因为最大值与最小值已经分别被设为最小区间的左端值和最大区间的右端值,所以中间的n-1区间只有n-2个值*/
/*那么可以想象,最大间隙肯定不会是在一个区间中,而一定是在空区间的两端,
最大间隙为空区间右边相邻区间的左端值空区间左边相邻区间的右端值;有可能有多个这种情况,找出最大就行了*/
   int i;
   float maxgap,dhigh,temp;
   dhigh=high[1];
   for(i=2;i<n;i++){
     if(count[i]){
       temp=low[i]-dhigh;
       if(maxgap<temp)
         maxgap=temp;
       dhigh=high[i];
     }
   }
   return maxgap;
}
int main(){
  float data[MAX];
  int n,i=0;
  float min,max;
  float m,maxgap;
  float low[MAX],high[MAX];
  int count[MAX];
  scanf("%d",&n);
  for(i=0;i<n;i++)
    scanf("%f",&data[i]);
  min=findmin(data,n);
  max=findmax(data,n);
  m=(max-min)/(n-1);
  initial(n,count,low,high,min,max);
  dataIn(m,count,low,high,n,data,min);
  maxgap=findMaxGap(n,low,high,count);
  printf("%.1f",maxgap);
  system("pause");
  return 0;
}

感兴趣的朋友可以测试运行本文实例以加深理解。相信本文所述对大家C程序算法设计的学习有一定的借鉴价值。

(0)

相关推荐

  • C语言实现二叉树遍历的迭代算法

    本文实例讲述了C语言实现二叉树遍历的迭代算法,是数据结构算法中非常经典的一类算法.分享给大家供大家参考. 具体实现方法如下: 二叉树中序遍历的迭代算法: #include <iostream> #include <stack> using namespace std; struct Node { Node(int i, Node* l = NULL, Node* r = NULL) : item(i), left(l), right(r) {} int item; Node* le

  • C语言实现杨辉三角实例

    本文实例讲述了C语言实现杨辉三角的方法,分享给大家供大家参考. 具体实现方法如下: #include <iostream> using namespace std; void printYangHui(int line) { int **array = new int*[line]; for (int i = 0; i < line; i++) array[i] = new int[line]; for (int i = 0; i < line; i++) { for (int j

  • C语言实现输入一颗二元查找树并将该树转换为它的镜像

    本文实例讲述了C语言实现输入一颗二元查找树并将该树转换为它的镜像的方法,分享给大家供大家参考.具体实现方法如下: 采用递归方法实现代码如下: /* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include <iostream> #include <iterator> #include <algorithm> using namespace std; struct Node { Node(int

  • C语言实现输出链表中倒数第k个节点

    本文实例展示了C++实现输出链表中倒数第k个节点的方法,分享给大家供大家参考之用. 运行本文所述实例可实现输入一个单向链表,输出该链表中倒数第k个节点. 具体实现方法如下: /* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include <iostream> using namespace std; int array[] = {5, 7, 6, 9, 11, 10, 8}; const int size = size

  • C语言字符串原地压缩实现方法

    本文实例讲述了C语言字符串原地压缩的实现方法,对于学习字符串操作的算法设计有不错的借鉴价值.分享给大家供大家参考.具体方法如下: 字符串原地压缩示例: "eeeeeaaaff"压缩为"e5a3f2" 具体功能代码如下: /* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include <iostream> #include <iterator> #include <

  • C语言实现找出二叉树中某个值的所有路径的方法

    本文实例讲述了C语言实现找出二叉树中某个值的所有路径的方法,是非常常用的一个实用算法技巧.分享给大家供大家参考. 具体实现方法如下: #include <iostream> #include <vector> #include <iterator> #include <algorithm> using namespace std; vector<int> result; struct Node { Node(int i = 0, Node *pl

  • C语言实现颠倒栈的方法

    本文实例讲述了C语言实现颠倒栈的方法,很实用的技巧.分享给大家供大家参考之用. 具体实现方法如下: #include <iostream> #include <iterator> #include <algorithm> #include <vector> #include <stack> using namespace std; void initializeStack(stack<int> &st) { for(int i

  • C语言求幂计算的高效解法

    本文实例演示了C语言求幂计算的高效解法.很有实用价值.分享给大家供大家参考.具体方法如下: 题目如下: 给定base,求base的幂exp 只考虑基本功能,不做任何边界条件的判定,可以得到如下代码: #include <iostream> using namespace std; int cacExp(int base, int exp) { int result = 1; int theBase = 1; while (exp) { if (exp & 0x01) result =

  • C语言实现计算树的深度的方法

    本文实例讲述了C语言实现计算树的深度的方法.是算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: /* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include <iostream> using namespace std; struct Node { Node(int i = 0, Node *l = NULL, Node *r = NULL) : data(i), left(l), right(r) {}

  • C语言实现在数组A上有序合并数组B的方法

    本文实例讲述了C语言实现在数组A上有序合并数组B的方法,分享给大家供大家参考.具体分析如下: 题目:数组A和数组B均有序,数组A有足够大内存来容纳数组B,将数组B有序合并到数组A中 分析:如果由前至后合并,复杂度将会是O(N2),这样的复杂度显然不是最优解,利用两个指针指向两个数组的尾部,从后往前遍历,这样的复杂度为O(n2) 由此可以写出下面的代码: #include <iostream> #include <algorithm> #include <iterator>

  • C语言求连续最大子数组和的方法

    本文实例讲述了C语言求连续最大子数组和的方法,是非常实用的技巧.分享给大家供大家参考. 具体实现方法如下: #include <iostream> using namespace std; int array[] = {1, -2, 3, 10, -4, 7, 2, -5}; //int array[] = {-10, -1, -2, -3, -4, -5}; const int size = sizeof array / sizeof *array; int maxSubArray(int

随机推荐