بالا
 تعرفه تبلیغات




 دانلود نمونه سوالات نیمسال دوم 93-94 پیام نور

 دانلود نمونه سوالات آزمونهای مختلف فراگیر پیام نور

نمایش نتایج: از شماره 1 تا 2 از مجموع 2

موضوع: تحلیل مقدماتی الگوریتمها

Hybrid View

  1. #1
    Y@SiN آواتار ها
    • 2,083

    عنوان کاربری
    مدیر بازنشسته بخش کامپیوتر و تخصصی IT
    تاریخ عضویت
    Mar 2009
    راه های ارتباطی

    Icon14 تحلیل مقدماتی الگوریتمها

    سوال:
    • چگونه می‌توانیم زمان اجرای یک الگوریتم را محاسبه کنیم؟
    • چگونه می‌توانیم دو تا الگوریتم را با هم مقایسه کنیم؟
    • چگونه می‌توانیم بگوییم که یک الگوریتم بهینه هست؟
    جواب:
    تعداد عملیات پایه که الگوریتم با بدترین ورودی اجرا می‌کند.

    عملیات پایه می‌توانند یکی از موارد زیر باشند:
    • یک انتساب (Assignment)
    • مقایسه‌ى دو تا متغییر (Comparison)
    • یک محاسبه ریاضی بین دو تا متغیر (Arithmatic Operation)
    بدترین ورودی هم، آن ورودیی است که باعث اجرای بیشترین عملیات پایه می‌شود. به عنوان مثال در حلقه زیر با بدترین ورودی بیشترین تکرار 5 است:

    کد:
    کد:
    n := 5; loop get(m); n := n -1; until (m=0 or n=0)
    و در حلقه زیر با بدترین ورودی بیشترین تکرار n می‌باشد:

    کد:
    کد:
    get(n); loop get(m); n := n -1; until (m=0 or n=0)
    حالا چطور تعداد عملیات پایه را بشماریم؟ برای ساختارهای مختلف الگوریتم به شرح زیر عمل می‌کنیم:

    توالی (Sequence):
    P و Q قسمتهای یک الگوریتم هستند.

    زمان کل = زمان(P) + زمان(Q)

    حلقه (Iteration):

    کد:
    کد:
    while < condition > loop P; end loop
    یا
    کد:
    کد:
    for i in 1..n loop P; end loop
    زمان کل = زمان<span dir=ltr>x (P)</span> بیشترین تعداد تکرار

    شرط (Conditional):

    کد:
    کد:
    if &lt; condition > then P; else Q; end if;
    زمان کل = زمان(P) اگر شرط برقرار باشد
    زمان کل = زمان(Q) اگر شرط برقرار نباشد

    روتینهای بازگشتی (Recursive Procedures):
    در اینجا تنها به این نکته بسنده می‌کنم که زمان اجرای این روتینها بسته به اندازه ورودی تابعی (توابعی) لگاریتمی است.

    خوب٬ برای نمونه الگوریتم زیر رو در نظر بگیرید:

    کد:
    کد:
    for i in 1..n loop for j in 1..n loop if i &lt; j then swop (a(i,j), a(j,i)); -- Basic operation end if; end loop; end loop;
    تعداد عملیات پایه &lt; <span dir=ltr>n^2</span> = <span dir=ltr>(n * n * 1)</span>
    Y@SiN
    فعلا امضا نداريم.باشگاه داريم

  2. #2
    Y@SiN آواتار ها
    • 2,083

    عنوان کاربری
    مدیر بازنشسته بخش کامپیوتر و تخصصی IT
    تاریخ عضویت
    Mar 2009
    راه های ارتباطی

    Icon30

    برای پیدا کردن یک الگوریتم بهینه٬ در بیشتر موارد میزان افزایش زمان اجرای یک الگوریتم با افزایش اندازه‌ی مسئله مورد توجه ماست.

    فرض کنید که سه تا الگوریتم به نامهای P و Q و R داریم که با اندازه ورودیهای مختلف در بدترین شرایط زمان اجرایی طبق جدول زیر دارند:

    کد:
    کد:
    n       P             Q              R
    1       1             5              100
    10      1024          500            1000
    100     2^100         50,000         10,000
    1000    2^1000        5,000,000      100,000
    اگر هر کدوم از این الگوریتمها توسط ماشینی که در هر ثانیه یک میلیون <span dir=ltr>(10^6)</span> عمل پایه رو اجرا می‌کند اجرا بشوند٬ داریم:

    کد:
    کد:
    n       P             Q              R
    1       1 µs          5 µs           100 µs
    10      1 ms          0.5 ms         1 ms
    100     2^70 years    0.05 sec.      0.01 sec.
    1000    2^970 years   5 sec.         0.1 sec.
    همانطور که می‌بینید٬ بیان میزان رشد زمان بر حسب <span dir=ltr>(2^n, n^2; n) n</span> معنی‌دارتر از بیان آن با فاکتورهای ثابت <span dir=ltr>(1; 5; 100)</span> است.


    نماد O

    فرض کنید <span dir=ltr>f.N -> R</span> و <span dir=ltr>g.N -> R</span> در این صورت داریم:
    کد:
    کد:
    f(n) = O(g(n))
    این به این معناست که مقادیر n0 و c ای وجود دارند که:
    کد:
    کد:
    f(n) &lt;= c * g(n) که n >= n0
    و بر این اساس می‌توانیم زمان اجرای یک الگوریتم را بر حسب اندازه ورودی بیان کنیم.

    به عنوان نمونه:
    • الگوریتمی برای مرتب کردن n عنصر وجود دارد (mergesort) که زمان اجرای آن <span dir=ltr>O(n log n)</span> است.
    • الگوریتمی برای ضرب دو عدد n رقمی وجود دارد که زمان اجرای آن <span dir=ltr>O(n^2)</span> است.
    • الگوریتمی برای بدست آوردن nامین عدد سری فیبوناچی وجود دارد که زمان اجرای آن <span dir=ltr>O(log n)</span> است.
    نماد OM

    این نماد برای بیان این مفهوم که یک الگوریتم حداقل نیاز به اجرای تعدادی مرحله دارد بکار می‌رود.

    دوباره فرض کنید <span dir=ltr>f.N -> R</span> و <span dir=ltr>g.N -> R</span> در این صورت داریم:
    کد:
    کد:
    f(n) = OM(g(n))
    این به این معناست که مقادیر n0 و c ای وجود دارند که:
    کد:
    کد:
    f(n) >= c * g(n) که n >= n0
    نماد THETA

    دوباره فرض کنید <span dir=ltr>f.N -> R</span> و <span dir=ltr>g.N -> R</span>
    اگر <span dir=ltr>f(n)=O(g(n))</span> و <span dir=ltr>f(n)=OM(g(n))</span> داریم:
    کد:
    کد:
    f(n) = THETA(g(n))
    در اینصورت گفته می‌شود <span dir=ltr>f(n)</span> با تقریب بسیار کمی با <span dir=ltr>g(n)</span> برابر است.

    اگر <span dir=ltr>f(n) = THETA(g(n))</span> باشد٬ الگوریتمهایی با زمان اجرای <span dir=ltr>f(n)</span> و <span dir=ltr>g(n)</span> با افزایش n بطور برابر افزایش زمان پیدا می‌کند.


    روابط بین نمادهای O و OM

    <span dir=ltr>f(n)=O(g(n))</span> اگر و فقط اگر <span dir=ltr>g(n)=OM(f(n))</span>

    اگر <span dir=ltr>f(n)=O(g(n))</span> در اینصورت داریم:
    کد:
    کد:
    f(n) + g(n) = O(g(n)) f(n) + g(n) = OM(g(n)) f(n) * g(n) = O(g(n)^2) f(n) * g(n) = OM(f(n)^2)
    به عنوان نمونه اگر <span dir=ltr>f(n)=10n</span> و <span dir=ltr>g(n)=2n^2</span> باشند:
    کد:
    کد:
    f(n) = O(g(n)) 10n + 2n^2 = O(n^2) 10n + 2n^2 = OM(n^2) (10n) * (2n^2) = O(n^4) (10n) * (2n^2) = OM(n^2)
    Y@SiN
    فعلا امضا نداريم.باشگاه داريم

برچسب برای این موضوع

مجوز های ارسال و ویرایش

  • شما نمی توانید موضوع جدید ارسال کنید
  • شما نمی توانید به پست ها پاسخ دهید
  • شما نمی توانید فایل پیوست ضمیمه کنید
  • شما نمی توانید پست های خود را ویرایش کنید
  •