【问题标题】:finding repeated sequences寻找重复序列
【发布时间】:2016-04-15 19:13:27
【问题描述】:

我需要帮助来找到合适的算法来解决我的目标。

假设我有一个包含 10000 条关于某些事件的记录的数据集。我有 50 种事件类型,因此我的数据集中的每条记录都分配了一些事件(从 1 到 50)。

我的数据集示例(2 列:记录号、事件号):

1. 13
2. 24
3. 6
4. 50
5. 24
6. 6
...
10000. 46

正如您在此示例中所见,我有一个数字 24、6 的重复序列。现在我想找出我的数据集中有多少这些以及其他未知序列。我也想知道每个序列的多重性。我检查了 Rabin–Karp 算法,但在我看来,我必须先指定模式/序列。但是我希望该算法能够自行找到它。

我被告知还要查看层次聚类,但我不确定它是否符合我的要求。

总而言之,我想找到一种算法,可以在上述数据集中找到所有重复序列及其多重性。

【问题讨论】:

  • 您可以构建一个后缀树并使用它来识别重复的子序列。
  • 按事件类型分组(保存索引)。对于每个组(大于一个成员)按第一个事件类型之后的事件类型分组,依此类推。
  • 使用已发布的十几种 ## 顺序频繁模式最小化算法中的任何一种。他们旨在发现这样的模式:购买产品 a 的客户往往会在第二天回来购买电缆 b。
  • @SelçukCihan 我看过后缀树,但在我看来,使用后缀树我只能在 mzydatabase 中找到已知模式。但是,我想在事先不知道的情况下检测数据库中的所有模式/序列。如果这可以使用后缀树来实现,您能否指点我一些关于这个问题的文章/教程?谢谢

标签: c# algorithm logic data-mining


【解决方案1】:

我假设您将这些数据保存在与您提供的结构相同的文本文件中, 我使用 LINQ 对每个值进行分组和计数,如下代码所示:

static void Main(string[] args)
    {
        //read lines from the text file
        var arr = File.ReadAllLines("dataset.txt").AsQueryable();
        //convert the data to List<object> by convert each line to anonymous object
        var data = arr.Select(line => new { Index = line.Split('.')[0], Value = line.Split('.')[1] });
        //group the data by the value and then select the value and its count
        var res = data.GroupBy(item => item.Value).Select(group => new { Value = group.First().Value, Count = group.Count() });
        //printing result
        Console.WriteLine("Value\t\tCount");
        foreach (var item in res)
        {
            Console.WriteLine("{0}\t\t{1}",item.Value,item.Count);
        }
        Console.ReadLine();
    }

The result of previous code

希望对你有所帮助。

【讨论】:

  • 看起来您只是在计算重复的项目。例如,此序列将产生类似的结果:13, 24, 6, 6, 24, 50 在您的代码中,但它违反了 OP 要求,例如24 -&gt; 6 的序列不会重复两次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 2011-10-22
  • 2018-04-24
  • 1970-01-01
  • 2016-10-08
相关资源
最近更新 更多