2015-05-05 3 views
1

Я знаю, что есть много материалов, касающихся этого, но у меня были довольно конкретные вопросы. У меня есть файл, содержащий почтовые коды, и мне нужно создать структуру данных trie, используя эти коды. я написал свою реализацию, которая -Trie - Реализация в java

public class Trie{ 

TrieNode root = null; 

public void addWord(String zipCodeStr){ 
    if(root==null){ 
     root = new TrieNode(); 
    } 
    TrieNode current = root; 
    for(char c : zipCodeStr.toCharArray()){ 
     if(current.childern[Character.getNumericValue(c)]==null){ 
      current.childern[Character.getNumericValue(c)] = new TrieNode(); 
     } 
     current = current.childern[Character.getNumericValue(c)]; 
    } 
    current.isWord = true; 
} 

public boolean exists(String zipCodeStr){ 
    boolean result = true; 
    TrieNode current = root; 
    for(char c : zipCodeStr.toCharArray()){ 
     if(current.childern[Character.getNumericValue(c)]==null){ 
      result = false; 
      break; 
     } 
     current = current.childern[Character.getNumericValue(c)]; 
    } 
    if(result && current.isWord){ 
     result = true; 
    }else{ 
     result = false; 
    } 
    return result; 
} 

private static class TrieNode{ 

    TrieNode[] childern = new TrieNode[10]; 
    boolean isWord = false; 

    public TrieNode() { 
    } 

} 
} 

Здесь я не хранить любое значение, как положение дает эту информацию.

Вопросы - i) Можно ли еще импровизировать? ii) Размер исходного текстового файла, содержащий 27000+ кодов, составляет около 190 КБ, и я проверил размер объекта trie, используя профилировщик, который вышел намного больше. Profiler output Связаны ли эти два размера? Должен ли размер trie быть меньше размера исходного текстового файла?

Спасибо, Ouney

+1

Вашего Trie узел занимает 24 самих байт плюс 104 байт s для массива 'children'. Номера выглядят нормально. Организация данных в структурах, в большинстве случаев, вы занимаете место для доступа к скорости доступа (файл: меньше места, более длинный доступ, trie: больше места, более быстрый доступ). –

ответ

3

предположив, что ~ 9/10 узлы листья (не содержат детей), вы можете значительно уменьшить пространство, что вся структура занимает от ленивой инициализации children массива:

private static class TrieNode { 
    TrieNode[] children = null; 
    boolean isWord = false; 
} 

Теперь вам нужно создать новый массив, только если это действительно необходимо:

public void addWord(String zipCodeStr) { 
    if (root == null){ 
     root = new TrieNode(); 
    } 
    TrieNode current = root; 
    for (char c : zipCodeStr.toCharArray()) { 
     if (current.children == null) { 
      current.children = new TrieNode[10]; 
     } 
     if (current.children[Character.getNumericValue(c)] == null) { 
      current.children[Character.getNumericValue(c)] = new TrieNode(); 
     } 
     current = current.children[Character.getNumericValue(c)]; 
    } 
    current.isWord = true; 
} 
+1

Да, действительно полезное предложение. Самые узкие узлы уровня trie относятся к массивам, которые не используются и значительно уменьшают экземпляры массива. Благодарю. – Ouney

+0

Я также получаю, что размер необработанного текстового файла не связан. Если у меня 27000 почтовых кодов, то в UTF-8 он будет занимать 27000 * 6 = 162000 байт (162 kb), тогда как структура данных Trie будет занимать гораздо больше, в зависимости от распределения. – Ouney

+0

@Ouney это компромисс для лучшего доступа. В Java-объектах не может быть меньше 16 байт, тогда размер увеличивается на шаг 8 байт: 24, 32, ... В вашем trie вам нужно ~ 1.2 24-байтовый объект для каждого почтового индекса, поэтому ~ 800Kb - лучший из вас можно достичь. –

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