알고리즘의 상각 분석이란 무엇입니까? [닫은]


85

점근 분석과 어떻게 다릅니 까? 언제 사용하고 왜 사용합니까?

다음과 같이 잘 쓰여진 것으로 보이는 기사를 읽었습니다.

그러나 나는 여전히 이러한 개념을 완전히 이해하지 못했습니다.

그래서 누구든지 나를 위해 단순화 할 수 있습니까?



2
@lanzz 아마 것 지금 속하는 cs.stackexchange.com
nbro

일정 상각 시간 의 의미에 대한 훌륭한 스레드 .
RBT

답변:


87

상각 분석은 한 번의 호출에 대해 최악의 경우 호출 수를 순진하게 곱하지 않습니다.

예를 들어, 필요할 때 크기가 두 배가되는 동적 배열의 경우 일반 점근 분석은 항목을 추가하는 데 O (n) 비용이 든다는 결론을 내릴 수 있습니다. 모든 요소를 ​​새 배열에 확장하고 복사해야 할 수 있기 때문입니다. 상각 후 분석은 성장을 위해 이전 성장 이후 성장을 유발하지 않고 n / 2 개의 항목을 추가해야한다는 점을 고려하므로 항목을 추가하는 데 실제로는 O (1) 만 필요합니다 (O (n)의 비용은 n / 2 개 조치에 대해 상각 됨 ).

상각 분석은 "평균 성과"와 동일하지 않습니다. 상각 분석은 많은 작업을 수행 할 경우 성과가 무엇을 할 것인지에 대한 확실한 보증 을 제공합니다 .


1
"상각 된 분석은 성장하려면 이전 성장 이후 성장을 유발하지 않고 n / 2 개의 항목을 추가해야한다는 점을 고려하므로 항목을 추가하는 데 실제로는 O (1) 만 필요합니다 (O (n)의 비용). n / 2 개의 조치에 대해 상각 됨). " 이것은 매우 혼란스럽고 불분명했습니다.
AleksandrH

@AleksandrH 그것의 특정 부분?
harold

네, 숫자가 어디에서 오는지에 대한 설명없이 수학을 따라 단지 어렵다
AleksandrH

44

"무엇"에 대한 답은 많지만 "왜"에 대한 답은 없습니다.

다른 모든 사람들이 말했듯이 점근 분석은 주어진 작업의 성능이 어떻게 대규모 데이터 세트로 확장되는지에 관한 것입니다. 상각 분석은 대규모 데이터 세트에 대한 모든 작업의 ​​평균 성능이 어떻게 확장되는지에 대한 것입니다. 상각 분석은 점근 적보다 더 나쁜 경계를 제공하지 않으며 때로는 훨씬 더 나은 경계를 제공합니다.

더 긴 작업의 총 실행 시간에 관심이 있다면 더 나은 상각 분석 범위가 아마도 당신이 관심을 갖는 것입니다. 그렇기 때문에 스크립팅 언어 (예 :)는 비용이 많이 드는 작업 임에도 불구하고 배열과 해시 테이블을 몇 가지 요인으로 늘릴 수 있습니다. (성장은 O(n)수술 이 될 수 있지만 상각은 O(1)드물게하기 때문입니다.)

실시간 프로그래밍을 수행하는 경우 (개별 작업은 예측 가능한 시간 내에 완료되어야 함) 상각 된 분석의 더 나은 범위는 중요하지 않습니다. 평균적으로 작업이 빠른지, 너무 멀리 자르기 전에 띠톱을 조정하기 위해 제 시간에 완료하지 못한 경우에는 중요하지 않습니다.

귀하의 경우에 중요한 것은 프로그래밍 문제가 정확히 무엇인지에 달려 있습니다.


1
"성장하는 것은 O (n) 연산이 될 수 있지만, 상각은 O (1)입니다. 거의하지 않기 때문입니다."이 진술은 정말 엄격한 수학적 증명이 필요하다고 생각합니다.
nbro

"실시간 프로그래밍을하고 있다면 ..."더 정확하고 왜 그 단락이 "참"으로 간주되어야하는지 정확히 설명해야합니다.
nbro

1
@nbro 왜 "해야한다"고 생각합니까? 이 질문은 상각 된 분석이 점근 적 분석과 어떻게 다른지 그리고 언제 각각을 사용할 것인지 묻습니다. 이를 수행하는 방법을 설명하는 기사로 연결됩니다. 따라서 수학적 분석은 불필요 해 보입니다. 실시간 프로그래밍에 관해서는, 나는 않았다 그것을 설명. 실시간 프로그래밍은 개별 작업이 예측 가능한 시간에 완료되어야하는 프로그래밍입니다. 일반적인 예는 일정한 간격으로 무언가를 모니터링해야하는 임베디드 프로그래밍입니다. 제어 기계와 같은. 이 경우 가끔 느린 작업은 허용되지 않습니다.
btilly

