Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为给定输入集查找匹配集的算法_.net_Algorithm - Fatal编程技术网

.net 为给定输入集查找匹配集的算法

.net 为给定输入集查找匹配集的算法,.net,algorithm,.net,Algorithm,我有一组输入集,每个元素最多由50个字符组成。设想一个包含varchar(50)列的数据库表,每行是一个输入集。列计数通常在5-8范围内。行数通常约为200-300万,但最多可达1.5亿。每一列必须有一个非空值。让我们把这个表称为T,它的每一行都称为RT 我有第二组输入,表示匹配模式。与原始输入一样,它也可以被视为具有相同固定列数的数据库表(加上用于匹配目标的元数据,但该部分不相关)。但是,这一次,只有一列必须具有值,但其中任何一列都可以为null。让我们把这个表称为M,它的每一行都称为RM。此

我有一组输入集,每个元素最多由50个字符组成。设想一个包含varchar(50)列的数据库表,每行是一个输入集。列计数通常在5-8范围内。行数通常约为200-300万,但最多可达1.5亿。每一列必须有一个非空值。让我们把这个表称为T,它的每一行都称为RT

我有第二组输入,表示匹配模式。与原始输入一样,它也可以被视为具有相同固定列数的数据库表(加上用于匹配目标的元数据,但该部分不相关)。但是,这一次,只有一列必须具有值,但其中任何一列都可以为null。让我们把这个表称为M,它的每一行都称为RM。此表的典型大小为4000-5000行,但最多可达40000行

这里的任务是针对每个RT,我们必须找到匹配的RM。以下是给定RT的匹配规则:

  • 如果RM的所有元素与RT中的对应元素相同,则会进行匹配(字符串完全匹配被视为相同)。如果RM中的元素为null,则不会检查RT是否匹配

  • 只有一个匹配是可能的。如果识别出多个匹配项,则RM最长的匹配项被视为正确的匹配项。这里可以忽略具有相同长度的多个RM的情况。我们只选择第一个确定的

  • 该代码将在具有4GB RAM的典型windows客户端上运行。因此,MT可以保存在内存中,但T不能

    我正在寻找一种减少比较次数的方法。更具体地说,您是否知道一种可以针对给定RT检查整个MT的技术。如果不知道,处理此问题的最有效方法是什么

    这将在.NET中进行编码,非常感谢.NET的任何现有代码或库

    谢谢

    基马尔

    注:

  • 这不是家庭作业。我大约20年前毕业:)

  • 正则表达式RMs中存在此问题的变体。但对于当前版本,匹配简单的字符串等价就足够了

  • 以下是一些例子:

  • RT={A,B,C,D,E}

    RM1={A,,,,} RM2={A,B,,,} RM3={A,,,D,E}

    对于这个RT,所有这些匹配。但根据规则2,我们选择RM3作为匹配项。希望这个例子能澄清

  • T数据实际上不保存在db中。它有多种格式,包括excel、文本、xml和一些统计软件原生数据文件。我们有一个数据管道结构,它可以动态地从其本机格式读取数据,并保留一个光标。RT是游标的一部分,只是字符串数组

  • 解决方案应该包括某种匹配树。目标是遍历每个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来说应该足够了。