【问题标题】:Fastest way to find which is the longest string from a set contained in an input string从输入字符串中包含的集合中找出最长字符串的最快方法
【发布时间】:2019-07-29 03:38:03
【问题描述】:

我有一个非常大的 List<MyClass>(大约 600.000 条记录 +),我需要在其中提取 MyClass.Property1 与我的输入字符串完全匹配或最接近的记录。但是,即使看起来,这也不是模糊字符串匹配问题,所以我不能使用 Levenshtein 距离。为了稍微澄清一下,我给你举个例子。

假设以下是我的数据集(仅列出MyClass.Property1):

242
2421    
2422    
24220   
24221   
24222   
24223   
24224 

现在我期望的是,如果我有输入 2422,我希望在输出中给出第三条记录。如果我输入 24210,我希望输出第二条记录,这是我的输出中包含的最长字符串。为了让事情变得更快,当我填写List<MyClass> 时,我已将字符串中第一个数字更改的索引保存在Dictionary<int,int> 中(例如从 19999 到 20000),因此我可以减小数据集的大小我'要寻找比赛。我想知道的是:达到我的目标的最快方法是什么?

我唯一能想到的就是这样的:

因为我确定List<MyClass> 是由MyClass.Property1 排序的,就像示例中一样,假设我已经根据我之前提到的字典提取了一个名为SubSet 的List<MyClass>,我会这样做

MyClass result = null;
foreach(MyCLass m in SubSet)
{
    if (input.Contains(m.Property1))
    {
       // if the 2 strings are equal i've found the exact match
       if(input == m.Property1)
         return m.Property1;
       else
         result = m;            
    }
    else
       return result;
}

我在这里可以看到的最明显的问题是,如果想要的结果在 SubSet 的末尾,我需要循环数千条记录,你能想出更好的方法来达到我的目标吗?改进我当前的代码?

【问题讨论】:

  • 会在同一个数据上多次调用这个“find”方法吗?换句话说,您会接受较慢的“启动”时间以使“查找”方法更快吗?
  • @C.Evenhuis 可能是的。但是有可能在实例期间永远不会调用此方法。要回答,这取决于启动速度有多慢

标签: c# string-matching


【解决方案1】:

也许,你可以在递归函数中使用 Linq 方法,比如

public string test(string input)
{
    string result = Subset.FirstOrDefault(a => a == input);
    if (result == null)
        return test(input.Substring(0, input.Length - 2));
    else
        return result;
}

【讨论】:

  • 我怀疑这会比我做的更快。我不确定 LINQ 如何在内部实现其循环,但平均而言,您将针对我当前正在执行的 1 个循环在同一个子集上执行多个循环
  • 我认为,基本上使用 foreach 并包含替换优先或默认可能会更好
猜你喜欢
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
相关资源
最近更新 更多