이 대답은 성능이 중요한 대형 배열에서 여러 값을 삭제하는 경우에만 해당됩니다.
가장 많이 투표 한 솔루션은 (1) 배열의 패턴 대체 또는 (2) 배열 요소에 대한 반복입니다. 첫 번째는 빠르지 만 고유 한 접두사가있는 요소 만 처리 할 수 있고, 두 번째는 O (n * k), n = 배열 크기, k = 제거 할 요소가 있습니다. 연관 배열은 상대적으로 새로운 기능이며 질문이 처음 게시되었을 때 일반적이지 않았을 수 있습니다.
정확한 일치 케이스의 경우 큰 n과 k를 사용하면 O (n k)에서 O (n + k log (k))로 성능을 향상시킬 수 있습니다 . 실제로 O (n)는 k가 n보다 훨씬 낮다고 가정합니다. 대부분의 속도 향상은 제거 할 항목을 식별하기 위해 연관 배열을 사용하는 것입니다.
성능 (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
용액은 약간 느린 VS이다 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
.