상각 분석? (가장 뛰어난 성능 보장)


13

상각 분석이란 무엇입니까? 내 프로그램에서 최악의 성능 보장 을 달성하는 데 어떻게 도움이 됩니까?

내가 한 읽고 다음과 같은 기술이 프로그래머가 달성 할 수있는 최악의 경우 성능 보장 (즉, 내 자신의 말로 : 보증 그 프로그램의 실행 시간이 최악의 캐스트의 실행 시간을 초과하지 것이다) :

  • 무작위 알고리즘 (예 : 퀵 정렬 알고리즘은 최악의 경우 이차적이지만 입력을 무작위로 정렬하면 실행 시간이 선형적임을 확률 적으로 보장 할 수 있습니다)
  • 작업 순서 (우리의 분석은 클라이언트가 수행 한 데이터와 작업 순서를 모두 고려해야합니다)
  • 할부 상환 분석 (성능 보장을 제공하는 또 다른 방법은 모든 작업의 ​​총 비용을 작업 수로 나눈 값을 추적하여 비용을 상각하는 것입니다.이 설정에서 평균 비용을 유지하면서 일부 비싼 작업을 허용 할 수 있습니다. 다시 말해, 우리는 비용이 많이 드는 작업의 일부를 많은 저렴한 작업 각각에 할당하여 비용이 적게 드는 작업의 비용을 분산시킵니다)

저자는 할부 상환 분석을 달성하는 방법의 한 예로서 스택에 대한 배열 데이터 구조크기 조정 사용을 언급 했지만 여전히 할부 상환 분석이 무엇인지, 최악의 달성을 위해 실제로 어떻게 상각 분석을 구현할 수 있는지 (데이터 구조? 알고리즘?) 이해하지 못합니다. 캐스트 성능 보장

답변:


14

상각 분석을 구현하지 않습니다. 보다 정확한 O범위 를 얻는 기술 입니다.

꼭해야 할 중요한 사실은 값 비싼 작업은 언제라도 일어날 수 없다는 것입니다.

어레이 지원 데이터 구조의 경우, 어레이는 용량이 가득 찼을 때마다 크기를 조정해야합니다. 이것은 가장 비싼 작업이며 시간이 걸립니다 O(n). 어레이에 대한 다른 모든 인서트는 O(1)입니다.

n항목 을 삽입하기위한 런타임을 결정하기 위해 n가장 비싼 작업을 곱 O(n)하면 전체 런타임 동작이 발생 O(n^2)합니다.

그러나 크기 조정이 매우 자주 발생할 수 없기 때문에 이것은 정확하지 않습니다.

돈에 대해 이야기 할 때 시간이 지남에 따라 여러 번의 소액 지불로 부채를 갚을 때 비용 을 상각 합니다.

이 모델을 사용하여 알고리즘에 대해서도 생각할 수 있습니다. 우리는 정신 매핑을 피하기 위해 단순히 "시간"을 "돈"으로 대체합니다.

배열이 length만큼 채워지면 n크기를 두 배로 늘릴 수 있습니다. 다음 작업을 수행해야합니다.

  • 2n메모리 청크 할당
  • n아이템 복사

메모리 할당과 복사가 모두 선형 시간으로 발생한다고 가정하면 매우 비싼 작업이 될 것입니다. 그러나 이제 부채에 대한 아이디어를 사용하여 분석에 상각 할 수 있습니다. 우리는 실제로 빚을지기 전에 부채를 상각 할 것입니다.
배열의 크기를 조정하면 (돈 / 시간의) 잔고가 0으로 돌아갑니다 (즉, 부채가 없거나 남은 금액이 없다고 가정).

이것은 다음과 같은 의미를 갖습니다.

  • 다음 n항목을 삽입하면 크기 조정 및 복사 비용이 발생합니다 ( n슬롯 및 n사용되지 않은 슬롯을 사용했습니다).

이제 모든 인서트 작업에 얼마를 지불해야하는지 생각할 수 있습니다.

  • 인서트
  • 하나의 메모리 덩어리를 할당하는 비용
  • 새로 할당 된 메모리로 옮기는 비용

이제 메모리 할당, 다음 n요소 복사 및 삽입 비용을 충당했습니다 . 그러나 우리는 이전 n요소에 대한 공간 할당 과 복사 를 무시 했습니다.

우리는 단순히 기존 n요소 의 비용을 새로운 (삽입 될) n요소에 분배합니다 .

  • 하나의 메모리 덩어리를 할당하는 비용
  • 새로 할당 된 메모리로 옮기는 비용

전체적으로 모든 인서트 작업에는 5 단위가 필요합니다. 이것은 자체 삽입과 자체 및 이전 요소 중 하나의 공간 이동 및 할당 비용을 지불합니다.

모든 인서트 작업에는 여전히 일정한 시간이 걸리지 만 크기 조정은 무료로 이루어집니다. 각 삽입에 "더 많은"시간을 소비하여이를 상각했습니다.

결과적으로 n요소를 삽입하는 데 O(n)시간 이 걸립니다 .

상각 분석을위한 다른 기술은 여기설명되어 있습니다 .


1

우선 : 알고리즘의 구현 기술이 아니라 프로그램 런타임을 분석하는 기술입니다.

목록에 언급 된 예는 좋은 예입니다. 단일 항목을 배열 지원 데이터 구조에 추가합니다. 모든 단일 추가 작업마다 최악의 경우 기존 항목을 모두 복사해야합니다. 제네릭 크기 조정 전략을 사용하는 경우 (크기에 약간의 x> 1.0을 곱한 경우) 그렇게하지 않아도되므로 이러한 종류의 분석은 너무 비관적입니다. 그런 다음 분석은 O (n ^ 2) 바운드-항목 당 O (n) 곱하기 n 항목을 가지고 있지만 실제 런타임은 O (n)에 불과합니다.

삽입 된 모든 항목에 대해 크기 조정 비용을 평균하면 (대부분 크기 조정이 필요하지 않음) 상각 분석을 수행합니다. 상각 된 분석 결과는 알고리즘의 실제 동작과 일치하는 O (n) 경계가됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.