Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

رشد توابع توابع بازگشتي

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "رشد توابع توابع بازگشتي"— Μεταγράφημα παρουσίασης:

1 رشد توابع توابع بازگشتي
ساختمان داده ها و الگوريتم ها

2 رشد توابع ---- 2n2+3n+7 ---- 3n2 for n>=5 , 3n2 > 2n2 + 3n + 7

3 O notation تعريف: تابع f1 از مرتبه O(f2) است ، اگر براي اعداد بزرگ n ( بزرگتر از عددي مثل ، n0) ، ثابت c وجود داشته و در رابطه زير صدق كند: for all n >= n0 , f1(n) <= c f2(n) c f2 كران بالاي تابع f1 ناميده مي شود. f1(n) = 2n2 + 3n + 7 , f2(n) = n2 for all n>=6 , f1(n) < 3 f2(n) f1 ∈ O(f2) for all n>=1 , f2(n) < f1(n) f2 ∈ O(f1)

4 O(a0+ a1n + a2n2 +…+annn) f = a0+ a1n + a2n2 +…+axnx  f ∈ O(?)
f /nx = a0/nx + a1/nx-1 +a2/nx-2 + …+ ax if n∞ : f/nx  ax if n∞ : f  axnx پس: ثابت c و عدد بزرگ n0را مي توان يافت که در رابطه زير صدق کنند: for all n >= n0 , f = a0+ a1n + a2n2 +…+axnx < c nx f = a0+ a1n + a2n2 +…+axnx ∈ O(nx) مثال : تعيين ثابت, n0 c براي n2 - 3n< cn2 cn2 > n2 - 3n  c > 1- 3 /n  n0 = 3 , c = 1

5 Ω Notation تعريف:تابع f1 از مرتبه Ω(f2) است ، اگر براي اعداد بزرگ n ( بزرگتر ازعددي مثل ، n0) ، ثابت c وجود داشته و در رابطه زير صدق كند: for all n >= n0 , f1 >= c f2 c f2 كران پايين تابع f1 ناميده مي شود. مشابه نماد O مي توان نشان داد که مرتبه توابع چند جمله اي برابر با بزرگترين توان آنهاست: f = a0+ a1n + a2n2 +…+axnx ∈ Ω(nx) مثال : تعيين ثابت, n0 c براي n2 - 3n> cn2 cn2 < n2 - 3n  c < 1- 3 /n  n0 = 10 , c = 0.5

6 Θ Notation تعريف:تابع f1 از مرتبه Θ(f) است ، اگر براي اعداد بزرگ n ( بزرگتر ازعددي مثل ، n0) ، ثابت c1,c2 وجود داشته و در رابطه زير صدق كنند: for all n >= n0 ,c1f <= f1 <= c2 f به عبارتي ديگر، تابع از مرتبه Θ(f) است اگر متعلق به O(f) و Ω(f) باشد. با توجه به مطالب قبلي، مرتبه توابع چند جمله اي برابر با بزرگترين توان آنهاست: f = a0+ a1n + a2n2 +…+axnx ∈ Θ(nx) مثال : تعيين ثابت, n0 c1,c2 براي c1n2 <= n2 - 3n <= c2n2 n0 = 10 , c1 = 0.5 , c2 =1

7 کاربرد نمادهاي O، Ω، Θ در محاسبات
در آناليز الگوريتمها گاهي براي سادگي در عبارات محاسباتي اين نماد ها را نيز استفاده مي کنيم. اين نمادها تعاريف مجموعه هاي خاصي هستند و کاربرد آنها در عبارات رياضي ابهاماتي پيش مي آورد. مثالf(n) = 2n2 + Θ(n) هدف از اين نوع بيان اين است که f(n) حاصل جمع 2n2 و يک تابع ديگر از مرتبه Θ(n) است. اين تابع مي تواند هر تابعي مانند 3n يا 10n - 13باشد. در اينجا ما به تعريف دقيق تابع مورد نظر اهميتي نمي دهيم و تنها مرتبه آن را مورد توجه قرار مي دهيم

8 الگوريتم Mergesort MERGE-SORT(A, p, r) 1 if p < r
2 then q ← ⌊(p + r)/2⌋ MERGE-SORT(A, p, q) MERGE-SORT(A, q + 1, r) MERGE(A, p, q, r) هزينه 1 T(N/2) Θ(N) T(N) = 2 T(N/2) + Θ(N) T(1) = c

