Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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 增加n^2倍的算法_Java_Algorithm - Fatal编程技术网

Java 增加n^2倍的算法

Java 增加n^2倍的算法,java,algorithm,Java,Algorithm,好的,我有一段代码,基本上循环了30000行文本,每行,它在另一个文件中运行20000000行文本,与之进行比较 while(x.hasNextLine()) while(y.hasNextLine()) 其中x有30000行,y有20000000行。很明显,这需要很长时间。现在我知道了更好的算法,但是我试着比较一个字符串中的一个字符串和另一个字符串中的一个字符串,所以这有点困难。我把一个字符串分成x,把一个字符串分成y。如果x的第1部分和y的第2部分相等,我增加并做一些其他的事情。一

好的,我有一段代码,基本上循环了30000行文本,每行,它在另一个文件中运行20000000行文本,与之进行比较

while(x.hasNextLine())
    while(y.hasNextLine())
其中x有30000行,y有20000000行。很明显,这需要很长时间。现在我知道了更好的算法,但是我试着比较一个字符串中的一个字符串和另一个字符串中的一个字符串,所以这有点困难。我把一个字符串分成x,把一个字符串分成y。如果x的第1部分和y的第2部分相等,我增加并做一些其他的事情。一般来说,x在y中出现几百次左右


有什么想法吗?我尝试在每次循环后删除y中的行,然后重写文件,使其在第二个循环中每次解析的次数更少,但显然这对编写大于500MB的文件没有帮助。

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

例如: 如果您的字符串具有某种结构,那么您可以考虑将20000组字符串安排成一种树状数据结构,在这里只比较一个字符串到另一个字符串的节段,有效地减少对20K字符串的某些子集的比较总数。 您还可以通过同时在多个线程上运行来利用CPU体系结构。 Ie在每次运行与20k字符串的比较时创建一个单独的线程

也许如果你发布一些你正在使用的字符串的例子,你会更容易找到优化,但要有创意:)

编辑:
也可以从google提供的软件包中查看Multimap。我记得很久以前在我的一个小项目中使用过它,这似乎和你正在尝试的非常相似。也许它会帮助您,因为它提供了一个键/值数据结构。

如果我读对了,您从磁盘读取20M行(500MB)文件30000次


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

我在x中拆分字符串,在y中拆分字符串。如果x的第1部分和y的第2部分相等;请发那个密码!我认为除非对文本进行排序或以某种特定的顺序进行排序,否则不会有显著的改进空间。如果可以,请将
字符串
s从
y.hasNextLine()
存储到
集合中
并进行
x.hasNextLine()的查找
针对此
设置
。这将大大改进代码。如果一个字符串一旦找到就可以从
y
中删除,那么它会更快。首先将30k放入内存中的散列中。然后是一个循环通过20M,每个循环的查找时间恒定。