Bu yanıt, performansın önemli olduğu büyük dizilerden birden çok değerin silinmesi durumuna özgüdür.
En çok oylanan çözümler (1) bir dizide desen değiştirme veya (2) dizi öğeleri üzerinde yineleme. Birincisi hızlıdır, ancak yalnızca farklı öneki olan öğelerle ilgilenebilir, ikincisi O (n * k), n = dizi boyutuna, k = kaldırılacak öğelere sahiptir. İlişkilendirilebilir dizi, göreceli yeni bir özelliktir ve soru ilk gönderildiğinde yaygın olmayabilir.
Tam eşleşme durumu için, büyük n ve k ile, performansı O (n k) 'dan O (n + k log (k))' ye geliştirmek mümkündür. Pratikte, O (n) k'nin n'den çok daha düşük olduğunu varsayar. Hızlandırmanın çoğu, kaldırılacak öğeleri tanımlamak için ilişkilendirilebilir dizi kullanmaya dayanır.
Performans (n dizi boyutu, silinecek k değerleri). Performans, kullanıcı zamanının saniyelerini ölçer
N K New(seconds) Current(seconds) Speedup
1000 10 0.005 0.033 6X
10000 10 0.070 0.348 5X
10000 20 0.070 0.656 9X
10000 1 0.043 0.050 -7%
Beklendiği gibi, current
çözüm N * K'ye doğrusaldır ve fast
çözüm pratik olarak K'ya doğrusaldır ve çok daha düşük sabittir. fast
Çözelti biraz daha yavaş vs olduğu current
bir çözüm, ek düzenlemesi nedeniyle, k = 1,.
'Hızlı' çözüm: dizi = girdi listesi, sil = kaldırılacak değerlerin listesi.
declare -A delk
for del in "${delete[@]}" ; do delk[$del]=1 ; done
# Tag items to remove, based on
for k in "${!array[@]}" ; do
[ "${delk[${array[$k]}]-}" ] && unset 'array[k]'
done
# Compaction
array=("${array[@]}")
current
En çok oylanan cevaptan çözüme karşı kıyaslandı.
for target in "${delete[@]}"; do
for i in "${!array[@]}"; do
if [[ ${array[i]} = $target ]]; then
unset 'array[i]'
fi
done
done
array=("${array[@]}")
zsh
.