9 Little o Notation o(g(n)) = {f(n) :∀ c > 0, ∃n0 > 0 |0 ≤ f(n) < cg(n) ∀ n ≥ n0}. تفاوت با O بزرگ: در اين نمادگذاري، کران بالا تابع براي تمام مقادير ثابت c برقرار است. مثال: 2n ∈o(n2) f(n) ∈ o(g(n)) 

10 Little ω Notation ω (g(n)) = {f(n) :∀ c > 0, ∃n0 > 0 |f(n)> cg(n)>=0 ∀ n ≥ n0}. تفاوت با Ω بزرگ: در اين نمادگذاري، کران پايين تابع براي تمام مقادير ثابت c برقرار است. مثال: n2 ∈ ω (2n) f(n) ∈ ω (g(n)) 

11 روابط بين نمادهاي مختلف
f(n) = Θ(g(n)) and g(n) = Θ(h(n))  f(n) = Θ(h(n)), f(n) = O(g(n)) and g(n) = O(h(n))f(n) = O(h(n)), f(n) = Ω(g(n)) and g(n) = Ω(h(n))f(n) = Ω(h(n)), f(n) = o(g(n)) and g(n) = o(h(n))f(n) = o(h(n)), f(n) = ω(g(n)) and g(n) = ω(h(n))f(n) = ω(h(n)). f(n)=Θ(f(n)),f(n)=O(f(n)),f(n)=Ω(f(n)). f(n) = Θ(g(n))  g(n) = Θ(f(n)). f(n) = O(g(n))g(n) = Ω(f(n)), f(n) = o(g(n))g(n) = ω(f(n)).

12 تعبير عددي نمادهاي معرفي شده
f(n) = O(g(n))≈ a ≤ b, f(n) = Ω(g(n))≈ a ≥ b, f(n) = Θ(g(n))≈ a = b, f(n) = o(g(n))≈ a < b, f(n) = ω(g(n))≈ a > b.

13 رابطه بازگشتي f(n) = 3 f(n/2) + 1 f(n) = f(n-1) + f(n -2)
f(n) = n f(n -1) معمولا، لازم است تابع هزينه اي را كه به صورت بازگشتي بيان شده، با يكي از نمادهاي مرتبه تابع مثل O نشان دهيم

