如何按顺序查找未知的重复子序列?包括子子序列的递归搜索

时间:2014-04-01 20:57:31

标签: c# algorithm recursion

我正在考虑应用程序,它会在存储的IEnumerable上找到一些重复的模式。到目前为止我发现的是按顺序找到给定的子序列 - 这很容易。

我认为我需要的是:

  • 查找是否存在不止一次的未知子序列 (注意它是什么样的,放在哪里)
  • 找到子序列的未知子子序列递归,直到 找到的图案的长度比4(即)

目前我有两个想法可以调查更多,但我确信有一个现成的算法可以解决这个问题。

  • 让我Dictionary<List<MyObject>, List <List<MyObject>> > 保持MyObject的关键首次出现,然后是下面的List 通过每次迭代扩展列表出现。然后呢 任何找到的模式的递归发现。
  • 实施霍夫曼编码因为我认为它在某种程度上属于这个 问题。

1 个答案:

答案 0 :(得分:0)

我不清楚你在问什么 - 你能举例说明你正在使用的对象和预期的结果吗?

以下是基于其中一个回复的示例...

考虑

class Person
{
    public string Name;
}

你可以做到

var people = new List<Person>() { new Person() { Name="Joe" },
                                  new Person() { Name="Jim" },
                                  new Person() { Name="Jack" },
                                  new Person() { Name="Joe" },
                                  new Person() { Name="Jim" } };

var duplicateItems = from x in people
                     group x by x.Name into grouped
                     where grouped.Count() > 1
                     select grouped.Key;
在这种情况下,

duplicateItems是一个字符串集合(Name):{“Joe”,“Jim”}

如果你正在寻找实际的Person对象,那么你可以做这样的事情(我想有一种更好的方法将它结合到上面):

var duplicatePeople = from x in people
                      where duplicateItems.Contains<string>(x.Name)
                      select x;

将返回Person对象的集合(两个Joe和两个Jim的)