26

점근 분석

이 용어는 알고리즘이 작동하는 데이터 ( 입력 )가 일반인의 용어로 "크게 만들면 결론을 변경하지 않을만큼 충분히 크다" 는 가정하에 알고리즘 성능 분석을 나타냅니다 . 입력의 정확한 크기를 지정할 필요가 없지만, 데이터 자체가 설정 (우리는 단지이 상한 필요) 지정되어야합니다.

지금까지 분석 방법 에 대해서만 이야기했습니다 . 우리 가 분석하고 있는 (시간 복잡성? 공간 복잡성?)을 정확히 지정 하지 않았고, 우리가 관심 있는 메트릭 (최악의 경우? 최상의 경우? 평균?) 도 지정하지 않았습니다 .

실제로 점근 분석이라는 용어는 일반적으로 알고리즘의 상한 시간 복잡도 , 즉 big-Oh 표기법으로 표시되는 총 실행 시간으로 측정 된 최악의 경우 성능을 나타냅니다 (예 : 정렬 알고리즘은 O(nlogn)).

상각 분석

이 용어는 최악의 시나리오 를 대상으로하는 특정 작업 시퀀스를 기반으로하는 알고리즘 성능 분석을 나타냅니다. 즉, 상각 된 분석은 메트릭이 최악의 성능임을 의미합니다 (아직 측정중인 수량을 말하지는 않지만 ). 이 분석을 수행하려면 입력 크기 를 지정해야 하지만 형식에 대한 가정을 할 필요는 없습니다.

평신도의 관점에서, 상각 분석은 입력에 대해 임의의 크기를 선택한 다음 알고리즘을 "실행"하는 것입니다. 입력에 따라 결정을 내려야 할 때마다 최악의 경로가 선택됩니다 ¹. 알고리즘이 완료 될 때까지 실행 한 후 계산 된 복잡성을 입력 크기로 나누어 최종 결과를 생성합니다.

¹ 참고 : 정확히 말하면 이론적으로 가능한 최악의 경로 입니다 . 용량이 소진 될 때마다 크기가 동적으로 두 배가되는 벡터가있는 경우, "최악의 경우"는 삽입이 시퀀스로 처리되기 때문에 삽입 할 때마다 두 배가 필요하다고 가정하는 것은 아닙니다 . 우리는 입력이 알려지지 않은 상태에서도 가능한 한 많은 "더 나쁜"경우를 수학적으로 제거하기 위해 알려진 상태 를 사용할 수 있습니다.

가장 중요한 차이점

점근 분석과 상각 분석의 중요한 차이점은 전자는 입력 자체에 의존하고 후자는 알고리즘이 실행할 작업 순서에 의존한다는 것입니다.

따라서:

  • 점근 분석을 통해 N접근하는 크기의 최고 / 최악 / 평균 사례 입력이 주어 졌을 때 알고리즘의 복잡성이 일부 함수 F (N)에 의해 제한 된다는 것을 주장 할 수 있습니다. 여기서 N은 변수입니다.
  • 상각 분석을 통해 알려지지 않은 특성의 입력이 주어졌지만 알려진 크기 N이 함수 F (N)의 값보다 나쁘지 않을 때 알고리즘의 복잡성을 주장 할 수 있습니다. 여기서 N은 알려진 값입니다.

7
위의 답변은 사람들이 높은 순위의 사람들로부터 긴 답변을 맹목적으로 찬성해서는 안되는 이유를 보여줍니다.
btilly

2
@btilly : 실행 가능한 경우 피드백이 훨씬 더 유용 할 것입니다. 즉,이 답변에 정확히 무엇이 잘못되었고 어떻게 개선해야하는지에 대한 아이디어를 제공 할 수 있습니까?

7
어디서부터 시작할까요? 두 용어를 모두 잘못 정의했으며 잘못된 부분을 명확히 설명했습니다. 임의의 예에서 상각 분석이 항상 최악의 경우는 아닙니다. 그렇지 않으면 동적으로 크기가 조정 된 해시에 삽입 할 때 상각 된 성능이 O(1).
btilly 2014 년