14 حل روابط بازگشتي حل روابط بازگشتي، يعني تعريف تابع بازگشتي در قالب يك رابطه غير بازگشتي مانند چندجمله اي. روش جاگذاري: با تكيه بر دانسته ها و شم رياضي خود حدسي مي زنيد و سپس آن را ثابت مي كنيد بسط درخت بازگشت و استفاده از استقرا رياضي: تابع بازگشتي را تا چند جمله بسط مي دهيد؛ قانون حاکم بر دنباله را پيدا مي کنيد و جمع دنباله را محاسبه مي کنيد روش Master:‌اگر تابع هزينه به شکل T(n) = aT(n/b) + f(n) باشد، تابع بازگشتي از راههاي زير حل مي شود(e>0): f(n) = O( n logba e) )  T(n) = Θ(n logb (a)) f(n) = Θ( n logba )  T(n) = Θ(n logba log n) f(n) = Ω( n logb (a-e) ), af (n/b) ≤ cf (n) , c < 1  T(n) = Θ(f(n)) مثال:T (n) = 9T(n/3) + n.  (case #1) : T(n) = Θ(n2)

15 روش جاگذاري لازم است حدس اوليه خوبي داشته باشيد
حل را بطه f(n) = f(n -1) + f( n -2) به نظر مي آيد، f(n) = O(n) . براي بررسي اين حدس بايد ثابت كنيم: مي توان c و n0 يافت كه : f(n) <= cn , for n >= n0 f(n)= a1 (n – 1) + b1 + a2 (n – 2) + b2 f(n) = an + b <= cn if c > a  f(n) = O(n) لازم است حدس اوليه خوبي داشته باشيد

16 هزينه Merge Sort

17 اجراي توابع بازگشتي برنامه شامل مجموعه اي از دستوارت عادي و فراخواني دستورات ديگر است x = input ; x = x +1 ; y= sin(x) ;  function call outpt(y) ; يك تابع بازگشتي، خودش را فراخواني مي كند int factorial(int n){ if (n<=1) return 1; return n * factorial(n-1) ; }

18 فراخواني تابع هنگام فراخواني تابع:
متغيرهاي محلي فعلي ذخيره مي شوند آدرس دستور بعد از تابع که محل ادامه اجراي برنامه پس از اجراي تابع است، ذخيره مي شود. کنترل به تابع موردنظر انتقال مي يابد تابع اجرا مي شود پس از پايان تابع، متغيرهاي محلي بازيابي شده و اجرا از آنجا ادامه پيدا مي کند. براي ذخيره متغيرها و آدرس بازگشت، از ساختمان داده ويژه اي به نام Call Stack استفاده مي شود. براي تسريع کارها، متغيرهاي محلي در Call Stack قرار مي گيرند

19 Call Stack هر برنامه تک پردازه اي (همه برنامه هاي معمولي) يک Call Stack دارد هر تابع بخشي از Call Stack‌را براي نگهداري متغيرهاي محلي خود استفاده مي کند. همچنين پارامترهاي تابع در اين بخش قرار مي گيرند. خواندن و نوشتن در Call Stackتنها از قسمت انتهايي آن صورت مي گيرد. اين محل با Top of Stack Pointer مشخص مي شود مثال:برنامه ترسيم مستطيل از تابع ترسيم خط استفاده مي کند: program draw_square ( int x1 int y1 int x2 int y2) draw_line(x1 y1 x1 y2) draw_line(x1 y1 x2 y1) draw_line(x1 y2 x2 y2) draw_line(x2 y1 x2 y2)

20 Call Stack برنامه نمونه

21 فراخواني تابع فراخواني تابع:
پارامترهاي تابع در Call Stack قرار مي گيرند آدرس برگشت در Call Stack قرار مي گيرد تابع فراخوانده مي شود پس از فراخواني، اجراي برنامه از آدرسي که در بالاي Stack قرار دارد، ادامه مي يابد.

22 پروژه 1 - مقايسه روشهاي مرتب سازي
تاکنون چندين روش مرتب سازي را بررسي کرده ايم. برنامه اي بنويسيد که : عدد صحيح مثبت N را بگيرد. آرايه اي از مقادير تصادفي به طول N بسازد. با استفاده از هرکدام از الگوريتمهايي که بررسي کرده ايم، آرايه را مرتب کند و زمان مرتب سازي را اندازه بگيرد. با استفاده از هرکدام از الگوريتمها، آرايه مرتب شده را يکبار ديگر مرتب کند. جدولي به شکل زير چاپ کند: N Algorithm Time #1 Time #2

23 پروژه 1 - ادامه time #1 زمان صرف شده براي مرتب سازي آرايه تصادفي است. time #2 زمان مرتب سازي براي آرايه مرتب شده ! است. برنامه شما با وارد کردن عدد 0 پايان مي يابد مهلت تحويل اين پروژه 31 فروردين 1386 است. هر نفر بايد پروژه خود را مستقلا انجام دهد.

24 پروژه 1- راهنمايي امکانات مورد نياز
آرايه ها در Java توليد اعداد تصادفي در java اندازه گيري زمان اجرا در java براي اطلاع بيشتر و راهنمايي درباره زبان برنامه نويسي java به صفحه وب درس “ برنامه نويسي پيشرفته” در سايت زير مراجعه کنيد.

25 توليد اعداد تصادفي در java
کلاس Random ‌براي توليد اعداد تصادفي استفاده مي شود: Random r = new Random() ; int x = r.nextInt( 5 ) ; // Returns 0 ,1, 2, 3 or 4 اين کلاس جزو بسته java.util است. بنابراين قبل از تعريف کلاس برنامه بايد دستور زير را بالاي برنامه خود بنويسيد: import java.util.*; براي اطلاع بيشتر فصل 6.9 کتاب Deitel & Deitel‌را مطالعه کنيد.

26 اندازه گيري زمان اجراي يک دستور
تابع System.currentTimeMillis() زمان فعلي را با واحد ميلي ثانيه برمي گرداند. دستورات زير زمان اجراي يک بلاک را اندازه گيري مي کنند: int n0 = System.currentTimeMillis() ; for ( int k=0 ; k < 1000 ; k++ ) ; int n1 = System.currentTimeMillis() ; int d = n1 - n0 ; System.out.println(“Running time : “ + d ) ;


Κατέβασμα ppt "رشد توابع توابع بازگشتي"

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google