2014-09-05 26 views
6

Ana Soru: Julia ile sıralı bir listeye bir öğeyi eklemenin en hızlı yolu nedir?Öğeyi Julia ile sıralı bir listeye ekle (kopyalayan ve içermeyen)

Şu anda, bunu:

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 Soru: Ben aynı anda hiçbir çiftleri sağlamak istiyorsanız ne olacak?

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

var:

cevap

5

Sen değeri yerine birincinin oluşur endekslerinin dizi olsun ve sonra bir değerler yeni bir dizi ile bu aralıktaki değerleri değiştirmek için splice! kullanmak searchsorted kullanabilirsiniz İstediğiniz şeyi yapan güzel bir küçük astar.

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 

Bu

beni splice! yedek bir tek değer ziyade bir dizidir olaya el gerektiğini düşündürdü, bu yüzden bu özelliği ekleyebilir.

+0

Teşekkürler, bu çok temiz. –

+0

Eklentiyi değiştirdim! değiştirme argümanının skaler değerleri içeren sayılabilir bir şey olmasına izin vermek için: https://github.com/JuliaLang/julia/commit/e048f2bf1b8da56b07738c0a4d142cd29e140e98. Artık insert_and_dedup! (V :: Vector, x) = (splice! (V, searchsorted (v, x), x); v) 'yi tanımlayabilirsiniz. – StefanKarpinski

+1

Teşekkürler, ayrıca julia'daki tüm çalışmalarınız için teşekkürler. Ben dili seviyorum. –