我试图在java中的百万字的列表中显示子字符串的数量。循环遍历每个字符串以检查先前的值是否包含下一个值似乎具有主要的性能问题。用较少的单词,它可以正常工作,但是当涉及到一百万个单词的大量列表时,需要花费很长时间来计算。有人能告诉我最快的方法吗?
答案 0 :(得分:0)
我认为你可以在2N时间内获得它。
这是我的简单想法。但也许有人会更好。我好奇地等着。
答案 1 :(得分:0)
一个天真的解决方案是在Set
中插入所有子串,然后检查集合的大小。
如果这太慢,或者说内存消耗过多,那么自定义数据类型(例如平衡的字符树)可能会更快。
我猜想有一个约有1亿个子串的树几乎可以存储在32位的jvm中。
对于比这更大的数据集,也许散列筛选算法可能能够进一步用于内存解决方案。
可以使用一个不错的数据库或数据存储来索引和存储子字符串。
还有external sort algorithms可以使用几个文件排序所有子串,几乎没有内存..
实际上,如果您使用的是unix或linux,那么编写一个生成所有子字符串的程序就足够了,通过sort -q
和wc
来管理它并获得答案可能更快,没有几乎没有编码。但是,我认为这不会让你通过实验室。