Domanda

Sto lavorando su un'applicazione che ha un grande array contenente linee di numeri,

transNum[20000][200]//this is the 2d array containing the numbers and always keep track of the line numbers

Sto usando un ciclo annidato per cercare il maggior numero di elementi frequenti. che è

for(int i=0/*,lineitems=0*/;i<lineCounter;i++)
  {
      for(int j=0,shows=1;j<lineitem1[i];j++)
      {
          for(int t=i+1;t<lineCounter;t++)
          {
              for(int s=0;s<lineitem1[t];s++)
              {
                  if(transNum[i][j]==transNum[t][s])
                      shows++;
              }
          }

          if(shows/lineCounter>=0.2)
          {

              freItem[i][lineitem2[i]]=transNum[i][j];
              lineitem2[i]++;
          }
      }

  }

quando facevo test usando array in input piccole come prova [200] [200], questo ciclo funziona bene e il tempo di calcolo è accettabile, ma quando provo ad elaborare la matrice contiene 12000 linee, il tempo di calcolo è troppo lungo , così sto pensando se ci sono altri modi per calcolare le voci frequenti, piuttosto che utilizzare questo loop.I appena eseguito un test su 10688 linee, e il tempo per ottenere tutto l'oggetto frequente è 825805ms, che è il modo costoso.

È stato utile?

Soluzione

Dipende dal vostro input. Se siete anche inserire i dati nello stesso codice, allora si può contare elementi frequenti quando si inserisce loro.


Ecco una soluzione pseudo-C:

int counts[1000000];

while(each number as n)
{
    counts[n]++;
    // then insert number into array
}

Modifica # 2:. Assicurati, in modo da non ottenere risultati inaspettati, per inizializzare tutti gli elementi dell'array a zero

Altri suggerimenti

Tenete a mente questo è un (n ^ 2) algoritmo O al meglio e potrebbe essere peggio. Ciò significa che il numero di operazioni è proporzionale al conteggio degli elementi quadrati. Dopo un certo numero di linee, le prestazioni si degradano rapidamente e non c'è niente che tu possa fare se non per migliorare l'algoritmo.

Il Multiset realizzazione dal progetto di Google Guava potrebbe essere utile in questi casi. Si potrebbe memorizzare gli oggetti lì e quindi recuperare un insieme di valori con il conteggio di ogni occorrenza.

ha dato l'algoritmo per questo qualche pensiero. Ecco la soluzione mi si avvicinò con:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;

public class NumberTotalizerTest {

    public static void main(String args[]) {

        HashMap<Integer,Integer> hashMap = new HashMap<Integer,Integer>();

        // Number input
        Random randomGenerator = new Random();
        for (int i = 1; i <= 50; ++i ) {
            int randomInt = randomGenerator.nextInt(15);
            System.out.println("Generated : " + randomInt);

            Integer tempInt = hashMap.get(randomInt);

            // Counting takes place here
            hashMap.put(randomInt, tempInt==null?1:(tempInt+1) );
        }

        // Sorting and display
        Iterator itr =  sortByValue(hashMap).iterator();

        System.out.println( "Occurences from lowest to highest:" );

        while(itr.hasNext()){
            int key = (Integer) itr.next();

            System.out.println( "Number: " + key + ", occurences: " + hashMap.get(key));
        }
    }

     public static List sortByValue(final Map m) {
        List keys = new ArrayList();
        keys.addAll(m.keySet());
        Collections.sort(keys, new Comparator() {
            public int compare(Object o1, Object o2) {
                Object v1 = m.get(o1);
                Object v2 = m.get(o2);
                if (v1 == null) {
                    return (v2 == null) ? 0 : 1;
                }
                else if (v1 instanceof Comparable) {
                    return ((Comparable) v1).compareTo(v2);
                }
                else {
                    return 0;
                }
            }
        });
        return keys;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top