@btilly CLRS 451 페이지에 "... 상각 분석은 최악의 경우 각 작업의 평균 성능을 보장합니다."라고 말합니다.
Glen Selle

1
@GlenSelle Amortized 분석은 수학적 기법입니다. 최악의 성능을 포함하여 다양한 목적으로 사용할 수 있습니다. 그러나 최악의 경우는 아닙니다. 귀하의 경우에는 분명히 최악의 경우에 사용되었습니다. 해싱의 경우에는 그렇지 않았습니다.
btilly

14

이에 대한 답은 책-알고리즘 소개 : Amortized Analysis 장의 첫 번째 문장에서 간결하게 정의됩니다.

에서 상각 분석 , 시간 데이터 구조 연산의 시퀀스 동작이 수행되는 모든 평균화 수행해야.

우리는 프로그램의 성장을 기능에 의해 제한하고 최악, 최고 또는 평균 사례를 정의하는 점근 분석을 통해 프로그램 성장의 복잡성을 나타냅니다.

그러나 이것은 프로그램의 복잡성이 최고점에 도달하는 경우가 하나 뿐이지 만 일반적으로 프로그램이 많은 계산을 필요로하지 않는 경우에는 오해의 소지가 있습니다.

따라서 단일 작업이 비싸더라도 일련의 작업에 대한 비용을 평균화하는 것이 더 합리적입니다. 이것은 상각 분석입니다!

상각 분석은 복잡성을 계산하는 데 사용되는 점근 적 기법의 대안입니다. 두 개 이상의 알고리즘을 비교하고 결정하기 위해 실용성 측면에서보다 진정한 복잡성을 계산하는 데 도움이됩니다.


5

알고리즘의 상각 분석을 이해하기 위해 지금까지 찾은 최고의 참고 자료는 Introduction to Algorithms , 3 판, 17 장 : "Amortized Analysis"에 있습니다. 그것은 모두 거기에 있으며 Stack Overflow 게시물에서 찾을 수있는 것보다 훨씬 더 잘 설명되어 있습니다. 괜찮은 대학의 도서관에서 책을 찾을 수 있습니다.


예. 언급 된 책에서 Amortized 알고리즘에 대해 읽는 것이 더 좋았고 마침내 명확 해졌습니다.
Rajesh Mappu

2

정기적 인 점근 분석은 개별 작업의 성능을 문제 크기의 함수로 점근 적으로 살펴 봅니다. O () 표기법은 점근 분석을 나타냅니다.

상각 분석 (점근 분석이기도 함)은 공유 데이터 구조 에서 여러 작업 의 성능을 확인합니다. .

차이점은 상각 분석은 일반적으로 M 작업에 필요한 총 계산이 개별 작업에 대한 최악의 경우 M 배보다 더 나은 성능 보장을 제공한다는 것을 증명한다는 것입니다.

예를 들어, 크기 N 의 스플레이 트리 에서 개별 작업 은 최대 O (N) 시간이 걸릴 수 있습니다. 그러나 크기가 N 인 트리에서 일련의 M 작업은 O (M (1 + log N) + N log N) 시간으로 제한되며, 이는 작업 당 대략 O (log N)입니다. 그러나 상각 된 분석은 "평균 사례"분석보다 훨씬 더 엄격 합니다. 가능한 모든 작업 시퀀스가 ​​점근 적 최악의 경우를 충족 한다는 것을 증명합니다 .


1

상각 된 분석은 루틴의 여러 실행에 대한 총 비용과 그에서 얻을 수있는 이점을 다룹니다. 예를 들어, 단일 일치 항목에 대해 정렬되지 않은 n 개의 항목 배열을 검색하면 최대 n 개의 비교가 필요할 수 있으므로 복잡성이 o (n)입니다. 그러나 동일한 배열이 m 개의 항목을 검색 할 것이라는 것을 알고 있다면 전체 작업을 반복하면 복잡성이 O (m * n)됩니다. 그러나 배열을 미리 정렬하면 비용은 O (n log (n))이고 연속 검색은 정렬 된 배열에 대해 O (log (n)) 만 사용합니다. 따라서이 방법을 사용하는 m 개 요소의 총 상각 비용은 O (n * log (n) + m * log (n))입니다. m> = n이면 정렬하지 않은 경우 O (n ^ 2)와 비교하여 사전 정렬을 통해 O (n log (n))와 같습니다. 따라서 상각 된 비용이 더 저렴합니다.

간단히 말해, 초기에 약간의 추가 비용을 지출하면 나중에 훨씬 절약 할 수 있습니다.

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