คำตอบนี้ใช้เฉพาะในกรณีของการลบหลายค่าจากอาร์เรย์ขนาดใหญ่ซึ่งประสิทธิภาพเป็นสิ่งสำคัญ
โซลูชันที่ได้รับการโหวตมากที่สุดคือ (1) การทดแทนรูปแบบบนอาร์เรย์หรือ (2) การทำซ้ำบนองค์ประกอบอาร์เรย์ อย่างแรกรวดเร็ว แต่สามารถจัดการได้เฉพาะองค์ประกอบที่มีคำนำหน้าแตกต่างกันอย่างที่สองมี O (n * k), n = ขนาดอาร์เรย์, k = องค์ประกอบที่จะลบ แอสโซซิเอทีฟอาร์เรย์เป็นคุณสมบัติใหม่ที่สัมพันธ์กันและอาจไม่เหมือนกันเมื่อโพสต์คำถาม
สำหรับกรณีการจับคู่แบบตรงทั้งหมดที่มีขนาดใหญ่ n และ k เป็นไปได้ที่จะปรับปรุงประสิทธิภาพจาก O (n k) ถึง O (n + k log (k)) ในทางปฏิบัติ O (n) สมมติว่า k ต่ำกว่า n มาก ความเร็วส่วนใหญ่ขึ้นอยู่กับการใช้ Associative array เพื่อระบุรายการที่จะลบออก
ประสิทธิภาพ (ขนาด n-array, ค่า k ที่จะลบ) ประสิทธิภาพวัดวินาทีของเวลาของผู้ใช้
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%
ตามที่คาดไว้การcurrent
แก้ปัญหาเป็นเส้นตรงถึง N * K และfast
วิธีการแก้ปัญหานั้นเป็นเส้นตรงถึง K โดยมีค่าคงที่ต่ำกว่ามาก การfast
แก้ปัญหาช้ากว่าเล็กน้อยcurrent
เมื่อเทียบกับโซลูชันเมื่อ k = 1 เนื่องจากการตั้งค่าเพิ่มเติม
โซลูชัน 'รวดเร็ว': array = list of input, delete = list of values to remove.
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
โซลูชันจากคำตอบที่ได้รับการโหวตมากที่สุด
for target in "${delete[@]}"; do
for i in "${!array[@]}"; do
if [[ ${array[i]} = $target ]]; then
unset 'array[i]'
fi
done
done
array=("${array[@]}")
zsh
ตัวอย่างของคุณมีลักษณะเหมือน