روش هورنر (مقدار چندجملهای)
مقدار چندجملهای درجهی n را فقط با n ضرب و n جمع حساب میکند: x را پشت سر هم بیرون میکشد.
حساب مستقیم a_n·xⁿ + … + a_1·x + a_0 با محاسبهی جداگانهی هر توان، O(n²) ضرب لازم دارد (یا 2n با نگه داشتن توان قبلی). هورنر x را پشت سر هم بیرون میکشد:
- زمان:
O(n) - حافظه:
O(1) - CLRS، فصل ۲
- گریمالدی، فصل ۴
P(x) = 2x³ − 6x² + 2x − 1 در x = 3: سه ضرب و سه جمع، جواب ۵.
def horner(coeffs, x):# coeffs holds one row: a_n, …, a_1, a_0 (the highest power first).y = 0rows = []for a in coeffs[0]:y = y * x + arows.append((a, y))return y
شروع اجرا
y—
جدول هنوز خالی است.
متغیرهای محلی
x3
نارنجی = در همین گام عوض شد
coeffs list
[2, -6, 2, -1]
Call stack
- horner()خط 1
گام ۱ از ۱۷
توضیح
ایده
حساب مستقیم a_n·xⁿ + … + a_1·x + a_0 با محاسبهی جداگانهی هر توان، O(n²) ضرب لازم دارد (یا 2n با نگه داشتن توان قبلی). هورنر x را پشت سر هم بیرون میکشد:
2x³ − 6x² + 2x − 1 = ((2·x − 6)·x + 2)·x − 1
پس فقط n ضرب و n جمع لازم است.
کاربردها
- تبدیل عدد از هر مبنایی به دهدهی (ورودی «خواندن عدد دودویی»).
- تقسیم چندجملهای بر
x − c(تقسیم مصنوعی): مقدارهای میانیyهمان ضریبهای خارجقسمتاند.
در trace به چه چیزی نگاه کنی
- هر سطر جدول یک ضریب و مقدار
yبعد از آن است.