增加n ^ 2时间的算法

时间:2015-08-13 01:24:29

标签: java algorithm

好的,所以我的代码基本上循环了30,000行文本,对于每一行,它在另一个文件中运行20,000,000行文本以与之进行比较。

while(x.hasNextLine())
    while(y.hasNextLine())

其中x有30,000,y有20,000,000行。显然,这是永远的。现在我知道更好的算法,但我试图将一个String与一个String在另一个中进行比较,所以这有点困难。我在x中拆分了一个字符串,然后在y中拆分了一个字符串。如果x的第1部分和y的第2部分相等,我会增加并做一些其他的事情。通常,x出现在y几百次左右。

那么,有什么想法吗?我尝试在每次传递后删除y中的行,然后重写文件,以便每次在第二个循环中解析较少时,但是当你写一个> 500MB文件时,这显然无效。

2 个答案:

答案 0 :(得分:2)

如果我正确阅读,您正在从磁盘读取20M行(500MB)文件30,000次?

如果30k字符串足够小以保留在内存中,则可以反转循环的内部/外部位,并且只能通过500MB文件一次。假设DiskIO是瓶颈,这将节省大量时间。

答案 1 :(得分:0)

您正在使用的数据类型将真正决定如何加快速度。

例如: 如果您的字符串有一些结构,那么您可以考虑将20000字符串集排列成一种树数据结构,您只需将一个字符串的部分与另一个字符串进行比较,从而有效地减少了对某些子集的比较总数。 20k字符串。

您还可以通过一次运行多个线程来利用您的CPU架构。 即每次运行比较与20k字符串时创建一个单独的线程。

也许如果你发布一些你正在使用的字符串的例子,它会更容易找到优化,但在其他方面具有创造性:)

修改 另请参阅Google提供的Guava包中的Multimap。我记得在Yonks之前将它用于我的一个小项目,这看起来与你正在尝试的很相似。也许它会帮助你,因为它提供了一个键/值数据结构。