![]() |
1
5
算法1:测试对,而不是单子
它的平均算法复杂度为
解释
此算法调整为比列表中的项数短得多的单词。如果列表很短,单词很长,那么切换回合成任务而不是分解任务会更好。考虑到列表的大小是50000个字符串,而且德语单词虽然很长,但不太可能超过50个字符,这是有利于此算法的1:1000因素。 另一方面,如果你有50个平均长度为50000个字符的字符串,那么一个不同的算法会更有效率。
我考虑了一会儿的一个算法是对列表进行排序,因为我知道如果一个字符串代表一对的开头,那么所有可能是它的一对的候选字符串都将按顺序紧跟在它之后,在以该字符串开头的一组项目中。整理我上面的棘手数据,并添加一些混淆(
因此,如果保留要检查的所有项目的运行集,我们可以在每个单词的基本恒定时间内找到候选组合,然后直接探测剩余单词的哈希表:
结果:
这个算法的复杂度要复杂一些。我想搜索的部分是
|
![]() |
2
1
你可以改进
Erikâs answer
通过避开大部分潜艇-
这是相同的算法,因此不会改变时间复杂度,除非合并隐藏字符数据复制成本,这将是另一个因素(乘以平均字符串长度)。
当然,只有在使用与打印匹配项不同的终端操作时,差异才会变得显著,因为打印是一项昂贵的操作。同样,当源是一个大文件上的流时,I/O将控制操作。除非你进入一个完全不同的方向,比如使用内存映射和重构这个操作
|
![]() |
3
0
以第一个字符串作为前缀,第二个字符串作为后缀。 你仔细检查每根绳子。如果字符串以第一个字符串开头,则检查它是否以第二个字符串结尾。一直走到最后。为了在检查字母本身是否相同之前节省一些时间,您可以进行长度检查。 这几乎是你做的,但这个额外的长度检查,你可能可以削减一些。至少这是我的看法。 |
![]() |
4
0
不确定这是否比你的解决方案好,但我认为值得一试。 构建二 Tries ,一个按正常顺序排列,另一个按倒序排列。
向前走
我贴了一张
|