यह उत्तर बड़े सरणियों से कई मानों को हटाने के मामले के लिए विशिष्ट है, जहां प्रदर्शन महत्वपूर्ण है।
सबसे अधिक मतदान समाधान एक सरणी पर (1) पैटर्न प्रतिस्थापन हैं, या (2) सरणी तत्वों पर पुनरावृत्ति करते हैं। पहला तेज़ है, लेकिन केवल उन तत्वों से निपट सकता है जिनमें अलग-अलग उपसर्ग हैं, दूसरे में O (n * k), n = सरणी आकार, k = तत्व निकालने हैं। साहचर्य सरणी सापेक्ष नई विशेषता है, और जब प्रश्न मूल रूप से पोस्ट किया गया था तो यह आम नहीं हो सकता था।
सटीक मिलान मामले के लिए, बड़े n और k के साथ, O (n k) से O (n + k log (k)) तक के प्रदर्शन में सुधार करना संभव है । व्यवहार में, O (n) k को n से बहुत कम मान रहा है। हटाए जाने वाले आइटमों की पहचान करने के लिए अधिकांश गति अप साहचर्य सरणी का उपयोग करने पर आधारित है।
प्रदर्शन (n-array size, k-values to delete)। उपयोगकर्ता समय का प्रदर्शन माप सेकंड
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, अतिरिक्त सेटअप की वजह से।
'तेज़' समाधान: सरणी = इनपुट सूची, हटाने के लिए = मूल्यों की सूची हटाएं।
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
।