需要一个有效的算法来收集将显示在图表中的数据。我正在使用c#,但您可以使用伪代码作为解决方案。
为了解释我正在使用下面的样本。从零开始,在两边创建10个垃圾桶(正垃圾桶和负垃圾箱)。垃圾桶只是一个容器。(计数器)
诸如此类直到
诸如此类直到
需要帮助,为下面一个有效的藻类。
int[] bins = CreateBins(bin range, number of bins on each side, setpoint)
CreateBins(10, 10, 0)
{
//??
}
FindTheRightBinAndInsertInFoundBin(value, bin[])
{
//??
}
FindTheRightBinAndInsertInFoundBin(77, bin[])
//that should basically do a bin8++ where bin8 is an index into the bin array更新:如果一个2D数组完成了这个任务,它就可以了。(或任何数据结构,如字典等)。
谢谢
发布于 2011-09-12 05:55:00
我不知道range的意思是什么--它应该测量单个垃圾箱或所有垃圾箱的大小,因为实际的“范围”是由设定的点、垃圾箱的数量和大小决定的。我假设它是垃圾箱大小的。
class Bins
{
private int setPoint;
private int binSize;
private int numberOfBins;
private Dictionary<int, int> bins; // bins are just counters, right?
CreateBins(int range, int numberOfBins, int setPoint)
{
this.setPoint = setPoint;
this.binSize = range
this.numberOfBins = numberOfBins;
bins = new Dictionary<int, int>();
}
PutInRightBin(int value)
{
var binIndex = (value - setPoint) / binSize
// add or substract a 1 here because your 'first' bin is index 1, not 0.
+ Math.Sign((value - setPoint)/binSize);
if (!bins.ContainsKey(binIndex))
{
bins.Add(binIndex, 0);
}
bins[binIndex] = bins[binIndex] + 1;
}
}编辑
我认为这里的关键要素是bin判断算法:
var binIndex = (value - setPoint) / binSize
+ Math.Sign((value - setPoint)/binSize); Math.Sign来修复索引,因为实际上您需要基于1的索引而不是基于0的索引(相对于您的设置点)。我这里错误的bin大小元素的边缘情况(即10将在bin 2而不是bin 1中结束)。解决办法很可能是
var binIndex = (value - Math.Sign(value) - setPoint) / binSize
+ Math.Sign((value - setPoint)/binSize);这将“移动”到接近0的值。但是,您需要进行测试才能证明这一点。
发布于 2011-09-12 03:04:10
CreateBins可以返回一个大小合适的数组。
PutInBin可以使用此方法计算哪个bin,然后添加一个偏移量,这样它就适合数组(没有负索引)。
int GetBin(int value)
{
if (value) == 0 return 0;
else if (value<0) return (value-9)/10;
else return (value+9)/10;
}发布于 2011-09-12 03:26:44
您可能忽略了您的算法需要2D数组。
以下是实现算法的C#代码:
int[][] bins = CreateBins(10, 10, 0);
// Arguments : Bin range, Number of bins on each side, Set Point
static int[][] CreateBins(int binRange, int noOfBins, int setpoint)
{
int[][] tempBins = new int[noOfBins * 2 + 1][];
for (int i = 0, j = noOfBins; i != j; i++ , j--)
{
tempBins[i] = new int[binRange];
tempBins[j] = new int[binRange];
}
tempBins[noOfBins] = new int[] {setpoint};
return tempBins;
}
// Arguments : Value, Bin in which value is to be inserted
static void PutInRightBin(int value, int [] bin)
{
for(int i=0; i<bin.Length;i++) if(bin[i]==null) bin[i]=value;
}上述结果将产生如下所示的结果:

使用PutInRightBin()插入值。
https://stackoverflow.com/questions/7382772
复制相似问题