روش هورنر

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

روش هورنر روشی کارامد برای محاسبه مقدار یک چندجمله‌ای در نقطه مورد نظر می‌باشد.

برای مثال چندجمله‌ای مقابل را در نظر بگیرید : P(x)=a_0+a_1 x+a_2 x^2+ ... +a_n x^n

الگوریتم بدیهی برای محاسبه مقدار چندجمله‌ای در نقطه مورد نظر[ویرایش]

یک الگوریتم بدیهی برای اینکه مقدار این چند جمله‌ای را در نقطه‌ای مانند x=x_0 به دست آوریم، این است که هر جملهٔ این چندجمله‌ای را مجزا حساب کرده وهمه را با هم جمع کنیم. در ادامه شبه کد این الگوریتم آمده‌است:

Naive-Poly-Eval(A : Poly, x)
 y = ۰
 for k = ۱ to length(A)
  do p = ۱
     for j = ۱ to k
       do p = p*x
     y = y + A[k]*p
 return y

لازم به توضیح است که در شبه کد بالا A به عنوان آرایه‌ای است که ضرایب چندجمله‌ای را در خودش نگه می‌دارد.

تحلیل[ویرایش]

خب نگاهی مختصر به تحلیل این الگوریتم می‌اندازیم. مشخص است که حلقه داخلی بیشترین زمان اجرای را دارد و زمان اجرای کل الگوریتم هم از تتا این زمان اجرا خواهد بود. بنابراین با یه جمع زدن تعداد دفعات اجرای حلقه داخلی به زمان اجرایی معادل n^2 می‌رسیم. که زمان اجرای به نسبت زیادی هست. باید ببینیم آیا راهی برای بهتر کردن الگوریتم هست یا نه؟

ایده بهینه کردن این الگوریتم[ویرایش]

با کمی دقت در می‌یابیم، این زمان اجرای بالا از این جهت ایجاد می‌شود که ما همیشه برای محاسبهٔ توان n ام x_0 واقعاً n بار عمل ضرب را انجام می‌دهیم. بدون توجه به اینکه ما می‌توانیم با انجام دادن فقط یک عمل ضرب این توان را از توان n-۱ آن بدست آوریم.

بنابراین یک ایده برای اینکه الگوریتم را بهتر کنیم این است که همیشه مقدار توان محاسبه شده یک مرحله قبل را نگه داریم تا توان مرحله کنونی را فقط با یک عمل ضرب بدست آوریم. این طوری زمان اجرای الگوریتم خطی می‌شود که بسیار کارا تر از الگوریتم قبلی هست.

روش هورنر[ویرایش]

ویلیام جورج هورنر با در نظر گرفتن همین ایده پیاده سازی دیگری از این الگوریتم را ارائه می‌کند، در ادامه شبه کد این الگورتم آمده‌است:

Horner-Poly-Eval(A : Poly, x)
 y = ۰
 k = n : length(A)
 while k>= ۰
   do y = A[k] + x*y
      k = k - ۱
 return y

روند اجرای الگوریتم هورنر[ویرایش]

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

ابتدا چندجمله‌ای را به صورت زیر ساده می‌کنیم:

P(x)=a_0+x(a_1+x(a_2+ ... +x(a_{n-1}+xa_n)))

تا اینجا احتمالاً مشخص شده که این الگوریتم چه طوری عمل می‌کند.

برای بیشتر روشن شدن قضیه به مقدار y در ابتدای حلفه نگاه می‌اندازیم:

۱ y = ۰
۲ y = A[n]
۳ y = A[n-۱] + y*x
4 y = A[n-۲] + y*x
    .
    .
    .
n y = A[۰] + y*x

تحلیل[ویرایش]

برای تحلیل این الگوریتم هم در نظر داشته باشید که فقط یک حلقه وجود دارد که به اندازه طول آرابه A انجام می‌شود. دستورها داخل حلقه هم که از O(۱) هستند. بنابراین این الگوریتم هم خطی می‌باشد.

جستارهای وابسته[ویرایش]

منابع[ویرایش]