鸽巢原理的应用
来源:互联网 发布:prcc和prcs6区别知乎 编辑:程序博客网 时间:2024/05/17 08:45
假设最大和最小数分别为max和min,将n个数投入n+1个桶中,桶与桶的间距gap=(max-min)/(n+1),每个数x所在的桶的位置是x/gap,利用的鸽巢原理,至少一个桶是空的,那么两个相邻数之间的最大距离必定>=gap。实现时,用两个数组分别保留每个桶中的最大、最小值,然后按顺序遍历桶,找出每个桶中最大的值和下一个不为空的桶最小的值之间的最大的,即为最大距离。
查找最大值、最小值,将数放入桶中及找出相邻非空桶之间的最大距离,时间复杂度均为O(n),因此总时间复杂度也为O(n)。
查找最大值、最小值,将数放入桶中及找出相邻非空桶之间的最大距离,时间复杂度均为O(n),因此总时间复杂度也为O(n)。
#include<iostream> using namespace std; void print(string, float *, int); float data[] = {3.4, 2.1, 5.1, 1.4, 8.5, 7.4, 6.3}; float getMax(float data[], int size){ int i; float max = data[0]; for (i = 1; i < size; ++i) { if (data[i]>max) max = data[i]; } return max; } float getMin(float data[], int size){ int i; float min = data[0]; for (i = 1; i < size; ++i) { if (data[i]<min) min = data[i]; } return min; } float findMaxGap(float data[], int size){ float max = getMax(data, size); float min = getMin(data, size); cout<<max<<" "<<min<<endl; int slot = size-1; float gap = (max-min)/slot; float *high = new float[slot]; float *low = new float[slot]; for (int i = 0; i < slot; ++i) { high[i] = min; low[i] = max; } for (int j = 0; j < size; ++j) { if(data[j]!=max&& data[j]!=min){ int index = (data[j] - min)/gap; if(high[index]<data[j]) high[index]= data[j]; if(low[index]>data[j]) low[index]=data[j]; } } float maxGap = 0; float lowedg = min; for (int var = 0; var < slot; ++var) { if(high[var]!=min){ // 当桶为空时 if(low[var]-lowedg>maxGap) maxGap = low[var]-lowedg; lowedg = high[var]; } } return maxGap; }
- 鸽巢原理的应用
- 鸽巢原理的一个应用
- 鸽巢原理 应用
- 鸽巢原理及应用
- 鸽巢原理简单应用
- 一个简单的鸽巢原理的应用
- mybaits的应用原理
- sparseArray的应用原理
- 直播应用的原理
- Ajax的原理和应用
- 景深的原理与应用
- java中散列桶的应用原理
- Lucene的原理和应用
- HMAC的原理和应用
- Ajax的原理和应用
- Ajax的原理和应用
- Ajax的原理和应用
- Ajax的原理和应用
- Android强制横屏或竖屏,全屏设置详解
- socket编程之addrinfo结构体与getaddrinfo函数
- 【摘录】关于判断用户输入是否数字字母等思路及源码
- 嵌入式数据库系统Berkeley DB
- shell编程基础(2.1SHELL编程语法)
- 鸽巢原理的应用
- 数学运算工具类
- MTK BT驱动调试总结
- 文件控制--fcntl()
- 字符串搜索树
- Android数据库 之 SQLite数据库
- 关于动态数据源
- socket通信的几个关键步骤
- Android 之TabHost