关于处理数值的范围,数值分组。
有一系列数值,需要求数值的范围,数值分组。比如价格,价格是不确定的。
比如手机的价格是560, 870, 2000, 1450, 2500, 3300, 1800
这时希望的价格范围是0-1000, 1001-1500, 1501-2000, 2001以上
而比如衣服的价格是45, 23, 100, 200, 320, 140, 750, 80, 26, 97, 21,
这是希望的价格范围是0-50,51-100,100-200,200-300,300以上
价格在一个范围内越多,这个范围分的越细。请大家指点相关算法,谢谢。
------解决方案--------------------建一个类保存分组
class A
{
分组范围;
元素数组;
}
先找到系列数值中的最大值max,先找最大分值
int i;
for(i=0;i++;)
{
int n=max/math.pow(10,i);
if(n <=30) //设为30表示可分为4~30组,若设为50表示可分为6~50组
break;
}
下面可用p=(int)math.pow(10,i)来分组, n=max/math.pow(10,i)为初始组数
数值个数count/n为平均每组个数avg
当一组的个数为avg的几倍时,对该组再分组(可用p/2或其它值)
个数太少也可合并
------解决方案--------------------找个统计的书,找一个合适的算法,用java实现一下
------解决方案--------------------建立一个类是比较合适的做法!
------解决方案--------------------好像不太容易做共通,这里提供一种设想。
动态分组的话主要问题焦点在于分组步长的确定,比如多少个数据一组或者每个多少数值一组(你的要求属于这一种)
那么设想数值间隔的确认一定要用到你的最大值,最小值
再详细设想,我们可以在把你的数组分成效的数组,通过最大值最小值确认数值间隔。
那么我的想法是,
1,升序排序
2,取得相邻每两个数值之间的差值
3,自己定义一些标志点的数值(1),比如50,100,200,500,相当于数值步长
4,将差值在自己定义的标志点的数值区间内的数值组成新的数组
5,定义标志点的数值(2),相当于数值步长,或者定义数值个数的步长
6,按照5定义的步长再一次将分好的新的数组分组
7,得到你要的结果。
我的思路基本上就是用到了最大值,最小值,数值差,分块分区域多次处理
关于标志点数值的确定可以考虑求平均值,开平房等等算法,或者硬性规定问题也不是很大。
应该可以在一定程度上满足你的要求。想要完美的分好,恐怕不是那么容易,还要考虑数据特性,代表的含义等等/。
------解决方案--------------------学习了.
------解决方案--------------------学习 + 接分
------解决方案--------------------学习
------解决方案--------------------感谢guochun和bluesmile979的指点。抱歉,表达的意思有误,希望得到的是价格的范围,比如这些价格可以分为0-50,51-100,100-200,200-300,300以上
------解决方案--------------------价格范围的“增长幅度”是需要计算的还是有自己既定的规律??(就是楼上说的步长)
也需要算法实现吗?
------解决方案--------------------你自己得知道分割的规则啊
没有规则,计算机怎么知道该怎么分呢?
------解决方案--------------------分割规则就是价格在一个范围内越多,这个范围分的越细。
比如手机的价格是560, 870, 2000, 1450, 2500, 3300, 1800
这时希望的价格范围是0-1000, 1001-1500, 1501-2000, 2001以上(范围跨度也相应的大些)
而比如衣服的价格是45, 23, 100, 200, 320, 140, 750, 80, 26, 97, 21,
这是希望的价格范围是0-50,51-100,101-200,201-300,301以上(范围跨度也相应的小些)
------解决方案--------------------分割规则就是价格在一个范围内越多,这个范围分的越细。
仅仅这个规则不够!你得把规则写详细些,比如你不说,我怎么知道可以按50分?
------解决方案--------------------我想你没有看懂我的意思。
1,升序排序
2,取得相邻每两个数值之间的差值
3,自己定义一些标志点的数值(1),比如50,100,200,500,相当于数值步长
4,将差值在自己定义的标志点的数值区间内的数值组成新的数组
5,定义标志点的数值(2),相当于数值步长,或者定义数值个数的步长
6,按照5定义的步长再一次将分好的新的数组分组
7,得到你要的结果。
这里,最关键的3,5的规则是必须要有你来制定的,
比如在第3步你可以定义如果最小值是10--100之间那么差值小于20并且被分组的总数小与n的被分为一组,如果最小值是1000--2000之间的那么差值小于200并且被分组的总数小与n的被分为一组
这里必须要你来根据数据的特点,含义,制定规则,你制定的规则不同会得到不同的分组