この回答は、パフォーマンスが重要な大きな配列から複数の値を削除する場合に固有です。
最も投票数の多いソリューションは、(1)配列のパターン置換、または(2)配列要素の反復です。1つ目は高速ですが、異なる接頭辞を持つ要素のみを処理できます。2つ目はO(n * k)、n =配列サイズ、k =削除する要素です。連想配列は比較的新しい機能であり、質問が最初に投稿されたときには一般的ではなかった可能性があります。
完全一致の場合、nとkが大きいため、パフォーマンスをO(n k)からO(n + k log(k))に改善できます。実際には、O(n)はkがnよりはるかに低いと仮定しています。高速化のほとんどは、連想配列を使用して削除するアイテムを識別することに基づいています。
パフォーマンス(n配列サイズ、削除する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 =入力のリスト、delete =削除する値のリスト。
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
ます。