حساب کاربری
​
زمان تقریبی مطالعه: 6 دقیقه
لینک کوتاه

آنالیز استهلاکی

تحلیل سر‌شکن:
در این نوع آنالیز، n عمل انجام می‌شود و هزینه زمانی آن روی n عمل سرشکن می‌شود. در واقع ممکن است عملیات انجام شده هزینه‌های مختلفی داشته باشند و برخی هزینه زیادی داشته باشند ولی هزینه متوسط هر عمل کوچک باشد. لازم به ذکر است که آنالیز استهلاکی با آنالیز در حالت میانگین متفاوت است و روش‌های آماری را شامل نمی‌شود. در واقع آنالیز استهلاکی زمان اجرای متوسط هر عمل در بدترین حالت را نشان می دهد. برای این نوع آنالیز 3 روش مطرح است:

  1. آنالیز تجمعی (Aggregate Analysis)
  2. روش حسابرسی (Accounting Method)
  3. روش پتانسیل (Potential Method)

آنالیز تجمعی
در این روش هزینه n عمل را به دست می آوریم سپس به n تقسیم می کنیم . مثلاً n عمل M u l t i p o p ( k ) , p o p , p u s h {\displaystyle Multipop(k),pop,push}

روی پشته s که در ابتدا خالی است انجام داده ایم M u l t i p o p ( k ) {\displaystyle Multipop(k)}
(عنصر از پشته pop می کند، البته اگر کمتر از k عنصر در پشته باشند، همه عناصر pop می شوند) درست است که هزینه M u l t i p o p ( k ) {\displaystyle Multipop(k)}
ممکن است O ( k ) {\displaystyle O(k)}
باشد ولی n عمل از عملیات فوق روی هم هزینه O ( n ) {\displaystyle O(n)}
باشد ولی N عمل از عملیات فوق روی هم هزینه O ( n ) {\displaystyle O(n)}
دارند پس هزینه هر عمل به صورت سرشکن شده برابر O ( 1 ) {\displaystyle O(1)}
است.

روش حسابرسی
در این روش به عملیات مختلف، شارژهای مختلفی نسبت می دهیم که ممکن است شارژی که نسبت می دهیم، از هزینه واقعی عمل کمتر یا بیشتر باشد . مقداری که یک عمل شارژ می‌شود را «هزینه استهلاک » آن عمل گویند. اگر « هزینه استهلاک » یک عمل از «هزینه واقعی » آن عمل بیشتر باشد، تفاوت این دو به عنوان «اعتبار» به عناصر خاصی از ساختمان داده تخصیص می یابد. این اعتبار را می توان بعداً برای عملیاتی که هزینه استهلاکشان کمتر از هزینه واقعی شان است، صرف کرد.
به عنوان مثال عملیات پشته را در نظر بگیرید . می دانیم هزینه واقعی عملیات عبارت است از :
P u s h = 1 , p o p = 1 , M u l t i p o p ( k ) = m i n ( k , s ) {\displaystyle Push=1,pop=1,Multipop(k)=min(k,s)}


که s تعداد عناصر موجود در پشته هنگام فراخوانی Multipop است.
ولی ما هزینه استهلاکی زیر را به عملیات نسبت می دهیم :
P u s h 2 , p o p 0 , M u l t i p o p 0 {\displaystyle Push2,pop0,Multipop0}

با این مقادیر، می توان هر دنباله از عملیات را پشتیبانی کرد. هر push که انجام می شود، هزینه واقعی اش 1 است، پس از شارژ 2 مقداری آن ، 1 مقدار برای هزینه اش صرف می‌شود و 1 مقدار در عنصر push شده به عنوان اعتبار ذخیره می شود، پس تمام عناصری که در پشته هستند، اعتبار 1 مقداری دارند. حال اگر pop انجام شود، چون هزینه واقعی pop ، 1 است، این 1 را از اعتبار عنصری که pop می شود، دریافت می کند . پس از آنجایی که هزینه استهلاکی push ، pop و Multipop ثابت ( O ( 1 ) ) {\displaystyle (O(1))}
است پس هزینه Nعمل ، O ( n ) {\displaystyle O(n)}
است.

