【问题标题】:Algorithm to find the union of multiple strings grouped by character index查找按字符索引分组的多个字符串的并集的算法
【发布时间】:2014-03-13 00:18:06
【问题描述】:

我一直在尝试寻找一种高效的方法来查找一组按索引分组的fixed width 字符串中出现的字符的联合。像这样的东西;

s1 = "013965"
s2 = "015935"
s3 = "310012"

导致以下情况,其中每组数字都存在于 char 索引 n 处的所有字符串中:

out = "[03][1][350][90][631][52]"

我曾想过以一种非常天真的方式来遍历每个字符串,在每个索引处,同时将中间字符串存储在一个数组中,然后遍历该数组以构建输出值。然而,在我看来,我的方法似乎是一种效率极低的方法,与渐近最优解相去甚远。

【问题讨论】:

  • 通常最好让事情在功能上正确,然后在找到可行的解决方案后担心性能。虽然以天真的方式做事通常会帮助您看到可以轻松获得收益的地方。
  • 谷歌'配置文件矩阵生物信息学'。可能会给你一些想法。
  • 我认为你不能比天真的方式做得更好,因为通常你需要遍历所有字符串的所有位置(除非在位置 k 所有数字 0-9 已经出现)。想象一下,您所有的字符串都以 4 开头,最后一个字符串以 5 开头,那么您需要遍历所有字符串的 0 位置,以免错过最后一个字符串的 5(该位置与所有其他字符串不同)。这同样适用于每个职位。
  • @MagicMan, peter.petrov:感谢 cmets 和建议,但我对优化的想法至关重要,因为该算法将针对 120,000 个长度约为 10 的字符串执行。
  • @groovy,以前从未见过。我刚刚想到的优化之一是停止处理索引应该已经检测到所有 0-9 字符

标签: java performance algorithm optimization union


【解决方案1】:

如果事先知道所有可能字符的集合,假设它们的数字是nn 不太高(例如,10,如果你只做数字),你可以这样做创建长度为nm 布尔数组,m 是输入字符串中的位置数或数字,n。如果第 n 个字符出现在任何输入字符串的第 m 个位置,则第 m 个数组中的第 n 个位置将是 trueFalse 将表示,以前没有这样的字符在第 m 个位置。

然后您可以遍历每个字符串,当您在位置 m 遇到字符 n 时,您在第 m 个数组的第 n 个位置标记 true。最后,您将拥有m 数组,每个数组都描述了第 m 组的内容

pos[0] = {true, true, false, false, false, true, true, false, true, false}
pos[1] = {true, false, false, false, false, false, false, false, false, false}
pos[2] = {false, false, true, true, false, false, false, false, false, true}

翻译成

[0,1,5,6,8] [0] [2,3,9]

由于所有结构都是直接访问数组,因此不涉及查找,所有访问都是在恒定时间内进行的,您只需访问每个字符一次,不涉及比较。希望这会有所帮助。

【讨论】:

  • 根据第一组的数据翻译,第二组应该是[0],第三组应该是[2,3,9]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
相关资源
最近更新 更多