Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找按字符索引分组的多个字符串的并集的算法_Java_Performance_Algorithm_Optimization_Union - Fatal编程技术网

Java 查找按字符索引分组的多个字符串的并集的算法

Java 查找按字符索引分组的多个字符串的并集的算法,java,performance,algorithm,optimization,union,Java,Performance,Algorithm,Optimization,Union,我一直在想一种性能高效的方法,在一组按索引分组的固定宽度字符串中查找字符出现的并集。像这样的东西 s1 = "013965" s2 = "015935" s3 = "310012" 结果如下,每组数字存在于char索引n处的所有字符串中: out = "[03][1][350][90][631][52]" 我曾经想过用一种非常简单的方法来做这件事,即在每个索引处迭代每个字符串,同时将中间字符串存储在一个数组中,然后迭代该数组以构建输出值。然而,在我看来,我的方法是一种非常低效的方法,它离渐近

我一直在想一种性能高效的方法,在一组按索引分组的
固定宽度
字符串中查找字符出现的并集。像这样的东西

s1 = "013965"
s2 = "015935"
s3 = "310012"
结果如下,每组数字存在于char索引n处的所有字符串中:

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

我曾经想过用一种非常简单的方法来做这件事,即在每个索引处迭代每个字符串,同时将中间字符串存储在一个数组中,然后迭代该数组以构建输出值。然而,在我看来,我的方法是一种非常低效的方法,它离渐近最优解太远了

如果预先知道所有可能的字符集,假设它们的编号为
n
,并且
n
不太高(例如,如果只做数字,则为10),则可以通过创建长度为
n
m
布尔数组来实现,其中
m
是位置数,或输入字符串中的数字和
n
。如果第n个字符出现在任何输入字符串的第m个位置,则第m个数组中的第n个位置将为
true
False
将表示以前没有此类字符位于第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]

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

通常,最好只是让事情在功能上正确,然后在找到有效的解决方案后再考虑性能。在做事情的时候,这种天真的方式通常能帮助你看到容易获得收益的地方。可能会给你一些想法。我认为你不能比天真的方法做得更好,因为通常你需要遍历所有字符串的所有位置(除非在位置k处所有数字0-9都已经出现)。假设您的所有字符串都以4开头,最后一个字符串以5开头,那么您需要遍历所有字符串的0位置,以避免错过最后一个字符串的5(该位置与所有其他位置不同)。这同样适用于每个职位。@MagicMan,peter.petrov:谢谢您的评论和建议,但是我需要考虑优化问题,因为算法将针对120000个长度为10的字符串执行。@groovy,以前从未见过。我刚刚想到的一个优化是,如果已经检测到所有0-9个字符,就停止处理索引。根据在第一组中完成的数据转换,第二组应该是[0],第三组应该是[2,3,9]