Jawaban ini khusus untuk kasus penghapusan beberapa nilai dari array besar, di mana kinerja itu penting.
Solusi yang paling banyak dipilih adalah (1) substitusi pola pada array, atau (2) iterasi atas elemen array. Yang pertama cepat, tetapi hanya dapat menangani elemen yang memiliki awalan berbeda, yang kedua memiliki O (n * k), n = ukuran larik, k = elemen yang akan dihapus. Array asosiatif adalah fitur relatif baru, dan mungkin tidak umum saat pertanyaan pertama kali diposting.
Untuk kasus pencocokan tepat, dengan n dan k besar, mungkin untuk meningkatkan kinerja dari O (n k) ke O (n + k log (k)). Dalam prakteknya, O (n) mengasumsikan k jauh lebih rendah dari n. Sebagian besar percepatan didasarkan pada penggunaan array asosiatif untuk mengidentifikasi item yang akan dihapus.
Performa (ukuran n-array, nilai-k yang akan dihapus). Performa mengukur detik waktu pengguna
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%
Seperti yang diharapkan, currentpenyelesaiannya linier terhadap N * K, dan fastsolusinya secara praktis linier ke K, dengan konstanta yang jauh lebih rendah. The fastsolusi adalah sedikit lebih lambat vs currentsolusi ketika k = 1, karena pengaturan tambahan.
Solusi 'Cepat': array = daftar input, hapus = daftar nilai yang akan dihapus.
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[@]}")
Dibandingkan dengan currentsolusi, dari jawaban yang paling banyak dipilih.
for target in "${delete[@]}"; do
for i in "${!array[@]}"; do
if [[ ${array[i]} = $target ]]; then
unset 'array[i]'
fi
done
done
array=("${array[@]}")
zsh.