【发布时间】:2015-07-11 18:26:13
【问题描述】:
我给出了一组包含两个元素的元组(它们按第二个元素排序):
{
{(1,"c1"), (1,"c2"), (1,"c3"), (1,"c5")}
{(1,"c1"), (2,"c3"), (1,"c5")},
{(1,"c1"), (1,"c3"), (1,"c5")},
}
任务是替换元素的冗余子集。给定一个数字 k >= 1。用至少 k 个元素替换所有子集,这些元素在样本集中出现多次。替换序列应尽可能大。 简化形式:
{
{z, (1,"c2")}
{(1,"c1"), (2,"c3"), (1,"c5")},
{z},
}
z := {(1,"c1"), (1,"c3"), (1,"c5")}
我的原生方法是, 从第一组开始,然后为每组计算他们有多少匹配。然后选择匹配最多的那个并替换。然后重新开始这个过程,直到没有其他集合有超过 k 个匹配。然后移动到下一组并做同样的事情,您可以忽略之前的所有组。
只有当两个值匹配时元素才相等。第二个值是一个字符串,但首先用数字替换它们可能会更好。第一个是浮点数。
这在我看来很像数据压缩。有没有更有效的算法来计算这个?有没有为此目的的良好数据结构?
【问题讨论】:
-
第二个 sn-p 的第二行有错字吗?它应该是:
{z, (1,"c2")}吗?此外,这似乎类似于longest repeated sub-sequence problem。 -
是的,修复了它,是的,这看起来像我要找的东西
-
您描述的技术,您需要从一组中挑选每个可能的序列并将其与其他组进行比较。这似乎是 O(n!xm) 时间复杂度。其中 n 是平均集合大小,m 是集合数。这很快就会失控。您的问题比 wiki 问题稍微复杂一些,因为您的子字符串不必连续才能匹配(例如 line2 中的额外 c2 仍然是匹配项)。如果你仍然能以某种方式解决这个问题,O(nxm) 将是一个很大的改进。
-
刚刚看到你的另一个问题:stackoverflow.com/questions/29996166/… 这个问题似乎是那个问题的续集,例如,它正在使用正则表达式吐出的输出?只是为了确保我们不会追逐 XY problem,您能否描述一下您实际上想要对这些操作进行哪些操作?
-
该文件由线性方程组成。在我读完所有方程后,我需要检测出现在许多方程中的冗余部分,并将它们作为新方程插入,将它们设置为等于替换变量,然后将其插入原始位置。系统将变得更大,但更稀疏,因为每一行包含的条目更少。
标签: c++ performance algorithm data-structures