2014-09-05 6 views
6

Domanda principale: Qual è il modo più veloce per inserire un elemento in un elenco già ordinato utilizzando Julia?Inserisci elemento in un elenco ordinato con Julia (con e senza duplicati)

Attualmente, faccio questo:

v = [1, 2, 3, 5] #example list 
x = 4 #value to insert 
index = searchsortedfirst(v, x) #find index at which to insert x 
insert!(v, index, x) #insert x at index 

Bonus Domanda: Cosa succede se voglio assicurare contemporaneamente duplicati?

risposta

5

È possibile utilizzare searchsorted per ottenere la gamma di indici in cui il valore si verifica invece che solo il primo e quindi utilizzare splice! per sostituire i valori in tale intervallo con una nuova serie di valori:

insert_and_dedup!(v::Vector, x) = (splice!(v, searchsorted(v,x), [x]); v) 

Ecco una bella fodera che fa quello che vuoi.

julia> v = [1, 2, 3, 3, 5]; 

julia> insert_and_dedup!(v, 4) 
6-element Array{Int64,1}: 
1 
2 
3 
3 
4 
5 

julia> insert_and_dedup!(v, 3) 
5-element Array{Int64,1}: 
1 
2 
3 
4 
5 

Questo mi ha fatto pensare che splice! deve gestire il caso in cui la sostituzione è un valore singolo piuttosto che un array, così che io possa aggiungere quella caratteristica.

+0

Grazie, questo è molto pulito. –

+0

Ho cambiato la giuntura! per consentire all'argomento di sostituzione di essere enumerabile, che include valori scalari: https://github.com/JuliaLang/julia/commit/e048f2bf1b8da56b07738c0a4d142cd29e140e98. È ora possibile definire 'insert_and_dedup! (V :: Vector, x) = (splice! (V, searchsorted (v, x), x); v)' invece. – StefanKarpinski

+1

Grazie, e grazie anche per tutto il tuo lavoro su julia. Sto amando la lingua. –

Problemi correlati