匹配/分配问题
您没有说允许抽取库存与销售匹配的条件是什么,但我会假设它是:如果我们希望特定销售与特定销售匹配,时间戳和项目都必须匹配特定的库存抽取。
如果这是正确的,您的问题可以通过 (time,item)-pair 分离:对于出现在数据集中的每个时间戳和每个项目,只查看针对该时间戳和该项目发生的销售和库存抽取,看看是否有的库存抽取无法与销售相匹配;然后继续下一对。这将问题分解为更小的部分。
鉴于您的问题陈述,对于每个 (timestamp,item)-pair,以下算法是您能做的最好的算法:
让表示库存抽取的数量(对于那个(时间,项目)对)。让表示销售订单的数量(对于那个(时间,项目)对)。然后:
如果,您的记录有问题(但没有可疑的库存抽取)。
如果,没有什么可疑的。
如果,则至少有一个库存抽取是可疑的。实际上,通常没有办法判断哪个库存抽取有问题。更准确地说,让; 数量总和为的任何抽奖子集 可能是可疑的。换句话说,对于任何集合这样, 集合可能是可疑的。你可以枚举所有集合,但通常会有很多集合。你所知道的是,其中一组是一组可疑的库存抽取,但你不知道是哪一组。通常,您无法将手指放在任何一次库存抽奖上并说它绝对有问题或绝对不可疑(您只能说抽奖如果存在于所有集合中这样; 你只能说draw如果不存在于任何这些集合中)。更糟糕的是,通常会有成倍增加的可能集合,因此如果您有很多订单,找到所有这些可能需要很长时间。
因此,实际上,某个项目在某个时间抽取的库存总量超过了该项目当时的销售总量,那么您几乎只能说这些库存抽取中至少有一个看起来可疑;将它们全部标记为人类检查。
为了做得更好,您需要除了时间戳、项目和数量之外的其他信息。例如,您可能有额外的信息,例如物品的价值、进行库存抽取的工人的身份等等——这可能会帮助您做得更好。