该答案特定于从大型数组删除多个值的情况,在这种情况下性能很重要。
投票最多的解决方案是(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时的解决方案相比,该解决方案的速度稍慢一些,这是由于进行了其他设置。
“快速”解决方案:数组=输入列表,删除=要删除的值列表。
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
。