.net 为给定输入集查找匹配集的算法
我有一组输入集,每个元素最多由50个字符组成。设想一个包含varchar(50)列的数据库表,每行是一个输入集。列计数通常在5-8范围内。行数通常约为200-300万,但最多可达1.5亿。每一列必须有一个非空值。让我们把这个表称为T,它的每一行都称为RT 我有第二组输入,表示匹配模式。与原始输入一样,它也可以被视为具有相同固定列数的数据库表(加上用于匹配目标的元数据,但该部分不相关)。但是,这一次,只有一列必须具有值,但其中任何一列都可以为null。让我们把这个表称为M,它的每一行都称为RM。此表的典型大小为4000-5000行,但最多可达40000行 这里的任务是针对每个RT,我们必须找到匹配的RM。以下是给定RT的匹配规则:.net 为给定输入集查找匹配集的算法,.net,algorithm,.net,Algorithm,我有一组输入集,每个元素最多由50个字符组成。设想一个包含varchar(50)列的数据库表,每行是一个输入集。列计数通常在5-8范围内。行数通常约为200-300万,但最多可达1.5亿。每一列必须有一个非空值。让我们把这个表称为T,它的每一行都称为RT 我有第二组输入,表示匹配模式。与原始输入一样,它也可以被视为具有相同固定列数的数据库表(加上用于匹配目标的元数据,但该部分不相关)。但是,这一次,只有一列必须具有值,但其中任何一列都可以为null。让我们把这个表称为M,它的每一行都称为RM。此
解决方案应该包括某种匹配树。目标是遍历每个RT的树,直到到达一个叶节点,此时可能有几个匹配项,但其中一个是最佳匹配项。树中的节点是匹配的(可能是部分匹配,如
{A,,,,D,}
),如果满足或不满足节点匹配,算法将落在一个分支或另一个分支上
实现这一点的方法不止一种,要选择一种方法,首先需要确定速度对您来说有多快。需要考虑的一件事是空间局部性,因为对于一个大型的非优化树算法,它会像一只咆哮的兔子一样在内存中跳跃,而完全忽略了内存缓存的好处
让我们假设二叉树已经足够好了。若匹配满足,则算法跟随左分支,否则跟随右分支。因此,对于您的情况,根节点是match{A,,,,,,}
,完整的树如下所示(每个节点尝试匹配某些内容,如果找到匹配项,则有一个分支y>
,如果没有匹配项,则有一个分支n>
:
{A,,,,}
y> {,B,,,}
y> out, matching {A,B,,,}
n> {,,,D,E}
y> out, matching {A,,,D,E}
n> out, matching {A,,,,}
n> out, no match
从m表中编译这个匹配树本身就是个问题。你应该考虑T表中的项目的统计发生,以便遍历树以尽快结束RT的大部分。这听起来像是一个家庭作业,所以:到目前为止你尝试了什么?将有助于问题,但是我们更喜欢如果你试着问。为了帮助进度。我们需要M中的项所遵循的完整匹配规则。是RM的正则表达式还是其他什么?我认为您应该给出一些RM和RT的示例以及它们如何匹配只是为了澄清:您没有包含数据的DB,提及表只是为了解释,对吗?@ChristianSev提出的好问题erin:你的实际数据结构是什么?谢谢你的建议。我们目前支持一次匹配一列,也就是说,我们只允许一对一的匹配序列。这样我们可以每秒处理9000个RTs(涉及一些数据库写入),这就足够了。因此,如果匹配算法能够在数据库引擎将数据写入临时表的同时保持匹配记录的泵送速度,那么4小时的总时间对于1.5亿RTs来说应该足够了。