روش پتانسیل
روش قبلی، اعتبار را به عنصر تخصیص می داد ولی این روش، اعتبار را به صورت پتانسیل به کل ساختمان داده تخصیص می دهد. فرض کنید D 0 {\displaystyle D_{0}}

وضعیت اولیه ساختمان داده ای است که می خواهیم n {\displaystyle n}
عمل روی آن انجام دهیم. C i {\displaystyle C_{i}}
هزینه واقعی عمل i ام ، D i {\displaystyle D_{i}}
وضعیت ساختمان داده است پس از انجام عمل i ام روی D ( i − 1 ) {\displaystyle D_{(}i-1)}
تابع پتانسیلی تعریف می کنیم به اسم ∝ {\displaystyle \propto }
که به هر وضعیت ساختمان داده، یک عدد حقیقی نسبت می دهد:
یک عدد حقیقی= ∝ ( D i ) {\displaystyle \propto (D_{i})}

بنابراین هزینه استهلاکی C i ˇ {\displaystyle {\check {C_{i}}}}
عمل i ام برابر است با : C i ˇ = C i + ∝ ( D i ) − ∝ ( D i − 1 ) {\displaystyle {\check {C_{i}}}=C_{i}+\propto (D_{i})-\propto (D_{i-1})}

پس کل هزینه استهلاکی برابر است با : ∑ i = 1 n C i + ∝ ( D i ) − ∝ ( D i − 1 ) {\displaystyle \sum _{i=1}^{n}C_{i}+\propto (D_{i})-\propto (D_{i-1})}

مثلاً فرض کنید در عملیات پشته M u l t i p o p ( k ) , p o p , p u s h {\displaystyle Multipop(k),pop,push}
، تابع پتانسیل ∝ {\displaystyle \propto }
را برابر عناصر موجود در پشته فرض کنیم . در حالت پشته خالی D 0 {\displaystyle D_{0}}
، که حالت شروع است ∝ ( D 0 ) = 0 {\displaystyle \propto (D_{0})=0}
. از آنجایی که تعداد عناصر موجود در پشته عددی نامنفی است پس همیشه ∝ ( D i ) >= 0 =∝ ( D 0 ) {\displaystyle \propto (D_{i})>=0=\propto (D_{0})}
. پس هزینه کل مستهلک شده برای n {\displaystyle n}
عمل با توجه به تابع ∝ {\displaystyle \propto }
، یک کران بالا برای هزینه واقعی است. حال هزینه مستهلک شده را برای M u l t i p o p ( k ) , p o p , p u s h {\displaystyle Multipop(k),pop,push}
به دست می آوریم .
اگر عمل i {\displaystyle i}
ام روی پشته p u s h {\displaystyle push}
باشد و در حال حاضر تعداد s {\displaystyle s}
عنصر در پشته باشد آنگاه:
∝ ( D i ) − ∝ ( D i − 1 ) = ( s + 1 ) − s {\displaystyle \propto (D_{i})-\propto (D_{i-1})=(s+1)-s}

بنابراین هزینه مستهلک شده p u s h {\displaystyle push}
برابر است با :
c i ˇ + ∝ ( D i ) − ∝ ( D i − 1 ) = 1 + 1 = 2 {\displaystyle {\check {c_{i}}}+\propto (D_{i})-\propto (D_{i-1})=1+1=2}

به همین ترتیب نشان دهید که هزینه مستهلک شده M u l t i p o p , p o p {\displaystyle Multipop,pop}
برابر صفر است. پس هزینه مستهلک شده هر عمل O ( 1 ) {\displaystyle O(1)}
است. بنابراین از آنجایی که هزینه مستهلک شده کران بالای هزینه واقعی است پس هزینه واقعی n {\displaystyle n}
عمل برابر O ( n ) {\displaystyle O(n)}
است.

منابع

کتاب طراحی الگوریتم- هادی یوسفی

پیوند به بیرون

  • آنالیز استهلاکی, تدریس چارلز.ای لیزرسان- ام آی تی
  • آنالیز استهلاکی, کتاب مقدمه ای بر الگوریتمها
آخرین نظرات
کلیه حقوق این تارنما متعلق به فرا دانشنامه ویکی بین است.