需要一个有效的算法来收集将显示在图表中的数据。我用的是c,但你可以用伪代码作为解决方案。我用下面的例子来解释。从零开始在两边创建10个箱子(正箱子和负箱子)垃圾箱只是一个容器(计数器)箱子10(91到100号放在这个箱子里)箱子9(81到90号放在这个箱子里)箱子8(71到80号放在这个箱子里)等等直到箱子2(11到20号放在这个箱子里)箱子1(1到10号放在这个箱子里)bin0(数字0进入这个bin-设置点任何数字都可以设定点我用零来说明)箱子-1(数字-1到-10放在这个箱子里)垃圾箱-2等等直到箱子-10(数字-91到-100放在这个箱子里)下面需要一个有效算法的帮助。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数组可以完成任务(或任何与此相关的数据结构,如字典等)。谢谢您 最佳答案 我不知道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; }}编辑我认为这里的关键元素是确定仓位的算法:var binIndex = (value - setPoint) / binSize+ Math.Sign((value - setPoint)/binSize);从值中减去设定点,这样就可以确定它是在设定点上,还是在其正或负的一侧。除以箱子大小以确定要放入哪个箱子所以0-9将产生0,10-19将产生1,-20到-29将产生-2。使用添加索引或索引1来修复索引,因为您实际上需要基于1的索引,而不是基于0的索引(相对于设置点)。我这里有一个箱子大小元素的边盒是错的(即,10最终会出现在箱子2而不是箱子1中)解决办法可能是var binIndex = (value - Math.Sign(value) - setPoint) / binSize + Math.Sign((value - setPoint)/binSize);它会将值“移动”到接近0的位置。但是你需要测试来证明这一点。关于c# - 如何创建固定大小的垃圾箱并将正确的值放入正确的垃圾箱(此逻辑的高效算法),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7382772/
10-12 04:07