你考虑过绝对数吗?
如果我理解你是正确的,有多个价目表,因此平均有效价格可能会有所不同,可能是 1000,有些可能是 300 左右,就像在你的示例中一样,我的算法建议适用于两者。您没有告知价格是否总是与示例中的一样接近,或者如果价格更高,价格可能会更高。
我将我的答案分为四个部分,第一部分将针对两种情况(价格差异在低价值时低,在高价值时高)。如果价格差异随着平均有效价格的增加而增加,那么第二部分将很有用。第三部分将是您希望如何将它们包装在一起的整个算法。最后一部分将是第一次运行时要做什么。
第 1 部分:查找验证处理的值
您说您有一个这些数字的列表,并且它一直在检索新数据。我建议你这样做的方法是,如果你将两个数字相减并减去绝对值。
示例:
300-312=|12|
通过数字 12,我们可以得出结论,这两个价格都在有效价格范围内。现在让我们再举三个例子,一个两个值都无效,一个只有一个无效。
示例:
1025-12=|1013|
我们可以看到 1013 绝不是此列表中的平均价格,因为两者都是无效的,我们必须根据有效价格对它们进行测试。然后算法会将它们都删除。
示例:
300-12=|288|
我们可以看到 288 也不是有效价格,算法会删除 12。
第 2 部分:验证具有不同价格差异的价格
如果您的列表中的平均价格可能相差 400、-50 和 +50,那么您的算法会出现错误,因此您需要一种可扩展的方式来确定这一点,这将确保数字越大,价格差异越大。
如果绝对值高于两个数字的平均数的 20%(或其他数字),则需要进一步验证。
示例:
(300+312)/2=306 是平均数。
306*0.2=61,2
如果您存储了最高和最低有效数字的值,您可以使用它们平均值的 20% 来确定阈值。
(293+312)/2=302,5
302,5*0,2=60,5
第 3 部分:总结并制定算法
所以你首先要做的就是确定每个列表中的数据量,列表的数量,以及你接收数据的频率,数据量越大,你接收数据的频率越高,那就是合理地索引您的数据。我建议的方式是为每个列表保存最高和最低的有效数字。如果不是这种情况,您可以跳过这部分并查看第 4 部分,因为您基本上可以在每次收到新数据时针对整个列表运行算法。
首先将 4 个值添加到列表中,即最低价格、最高价格、平均价格和阈值。平均价格为(最高价格+最低价格)/2。在此之后,您可以使用平均价格的百分比来确定您的价格阈值,我建议 20%,因为它会产生接近您使用的数字 50 的数字,通过将平均数字乘以找到阈值0,2。
根据您的数据,您始终可以选择根据最小值、最大值和新数字 ((min+max+new)/2*0,2) 的平均值的 20% 来查找阈值,您可以如果差异应该改变,请更改此计算。
当您收到新数字时,您的算法应根据阈值检查绝对数字。
根据新数字的频率,我建议以较低的频率进行。
ProcessNumber(var value)
{
if(absoluteValue(MinValue-value)<=MaxValue*0,2) //depending on how many numbers you want to be valid you can change the threshold, by doing this you allow the maximum value to change if the new number is valid but higher than max value
{
addNumber(value);
}
else
{
deleteNumber(value);
}
}
如果检索新数字的过程经常发生,您可以一次添加两个数字,如果奇数出现 1/3 次,我建议改用上述方法。
ProcessNumbers(var value1, var value2)
{
if(absoluteValue(value1-value2)<=threshold) //if you want the thresholdnumber to be valid too, use less than or equal to
{
addnumber(value1);
addnumber(value2);
return true
}//If you have a method to add them
else
if(checkNumber(value1)) // returns true if valid)
{ //we now know value 1 is valid
deleteNumber(value2); //because the check was false and we know value1 is valid value2 must be the invalid one
addNumber(value1);
}
else if(checkNumber(value2))
{ //we now know value 2 is valid
deleteNumber(value1);
addNumber(value2);
}
else
{ //we now know both values are invalid
deleteNumber(value1);
deleteNumber(value2);
}
}
第 4 部分:第一次运行
第一次运行你需要一个算法,如果当前没有无效数字并且你没有跳过你可以忽略这部分。
对于第一次运行,您应该按照它们所在的阈值将数字分组到排序列表中。
你一次取两个数字,看看绝对值是否低于阈值。
absolute = value1-value2;
threshold = value1+value2)/2*0.2;
if(absolute<threshold)
AddToThreshold(threshold,value1,value2);
else
AddToLater(value1,value2);
AddTolater 是一个列表,其中包含您必须仔细检查的值,因为您不知道是 value1、value2 还是两个值都将它们发送到此列表中。
addtothreshold 确保如果有一个阈值组的值高于提交的阈值,则这些值将提交给该组。
现在你应该有几个有阈值的组,你现在要做的是取最低组中的最低值和最高组中的最低值,并检查它们的绝对值是否低于它们的阈值,然后你可以使用这个阈值要确定其他绝对值是否低于此特定阈值并将它们相互排序,让我们列出您的列表并使用两个有效数字中绝对值最高的最低阈值。
门槛:
(293+298)/2=295,5*0.2=59,1(这是阈值)
2个有效数字中可能的最大绝对数字:
293-312=|19|
这是一篇很长的帖子,我希望它至少能给您一些启发,尽管如果您没有那么多列表,可能不需要进行如此多的处理,除非您正在计划,否则所有这些都可能是矫枉过正可扩展的东西。
祝你好运!