首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建固定大小的回收箱,并将正确的值放入正确的垃圾箱(此逻辑的有效算法)

如何创建固定大小的回收箱,并将正确的值放入正确的垃圾箱(此逻辑的有效算法)
EN

Stack Overflow用户
提问于 2011-09-12 02:30:01
回答 4查看 2.7K关注 0票数 0

需要一个有效的算法来收集将显示在图表中的数据。我正在使用c#,但您可以使用伪代码作为解决方案。

为了解释我正在使用下面的样本。从零开始,在两边创建10个垃圾桶(正垃圾桶和负垃圾箱)。垃圾桶只是一个容器。(计数器)

  • bin10 (数字91到100go in this bin)
  • bin9 (数字81到90在这个垃圾桶中)
  • bin8(编号71到80在这个垃圾桶中)

诸如此类直到

  • bin2 (数字11到20在这个垃圾桶中)
  • bin1 (数字1到10在这个垃圾桶中)
  • bin0 (零号在这个垃圾桶中--设置点)。任何数字都可以设置点。我取0到illustrate)
  • bin-1 (数字-1到-10在这个垃圾桶中)
  • bin-2

诸如此类直到

  • bin-10 (编号-91到-100在这个垃圾桶中)

需要帮助,为下面一个有效的藻类。

代码语言:javascript
复制
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数组完成了这个任务,它就可以了。(或任何数据结构,如字典等)。

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-12 05:55:00

我不知道range的意思是什么--它应该测量单个垃圾箱或所有垃圾箱的大小,因为实际的“范围”是由设定的点、垃圾箱的数量和大小决定的。我假设它是垃圾箱大小的。

代码语言:javascript
复制
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判断算法:

代码语言:javascript
复制
var binIndex = (value - setPoint) / binSize          
+ Math.Sign((value - setPoint)/binSize); 

  • 从值中减去设置点,这样您就可以确定它是在设置点上,还是位于设置点的正负边。
  • 除以bin大小来确定要放置的对象。因此,0-9将导致0,10-19将导致1,-20至-29将导致-2。
  • 添加或减法1将使用Math.Sign来修复索引,因为实际上您需要基于1的索引而不是基于0的索引(相对于您的设置点)。

我这里错误的bin大小元素的边缘情况(即10将在bin 2而不是bin 1中结束)。解决办法很可能是

代码语言:javascript
复制
var binIndex = (value - Math.Sign(value) - setPoint) / binSize 
    + Math.Sign((value - setPoint)/binSize);

这将“移动”到接近0的值。但是,您需要进行测试才能证明这一点。

票数 1
EN

Stack Overflow用户

发布于 2011-09-12 03:04:10

CreateBins可以返回一个大小合适的数组。

PutInBin可以使用此方法计算哪个bin,然后添加一个偏移量,这样它就适合数组(没有负索引)。

代码语言:javascript
复制
int GetBin(int value)
{
  if (value) == 0 return 0;
  else if (value<0) return (value-9)/10;
  else return (value+9)/10;

}
票数 3
EN

Stack Overflow用户

发布于 2011-09-12 03:26:44

您可能忽略了您的算法需要2D数组。

以下是实现算法的C#代码:

代码语言:javascript
复制
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()插入值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7382772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档