2010-09-05 80 views
2

我正在比较两个大文本文件中的子字符串。非常简单,标记为两个令牌容器,与2 for循环比较。 性能不堪设想!有没有人有建议或想法如何提高性能?Java字符串比较

for (int s = 0; s < txtA.TokenContainer.size(); s++) { 
    String strTxtA = txtA.getSubStr(s); 
    strLengthA = txtA.getNumToken(s); 

    if (strLengthA >= dp.getMinStrLength()) { 
     int tokenFileB = 1; 

     for (int t = 0; t < txtB.TokenContainer.size(); t++) { 
      String strTxtB = txtB.getSubStr(t); 
      strLengthB = txtB.getNumToken(t); 

      if (strTxtA.equalsIgnoreCase(strTxtB)) { 
       try { 
        subStrTemp = new SubStrTemp(
         txtA.ID, txtB.ID, tokenFileA, tokenFileB, 
         (tokenFileA + strLengthA - 1), 
         (tokenFileB + strLengthB - 1)); 

        if (subStrContainer.contains(subStrTemp) == false) { 
         subStrContainer.addElement(subStrTemp); 
        } 
       } catch (Exception ex) { 
        logger.error("error"); 
       } 
      } 
      tokenFileB += strLengthB; 
     } 
     tokenFileA += strLengthA; 
    } 
} 

一般来说我的代码读取与Java Tokonizer两个大串入容器A和B.然后试图比较这些两个字符串现有存储到一个Vector Substrgs的substrings.Possision。但是性能很糟糕,也不知道如何用HashMap解决它。

+2

你可以在口头上或与您的代码所做的例子说明? – 2010-09-05 20:23:02

回答

7

您的主要问题是您经历txtA中每个令牌的所有txtB。

您应该存储txtA中令牌的信息(例如HashMap),然后在第二个循环(但不是嵌套的)中比较字符串与Map中现有的字符串。


关于同一主题:

+0

谢谢Colin HEBERT,“嵌套” - >“for(){for(){}},”“嵌套” - >“for(){},for(){}”对不对?哈希映射我真的很害怕..从来没有代码编码过。因为我知道在HashMap中我必须使用HashSet,这里多余的标记会被删除!?好吧,我不需要他们,但我需要他们的职位。你能告诉我,如果我能用HashMap存储和检索令牌位置? – jackdaniels 2010-09-06 10:17:00

+0

这是嵌套/不嵌套的。如果你想保留职位,你可以这样做'HashMap >',这样你可以为每个单词列出一个位置。或者更好,而不是用文件名,位置和其他信息整数你自己的结构。 – 2010-09-06 11:43:44

+0

呃......以为我实施了你的建议Colin。但不知何故无法获得Hashmap参数..你可以看看请问,编程代码在这里 jackdaniels 2010-09-06 16:31:03

2

您正在使用嵌套循环进行连接?是的,那是O(n^2)。那么做一个散列连接呢?也就是说,创建一个从(小写)strTextt的映射,并使用此映射进行查找,而不是遍历令牌容器?

+0

Hello Meriton,谢谢您的帮助。是的,我做到了,但不想再做更多。性能也可以用小字符串,嵌套循环的另一个原因我可以存储strPositions(相同的子字符串)(几乎)排序在一个Vector中。 – jackdaniels 2010-09-06 10:46:30

+0

是的,我已经得到了它没有办法绕过散列和映射..我必须学习它.. :-(你能告诉我,我该怎么做一个Java的HashJoin?没有找到任何Java相关的例子 - 特别是在谷歌HashJoin ...如果做HashJoin如何存储subStr-positons,这些都是必要存储。 – jackdaniels 2010-09-06 11:00:31

+0

请告诉我,为什么它需要小写字符串?我怎样才能创建一个“从(小写) strText中以T“?这句话我真的不明白..谢谢提前。 请告诉我,还有,为什么它需要小写字符串?我怎样才能建立一个”从地图(小写)strText中来T“?这句话我真的没有承担.. – jackdaniels 2010-09-06 11:03:21

0

将fileA的令牌放入trie数据结构中。然后,在标记fileB时,您可以非常快速地检查这些标记是否在特里结构中。一些代码评论会有所帮助。

+0

谢谢James,你会建议使用哪种数据结构? – jackdaniels 2010-09-06 10:21:01

+0

更多评论,很高兴..我在java tokenizer的帮助下阅读txt文件到一个字符串中,然后试图在DocB中搜索DocA的子字符串。这样做2例。第一种情况substr-length是constat,第二种情况是substr-length不同,为此我添加了“if(strLengthA> = dp.getMinStrLength())”来减少非常短的子串的迭代次数。 – jackdaniels 2010-09-06 10:32:54

+0

A Trie:http://en.wikipedia.org/wiki/Trie。 – James 2010-09-06 11:24:54

0

甲说,这是复杂的问题,你是算法运行在为O(n^2)而不是O(n)使用散列。

二阶改进,尽量少打电话向功能,例如你可以得到的大小,一旦

sizeB = txtB.TokenContainer.size();

的大小Depeneds,你可以调用容器一旦获得字符串保存getStr数组....

罗尼

+0

感谢Roni,我不确定调用函数是否需要一些性能。但是,当然,特别是“txtB.TokenContainer.size();”程序每次调用n次,绝对不必要。 – jackdaniels 2010-09-06 09:59:12