2010-09-05 3 views
2

Я сравниваю подстроки в двух больших текстовых файлах. Очень простой, токенизация в два контейнера для токенов, по сравнению с 2 для циклов. Спектакль катастрофический! Есть ли у кого-нибудь совет или идея, как повысить производительность?Сравнение строк 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. А затем пытается сравнить substrings.Possision из Substrgs, которые существуют в обеих строках для хранения в векторе. Но производительность ужасна, также не знаю, как ее решить с помощью HashMap.

+2

Можете ли вы описать словами или с примером того, что ваш код делает ? –

ответ

7

Основная проблема заключается в том, что вы просматриваете все txtB для каждого токена в txtA.

Вы должны хранить информацию о токене от txtA (например, в HashMap), а затем во втором цикле (но не вложенном) вы сравниваете строки с существующим на карте.


На эту же тему:

+0

Спасибо, Colin HEBERT, "inested" -> "for() {for() {}}," "не вложен" -> "for() {}, для() {}" правильно? Hashmap Я действительно боюсь .. никогда код не закодировал его раньше. Так как я знаю в HashMap, мне нужно использовать HashSet, и теперь лишние токены удаляются !? Хорошо, они мне не нужны, но мне нужны их позиции. Можете ли вы сказать мне, PLS, если я могу хранить и получать позиции токена с помощью HashMap? – jackdaniels

+0

Это явно для вложенных/не вложенных. Если вы хотите сохранить позиции, вы можете сделать это 'HashMap >', чтобы вы могли иметь для каждого слова список своей позиции. Или лучше, вместо Integer вашей собственной структуры с именем, положением и другой информацией. –

+0

Huh ... думаю, я выполнил ваше предложение Колина. Но как-то не удалось получить параметры хашмапа .. Можете ли вы посмотреть PLS, код программирования здесь jackdaniels

2

Вы собираетесь присоединиться к вложенным циклам? Да, это O (n^2). А как насчет присоединения хэша? То есть, создайте карту из (нижняя) strText в t и выполняйте поиск с помощью этой карты, а не итерации по контейнеру с токеном?

+0

Привет, Меритон, Спасибо за помощь. Да, я сделал это, но больше не хочу. Производительность также была в порядке с небольшими строками, другая причина с вложенными циклами я смог хранить strPositions (из тех же подстрок) (почти), отсортированных в векторе. – jackdaniels

+0

Да, я получил его уже нет пути к Хешированию и картографии .. Мне нужно его изучить .. :-(Можете ли вы рассказать мне, как я могу сделать HashJoin на Java? Не нашел какой-либо Java-пример - особенно HashJoin в google ... И если вы делаете HashJoin, как я могу хранить subStr-positons, это необходимо для хранения. – jackdaniels

+0

Пожалуйста, скажите также, почему это требуется для строчной строки? Как я могу создать «карту из (с нижней) strText to t "? Это предложение я действительно не понял .. Спасибо заранее. Пожалуйста, сообщите мне также, почему это требуется строчной строчке Строка? Как я могу создать« карту из (с нижней) strText в т "?Это предложение, которое я действительно не делал. – jackdaniels

0

Поместите маркеры fileA в структуру данных trie. Затем, когда tokenising fileB вы можете проверить довольно быстро, если эти токены находятся в trie. Несколько кодовых комментариев помогут.

+0

Спасибо, Джеймс, какую структуру данных вы бы предложили использовать? – jackdaniels

+0

Больше комментариев, с удовольствием. Я читаю txt-файлы с помощью java-токенизатора в строку, а затем пытаюсь найти подстроку DocA в DocB. Выполнение этого в 2 случаях. 1-я случайная длина подстроки constat, 2-я случайная длина строки изменяется, поэтому я добавил «if (strLengthA> = dp.getMinStrLength())», чтобы уменьшить итерацию для очень коротких подстрок. – jackdaniels

+0

A Trie: http://en.wikipedia.org/wiki/Trie. – James

0

сказал, что это вопрос сложности и вы алгоритм работает в O (п^2) вместо O (n) с использованием хеша.

Для улучшения второго порядка попытаться вызвать меньше функций, например, вы можете получить размер один раз

sizeB = txtB.TokenContainer.size();

Depeneds по размеру, вы можете позвонить в контейнер один раз, чтобы получить массив строк, чтобы спасти getStr ....

Рони

+0

Спасибо, Рони, я не был уверен, что вызовы функций принесут некоторую производительность. Но, конечно, особенно «txtB.TokenContainer.size();» программные вызовы каждые n раз, абсолютно ненужные. – jackdaniels

Смежные вопросы