2014-03-03 4 views
6

std :: set에서 여러 요소를 지우는 복잡성을 파악하려고합니다. 나는 소스로 this page을 사용하고 있습니다.std :: set simplise complexity anomality?

반복기를 사용하여 단일 항목을 지우는 복잡성은 O (1)으로 상각되지만 범위 형식을 사용하여 여러 항목을 지우는 것이 log (c.size()) + std :: distance (first, last) (즉, 세트의 크기의 로그 + 삭제 된 요소의 수).

지우는 요소의 수 (n)가 집합의 요소 수 (m)보다 훨씬 적은 경우 지우는 요소를 반복하고 그 중 하나를 지우는 것이 n < < m으로 가정하면 하나의 호출 (O (log m))으로 지우는 것보다 시간이 더 빠릅니다 (O (n)).

분명히, 실제로 두 번째 형식의 내부 구현은 위의 루프를 수행합니다.

사이트에서 오류가 발생 했습니까? 사양의 버그? 방금 뭔가 빠졌나요?

덕분에, Shachar

+3

로그입니다 (c.size()) + 표준 : 거리 (첫 번째, 마지막) (예 - 세트의 크기 + 삭제 된 요소의 수의 로그). _ - 고정 세트의 크기는 O (n)과 정확히 동일합니다. 여기서 n은 삭제 된 요소의 수이며, 하나씩 삭제하면됩니다. – Cthulhu

+0

흥미로운 점은 차이점을 확인하기 위해 두 가지 방법으로 테스트 할 수 있었다고 생각합니다. 어쩌면 각 개별 지우기 후에 반복기를 다시 설정하는 데 약간의 오버 헤드가 생길 수 있습니다 (반복자가 무효화되는 것 같음) –

+1

@Cthulhu, 복잡성에 더하기가 사용될 때마다 동일한 논리가 적용됩니다. 상수 (또는 심지어 한정)로 가정하는 모든 것은 자동으로 O (1)의 복잡성을 갖습니다. –

답변

1

문제가 "상각"는 (다소 족제비) 단어 뒤에 숨어있는 것 같다. 단일 항목 지우기에는 로그의 복잡성 (c.size())이 있지만 O (1)의 복잡도가 상각됩니다.

루프에서 여러 번의 단일 지우기를 수행하면 log (c.size()) + 지우기 횟수가 발생하므로 정확하게 범위 형식의 복잡성이 저하됩니다. 범위 양식을 사용하여 여러 항목을 _erasing Shachar

+4

"amortized"는 족제비 단어가 아닙니다. 컴퓨터 과학 용어로 잘 알려져 있습니다 : http://en.wikipedia.org/wiki/Amortized_analysis. –

+0

좋아요, "족제비"는 좀 가혹합니다. 나는 엄격한 상한 문을 떨어 뜨리면 혼란이 일어난다 고 생각한다. 당신이 연산의 상환 된 복잡성만을 제공한다면, 프로그래머는 무엇을 기대해야하는지 알지 못하는 경향이 있습니다. O 복잡성 만 사용하면 오해의 소지가 있음을 인정하지만 (이 경우처럼) 표준에서 두 가지를 모두 언급해야한다고 생각합니다. –