Batch inserisce un gruppo di elementi in una lista ordinata e ottiene i loro indici

2

Sto lavorando a un processo di aggiornamento che inserisce elementi in un elenco ordinato e elabora gli indici di tali elementi nell'elenco ordinato.

Per aiutarmi con questo, ho creato una lista ordinata con un metodo "insert" che restituisce l'indice del nuovo elemento nella lista. Ad esempio, dato un elenco di [1, 3, 5] , quindi insert(4) cambierà la lista in [1, 3, 4, 5] e restituirà 2 (0-indicizzato). Quindi elaboro il risultato con process(2) .

Attualmente, quando devo fare più aggiornamenti, faccio qualcosa di simile a

for el in elements
   index = list.insert(el)
   beginUpdates()
   process(index)
   endUpdates()

In desidera ottimizzare i tempi di aggiornamento elaborando più indici in un singolo aggiornamento. Ovviamente, quanto segue sarebbe errato:

indices = []
for el in elements
   indices.append(list.insert(el))
beginUpdates()
for index in indices
   process(index)
endUpdates()

perché ogni inserimento potrebbe invalidare un indice calcolato in precedenza. Ad esempio:

list = [1, 3, 5]
index1 = list.insert(4) // index of 4: 2
index2 = list.insert(2) // index of 4: 3

Ora, se I process(index1) , elabora l'indice sbagliato.

Quindi penso che, nello stesso modo in cui posso elaborare gli indici in batch, dovrei avere un metodo per inserire in batch gli elementi e ottenere i loro indici corretti. Qualcosa che mi permetta di fare

indices = list.batchInsert(elements)
beginUpdates()
for index in indices
   process(index)
endUpdates()

Esiste un algoritmo che può farlo elegantemente?

    
posta Phlippie Bosman 21.09.2016 - 16:52
fonte

1 risposta

1

OK, quindi dopo un po 'di riflessione, i miei colleghi e io ci siamo inventati: %codice% (Scusa lo Swift :) L'idea è che, poiché gli elementi da inserire sono già ordinati, nessun inserimento specifico invalida qualsiasi indice ottenuto in precedenza, perché sono necessariamente inseriti dopo quelli precedenti.

Per un'ulteriore ottimizzazione, potrei scrivere una funzione func insertBatch(elements: [Element]) -> [Int] { let results: [Int] = [] let sortedElements = elements.sort() for el in sortedElements { let i = insert(el) results.append(i) } return results } che non tenterà di inserire il nuovo elemento prima di insert(minIndex: Int) , quindi di passarlo al risultato precedente.

Vorrebbe ancora aspettare e vedere se c'è una soluzione più intelligente.

    
risposta data 21.09.2016 - 17:53
fonte

Leggi altre domande sui tag