Câu trả lời này dành riêng cho trường hợp xóa nhiều giá trị khỏi mảng lớn, nơi hiệu suất là quan trọng.
Các giải pháp được bình chọn nhiều nhất là (1) thay thế mẫu trên một mảng hoặc (2) lặp qua các phần tử của mảng. Đầu tiên là nhanh, nhưng chỉ có thể xử lý các phần tử có tiền tố riêng biệt, thứ hai có O (n * k), n = kích thước mảng, k = phần tử cần loại bỏ. Mảng liên kết là tính năng tương đối mới và có thể không phổ biến khi câu hỏi được đăng ban đầu.
Đối với trường hợp đối sánh chính xác, với n và k lớn, có thể cải thiện hiệu suất từ O (n k) thành O (n + k log (k)). Trong thực tế, O (n) giả sử k thấp hơn n nhiều. Hầu hết việc tăng tốc dựa trên việc sử dụng mảng kết hợp để xác định các mục cần xóa.
Hiệu suất (kích thước mảng n, k-giá trị để xóa). Hiệu suất đo giây thời gian của người dùng
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%
Như dự đoán, nghiệm current
là tuyến tính với N * K, và fast
nghiệm thực tế là tuyến tính đối với K, với hằng số thấp hơn nhiều. Các fast
giải pháp là hơi chậm so với cáccurrent
giải pháp khi k = 1, do cài đặt bổ sung.
Giải pháp 'Nhanh': mảng = danh sách đầu vào, xóa = danh sách giá trị cần loại bỏ.
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[@]}")
Được đánh giá so với current
giải pháp, từ câu trả lời được bình chọn nhiều nhất.
for target in "${delete[@]}"; do
for i in "${!array[@]}"; do
if [[ ${array[i]} = $target ]]; then
unset 'array[i]'
fi
done
done
array=("${array[@]}")
zsh
.