Devo usare Array o Set se entrambi possono essere utilizzati per completare il mio compito?

2

per esempio, Supponiamo che abbia un array 2d:

let filterArr=[
  [1,1,0,1,1],
  [0,1,1,1,0],
  [1,1,0,1,0]
];

Voglio trovare e memorizzare l'indice della colonna che sono tutti 1, cioè i punti 1 e 3, ei codici sono i seguenti:

Usa matrice:

let filterArr=[
  [1,1,0,1,1],
  [0,1,1,1,0],
  [1,1,0,1,0]
];

let results=[];
for(let i=0;i<filterArr[0].length;i++){
  let isAllOne=true;
  for(let filter of filterArr){
    if(filter[i]!=1){
      isAllOne=false;
      break;
    }
  }
  if(isAllOne){
    results.push(i);
  }
}
//store results for other use

Usa Set:

let filterArr=[
  [1,1,0,1,1],
  [0,1,1,1,0],
  [1,1,0,1,0]
];

let results=new Set();
for(let i=0;i<filterArr[0].length;i++){
  let isAllOne=true;
  for(let filter of filterArr){
    if(filter[i]!=1){
      isAllOne=false;
      break;
    }
  }
  if(isAllOne){
    results.insert(i);
  }
}
//store results for other use

Che ho trovato "risultati" può essere Array o Set. La mia domanda è, non limitata a questo caso, se ho trovato che sia Array che Set possono completare il mio compito, dovrei usare Array o Set?

    
posta mmmaaa 04.10.2018 - 07:59
fonte

2 risposte

6

L'uso di Array o Set con la tua funzione è equivalente: tu crei un contenitore e lo spingi dentro. Questo lascia due considerazioni:

  1. Che cosa deve fare il consumatore al contenitore?

  2. Quale contenitore è più efficiente (spazio o tempo)?

Se trovi che il consumatore esegue semplicemente un'iterazione sul contenitore, sia Array che Set sono equivalenti di nuovo da questa prospettiva di utilizzo. Tuttavia, se l'utente deve rispondere alla domanda "questo indice è nel contenitore?", Quindi Set è l'unico tipo di contenitore appropriato.

Dopo aver affermato che il tipo di contenitore è effettivamente irrilevante da utilizzare, sia sul lato produttore che su quello consumer, scegli il contenitore più efficiente:

  • Array dovrebbe essere implementato come un semplice schiaffo di memoria contigua che contiene (i riferimenti a) i suoi elementi. Un push() generalmente significa 1) controllando lo spazio (un confronto), 2) aggiungendo il nuovo elemento alla fine del buffer e 3) aggiornando il campo della lunghezza.

  • Set è richiesto per garantire che i suoi elementi siano unici. Cioè, dove Array.push() è felice di spingere un elemento due volte, Set.insert() deve in qualche modo catturare questa condizione e gestirla. Ciò richiede un lavoro extra . Per ottenere il rendimento di O(1) , Set verrebbe normalmente implementato come tabella hash. Le tabelle hash sono veloci, ma sono decisamente più complesse di un semplice buffer contiguo. Pertanto, Set.insert() dovrà generalmente fare molto più lavoro di Array.push() , e le sue strutture di dati sono molto probabilmente destinate a consumare più memoria.

Sia l'efficienza di spazio che quella del tempo sono migliori per Array che per Set . Ed è per questo che userò di default l'utilizzo di Array su Set ogni volta che il loro uso è equivalente .

    
risposta data 04.10.2018 - 11:18
fonte
2

Da ciò che hai mostrato nella tua domanda, non importa (e prendi in considerazione il refactoring del tuo codice nel caso in cui inizi a essere rilevante).

not limited to this case, if I found both Array and Set can finish my task, should I use Array or Set

La produzione di una matrice o di un set non è tipicamente fine a se stessa, è un mezzo per un fine, così spesso puoi scoprire che cosa potrebbe preferire il chiamante del tuo metodo che produce questo risultato.

Nota, se inizi a utilizzare un array e risulta che per un'ulteriore elaborazione un Set sarebbe vantaggioso (o hai bisogno di entrambi, l'array e la rappresentazione dell'insieme), puoi facilmente convertirlo:

  let resultSet = new Set(results)

Non sono un esperto di Javascript, ma mi aspetto che la conversione avvenga in un altro po 'di codice. Quindi, in caso di dubbio, personalmente inizierei con un array per primo e passerei a un set se si adatta meglio, ma questo è un po 'supponente.

    
risposta data 04.10.2018 - 09:30
fonte

Leggi altre domande sui tag