2011-05-11 2 views
1

J'ai des tableaux de chaînes de tableaux.Comment optimiser la recherche sur array of String array?

List<String[]> mainList = new ArrayList<String[]>(); 

String[] row1 = {"foo", "bar", "moo"} 
String[] row2 = {"cocoa", "zoo", "milk", "coffee"} 

mainList.add(row1); 
mainList.add(row2); 

Disons que je veux trouver un élément « lait ».

Je pourrais faire avec N^2.

for(int i=0, j=mainList.size(); i<j; i++) { 
    for(int x=0, y=mainList.get(i).length(); x<y; x++) { 
     String item = mainList.get(i)[x]; 

     if(item.equals("milk")) { 
      return true; //found milk 
     } 
    } 
} 

J'ai essayé de le rendre plus rapide en mettant tous les éléments comme touche de carte.

//put all elements to map key 
Map m = new HashMap<String, String>(); 
for(int i=0, j=mainList.size(); i<j; i++) { 
    for(int x=0, y=mainList.get(i).length(); x<y; x++) { 
     m.put(mainList.get(i)[x], "whatever"); 
    } 
} 

//now iterate and see if key "milk" is found 
if(m.contains("milk")) { return true; } 

Mais je compris cela est encore N^2 (c.-à boucle à l'intérieur de la boucle, lorsque le nombre de rangées ajouté à mainlist comme row3 [ « item1 », « item2 », « item3 »], le incréments d'itération dans N^2)

comment puis-je optimiser ceci sans N^2?

+0

'Carte m = new HashMap ();' Ceci ne sera pas compilé car une carte a deux paramètres de type. Aussi, qu'est-ce qui te fait penser que ce sera O (n^2)? –

+0

oups, je vais le réparer maintenant, merci d'avoir signalé –

Répondre

3

Aucun des deux algorithmes n'est N^2 puisque vous ne visitez qu'une seule fois les éléments. Cependant, le premier algorithme est O (N) pour chaque recherche, mais le deuxième algorithme est O (N) pour remplir la carte et O (1) pour chaque consultation ultérieure.

+0

Oh, j'ai supposé que c'était N^2 parce que pour la boucle à l'intérieur de la boucle for. Je peux être malentendu –

+2

Les limites de la boucle sont différentes, donc il ne peut pas être N^2. Vous pouvez l'appeler M * N avec M = mainList.size() et N = max (longueur de tout tableau dans mainList), mais la partie importante de la complexité algorithmique consiste à déterminer quelle est votre opération significative. Dans ce cas, c'est le nombre de comparaisons, qui a une limite supérieure de tous les éléments dans tous les tableaux dans toutes les listes (c'est-à-dire, un certain nombre N). Si votre algorithme essayait à la place de compter le nombre de doublons en utilisant pour (mainList) pour (array) pour (mainList) pour (array), ce serait N^2. –

2

Pourquoi ne peut pas être le code ci-dessous?

 String[] row1 = {"foo", "bar", "moo"}; 
     String[] row2 = {"cocoa", "zoo", "milk", "coffee"}; 

     HashMap<String, String> mainMap = new HashMap<String, String>(); 
     for(String s: row1) { 
      mainMap.put(s, s); 
     } 

     for(String s: row2) { 
      mainMap.put(s, s); 
     } 

     System.out.println(mainMap.get("milk") != null); 
1

Bkail m'a battu à cette réponse, mais la mienne pourrait fournir un peu plus de perspicacité (même si elle est la même.)

Je crois que vous pourriez être un peu clair sur votre temps de recherche et votre construction temps.

Pour le premier exemple que vous avez fourni, je pense que vous avez un temps de construction constant (alloue une constante de tableau statique en Java?). Ensuite, votre temps de recherche (pour chaque recherche) est n (pour n éléments, pas n * n). Je peux voir comment cela peut être un peu déroutant avec votre notation, car vos éléments n viennent en deux rangées. Cependant, pour votre deuxième exemple, vous dépensez n en construction. Votre recherche actuelle est O (1), comme les autres réponses ont dit. Donc, la chose importante à considérer est ce que vous mesurez. Asymptotic notation pour la recherche est ce qui vous intéresse.

Bonne chance!