এই উত্তরটি বৃহত অ্যারে থেকে একাধিক মান মুছে ফেলার ক্ষেত্রে সুনির্দিষ্ট, যেখানে কার্য সম্পাদন গুরুত্বপূর্ণ।
সর্বাধিক ভোট দেওয়া সমাধানগুলি হ'ল (1) অ্যারের উপর প্যাটার্ন প্রতিস্থাপন, বা (2) অ্যারে উপাদানগুলির উপর পুনরাবৃত্তি। প্রথমটি দ্রুত, তবে কেবলমাত্র সেই উপাদানগুলির সাথে ডিল করতে পারে যার পৃথক উপসর্গ রয়েছে, দ্বিতীয়টির ও (এন * কে), এন = অ্যারের আকার, কে = উপাদানগুলি অপসারণ করতে হবে। সহযোগী অ্যারে আপেক্ষিক নতুন বৈশিষ্ট্য, এবং প্রশ্নটি মূলত পোস্ট করার সময় সম্ভবত এটি সাধারণ ছিল না।
সঠিক মিলের ক্ষেত্রে, বড় এন এবং কে দিয়ে, ও (এন কে) থেকে ও (এন + কে) পর্যন্ত পারফরম্যান্স উন্নতি করা সম্ভব লগ (কে)) । অনুশীলনে, ও (এন) কে এন এর চেয়ে অনেক কম মনে করছে। বেশিরভাগ গতি আপত্তিজনক আইটেমগুলি সরিয়ে ফেলতে চিহ্নিত করতে ব্যবহারের উপর ভিত্তি করে।
পারফরম্যান্স (মোছার জন্য এন-অ্যারে আকার, কে-মান)। ব্যবহারকারীর সময় পারফরম্যান্স পরিমাপ
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
সমাধানটি এন * কে এর লিনিয়ার, এবং fast
সমাধানটি প্রায় নিম্নতর ধ্রুবক সহ, কে কে লিনিয়ার। fast
সমাধান বনাম কিছুটা মন্থর হয়current
সমাধান যখন ট = 1, অতিরিক্ত সেটআপ কারণে।
'দ্রুত' সমাধান: অ্যারে = ইনপুটের তালিকা, মুছুন = মুছে ফেলতে মানগুলির তালিকা।
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
।