【问题标题】:Algorithm for dividing a set of strings into a minimum set of mutually exclusive groups roughly the same size将一组字符串划分为大小大致相同的最小互斥组的算法
【发布时间】:2012-04-05 12:24:45
【问题描述】:

我有一大串字符串。我想将字符串分成子集,这样:

  1. 子集中的每个项目共享 1 个或多个连续字符。
  2. 定义子集的共享连续字符对于子集集是唯一的(即,共享字符足以定义与其他子集互斥关系的字符串子集)。
  3. 子集的大小大致相同。
  4. 生成的子集集是满足上述标准所需的最小子集数。

例如给定以下一组名称:

艾伦、拉里、阿尔弗雷德、芭芭拉、阿尔方斯、卡尔

我可以将这个集合分成大小相等的两个子集。由连续字符“AL”定义的子集 1 将是

艾伦、阿尔弗雷德、阿尔方斯

由连续字符 ar 定义的子集 2 将是

拉里、芭芭拉、卡尔。

我正在寻找一种可以对任意字符串集执行此操作的算法。子集的结果集不必等于 2,但它应该是最小集,并且结果子集应该近似相等。

艾略特

【问题讨论】:

  • 对于子集,连续字符是否总是必须在成员字符串的开头?
  • 没有。连续字符可以在字符串中的任何位置。

标签: string algorithm grouping


【解决方案1】:

看看http://en.wikipedia.org/wiki/Suffix_array。您真正想要做的可能是为每个文档创建一个后缀数组,然后它们合并所有后缀数组,并带有指向原始版本的指针,这样您就可以通过查找将集合作为一个字符串来搜索将其作为数组中的后缀。

【讨论】:

    【解决方案2】:

    这很棘手。我想知道是否有更高的目的(比如词索引)或者这只是一个学术问题?

    这通常是不可解的,除非您接受由空序列定义的单个集合的平凡解(出现在所有单词中)。例如,获取字符串:aabb

    1. a 必须进入a 定义的集合中。
    2. b 必须进入b 定义的集合中。
    3. ab 必须同时出现,因为它包含两个子序列。

    在您处理的单词类型上会出现类似的例子吗?我不知道。也许您可以处理映射到多个集合的单词,或者您可以拥有一个打破平局的系统来确定放置它的位置。

    假设这不是问题,burrows-wheeler transform 可能有助于找到好的子字符串。

    或者是这样的:

    1. 生成单词中的所有子序列。
    2. 构建子序列的干扰图,如果两个子序列都出现在一个单词中,则用一条边连接它们。
    3. 为图表着色。
    4. 为每种颜色选择一个有代表性的子序列。
    5. 创建一个由每个代表性子序列定义的集合。如果该颜色的所有单词都有该子字符串,则将它们全部放入该集合中。
    6. 否则,从图中删除该子字符串,然后从第 3 步开始重复。

    这个算法可能被破坏了,但它可能会给你一些关于解决方案的想法(或者至少对你的问题的复杂性有一些想法;-)。

    【讨论】:

    • 更高的目的是开发一种在数千个文档中搜索大量字符串的有效方法。将字符串分组为子集将使我能够快速消除可能性。如果定义子集的连续字符不在文档中,我不需要搜索子集的任何成员。参考上面的示例,如果文档中没有字符串“ar”,我知道我不需要搜索姓名 Carl、Barbara 或 Larry
    • 您是否考虑过将它们按级别划分?例如。找到一个出现在您的集合中大约一半单词中的子字符串,并在其上拆分(包括它的集合和没有它的集合)。然后对每个子集执行相同的操作。
    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多