جدول پراکنده
این مقاله به هیچ منبع و مرجعی استناد نمیکند. |
جدول پراکنده (به انگلیسی:sparse table) مفهومی است که برای جستجوی سریع در مجموعه ای از داده های استاتیک (داده هایی که تغییر نمیکنند) استفاده می شود و پیش پردازشی بر روی داده ها انجام می دهد تا به سوالات کاربر در ارتباط با داده ها پاسخ دهد.
تعریف
[ویرایش]یک آرایه را در نظر بگیرید شامل n عضو از یک مجموعه منظم(خوش ترتیب) مانند مجموعه اعداد باشد،می توان به کمک یک جدول پراکنده درهرمرحله طبق خواسته کاربر خروجی مورد نیاز او را بدون نیاز به صرف زمان زیاد چاپ کرد. خواسته کاربر می تواند موارد مختلفی را شامل شود که به تفکیک هرکدام را بررسی خواهیم کرد.
کاربرد ها
[ویرایش]در این موارد می توان از جدول پراکنده کمک گرفت:
- جستجوی ماکسیمم بازه ای
- جستجوی بزرگترین مقسوم علیه مشترک بازه ای
- جستجوی مینیمم بازه ای
- جستجوی مجموع بازه ای
جستجوی ماکسیمم بازه ای
[ویرایش]یکی از موارد استفاده جدول پراکنده در جستجوی ماکسیمم هر بازه مورد نیاز کاربر است. بدین صورت که:
آرایه ای مانند را درنظر بگیرید، درهر مرحله یک بازه داده می شود که باید بزرگترین عدد در آن بازه را پیدا کرد. بازه های ما به شکل هستند که L ابتدای بازه ی و R انتهای بازه را نشان می دهند و نیز این عبارت برای هر L و R برقرار است: ، به عنوان مثال آرایه را در نظر بگیرید که در بازه ی بزرگترین عدد 7 ، در بازه ی بزرگترین عدد 5 و در بازه نیز بزرگترین عدد 5 می باشد.
حال اگر تعداد بازه ها افزایش یابند این عمل نیازمند زمان زیادی است که بخواهیم تک تک اعداد آن بازه را بررسی کنیم ، به جای آن می توان از جدول پراکنده کمک گرفت و پاسخ هر بازه را بسیار سریع و در زمان پیدا کرد.
ایده
[ویرایش]می توان قبل از شروع پرسش داده هایمان را پیش پردازش کنیم و ماکسیمم تمامی زیرآرایه ها به طول که j در بازه 0 تا قرار دارد را بیابیم.
برای این کار یک جدول پراکنده به نام ایجاد می کنیم که ماکسیمم تمامی بازه ها با شروع از i و به طول را در بردارد.برای پر کردن این جدول از طراحی پایین به بالا استفاده می کنیم و در مراحل بالاتر از نتایج مراحل پایین تر کمک می گیریم،به این صورت که برای یافتن ماکسیمم در بازه ی از ماکسیمم های دو بازه و استفاده میکنیم که بزرگترین آن ها ماکسیمم کل می باشد.
شبه کد زیر بیانگر مثال بالا است:
// Maximum of single element subarrays is same
// as the only element.
lookup[i][0] = arr[i]
// If lookup[0][2]>= lookup[4][2],
// then lookup[0][3] = lookup[0][2]
If lookup[i][j-1]>= lookup[i+2^(j-1)-1][j-1]
lookup[i][j] = lookup[i][j-1]
// If lookup[0][2] <lookup[4][2],
// then lookup[0][3] = lookup[4][2]
Else
lookup[i][j] = lookup[i+2^(j-1)-1][j-1]
جدول جستجو
[ویرایش]برای آرایه تمامی بازه های ممکن را در نظر می گیریم و جدول زیر را تکمیل میکنیم:
3 | 2 | 1 | 0 | i/j |
---|---|---|---|---|
12 | 7 | 7 | 7 | 0 |
18 | 5 | 3 | 2 | 1 |
- | 10 | 3 | 3 | 2 |
- | 10 | 5 | 0 | 3 |
- | 12 | 10 | 5 | 4 |
- | 18 | 10 | 10 | 5 |
- | - | 12 | 3 | 6 |
- | - | 18 | 12 | 7 |
- | - | - | 18 | 8 |
پس برای هر بازه از نزدیک ترین توان های 2 استفاده می کنیم،بدین صورت که دو بازه در نظر می گیریم که اولی و دومی می باشد، درنهایت ماکسیمم کل که ماکسیمم این دو بازه است جواب مسئله می باشد.
شبه کد
[ویرایش]شبه کد زیر نحوه یافتن ماکسیمم یک بازه به کمک دو زیر بازه از آن را به ما نشان می دهد:
// For (2, 10), j = floor(Log(10-2+1)) = 3
j = floor(Log(R-L+1))
// If lookup[2][3]>= lookup[3][3],
// then min(2, 10) = lookup[2][3]
If lookup[L][j]>= lookup[R-(int)pow(2, j)+1][j]
min(L, R) = lookup[L][j]
// If lookup[2][3] <lookup[3][3],
// then min(2, 10) = lookup[3][3]
Else
min(L, R) = lookup[i+2^(j-1)-1][j-1]
زمان اجرا
[ویرایش]چون برای هر جستجو ما فقط یک مقایسه انجام می دهیم پس زمان بررسی هر درخواست است.قبل از درخواست های کاربر پیش پردازشی روی داده ها صورت می گیرد که زمان اجرای آن است.
حافظه مصرفی
[ویرایش]حافظه استفاده شده برای این الگوریتم است.
جستجوی بزرگترین مقسوم علیه مشترک بازه ای
[ویرایش]یکی از کاربرد های دیگر جدول پراکنده یافتن بزرگترین مقسوم علیه مشترک در بازه مورد نیاز کاربر است:
آرایه ای مانند را درنظر بگیرید، درهر مرحله یک بازه داده می شود که باید بزرگترین بزرگترین مقسوم علیه مشترک اعداد موجود در آن بازه را پیدا کرد. بازه های ما به شکل هستند که L ابتدای بازه ی و R انتهای بازه را نشان می دهند و نیز این عبارت برای هر L و R برقرار است: ، به عنوان مثال آرایه را در نظر بگیرید که در بازه ی بزرگترین مقسوم علیه مشترک آنها 2، در بازه ی بزرگترین مقسوم علیه مشترک 1 و در بازه نیز بزرگترین مقسوم علیه مشترک 8 می باشد.
حال با افزایش تعداد بازه ها این عمل نیازمند زمان زیادی است که بخواهیم تک تک اعداد آن بازه را بررسی کنیم ، به جای آن می توان از جدول پراکنده کمک گرفت و پاسخ هر بازه را بسیار سریع و در زمان پیدا کرد.
ایده
[ویرایش]ایده این قسمت نیز همانند قسمت قبل است و با یک پیش پردازش روی داده ها و تعیین بزرگترین مقسوم علیه مشترک زیرآرایه هایی به طول که j در بازه 0 تا قرار دارد می توان در طول اجرای برنامه در زمان بسیار کمی پاسخ بازه مورد نظر را یافت.
پس یک جدول پراکنده که شامل بزرگ ترین مقسوم علیه مشترک تمامی بازه ها با شروع از i و به طول است را ایجاد می کنیم و در هر مرحله از زیربازه های پایین تر برای تعیین بزرگترین مقسوم علیه مشترک بازه ی بالاتر شامل آن دو بازه استفاده می کنیم،بدین صورت که بزرگترین مقسوم علیه مشترک اعداد بازه بزرگتر همان بزرگترین مقسوم علیه مشترک پاسخ بازه های کوچکتر است که در مراحل قبل یافتیم.
جدول جستجو
[ویرایش]برای آرایه جدول جستجو به صورت زیر می باشد:
3 | 2 | 1 | 0 | i/j |
---|---|---|---|---|
1 | 1 | 1 | 7 | 0 |
1 | 1 | 1 | 2 | 1 |
- | 1 | 3 | 3 | 2 |
- | 1 | 5 | 0 | 3 |
- | 1 | 5 | 5 | 4 |
- | 1 | 1 | 10 | 5 |
- | - | 3 | 3 | 6 |
- | - | 6 | 12 | 7 |
- | - | - | 18 | 8 |
زمان و حافظه مصرفی
[ویرایش]همانطور که در بخش قبل نیز توضیح داده شد،زمان اجرا(پیش پردازش) و حافظه استفاده شده برای این عمل است و زمان لازم برای پاسخ به هر پرسش است.
جستجوی مینیمم بازه ای
[ویرایش]از کاربرد های دیگر درخت پراکنده می توان به جستجوی مینیمم بازه ای اشاره کرد:
در این روش نیز همانند دو قسمت قبل پیش پردازش را روی داده ها انجام می دهیم و مشابه قسمت اول عمل میکنیم با این تفاوت که بجای یافتن ماکسیمم در هر بازه مینیمم آن بازه را می یابیم و در جدول وارد می کنیم وسپس طبق پرسش مورد نظر به هر سوال در زمان کمتری پاسخ می دهیم.
زمان پیش پردازش،پاسخ به هر پرسش و حافظه مصرفی همانند موارد قبل است.
جدول جستجو
[ویرایش]برای آرایه جدول جستجو به صورت زیر خواهد بود:
3 | 2 | 1 | 0 | i/j |
---|---|---|---|---|
0 | 0 | 2 | 7 | 0 |
0 | 0 | 2 | 2 | 1 |
- | 0 | 0 | 3 | 2 |
- | 0 | 0 | 0 | 3 |
- | 3 | 5 | 5 | 4 |
- | 3 | 3 | 10 | 5 |
- | - | 3 | 3 | 6 |
- | - | 12 | 12 | 7 |
- | - | - | 18 | 8 |
جستجوی مجموع بازه ای
[ویرایش]کاربرد دیگری که می توان برای درخت پراکنده نام برد،استفاده از آن در جستجوی مجموع بازه ای است.
روشی که درخت پراکنده در اختیار ما می گذارد همانند روش هایی است که در بالا ذکر شد فقط باید در تمامی زیرآرایه ها به طول که j در بازه 0 تا قرار دارد مجموع اعداد آن بازه را در درخت پراکنده ذخیره کنیم و پیش پردازش را به این صورت انجام دهیم. با استفاده از این روش میتوان به هر سوالی که در رابطه با مجموع اعداد بازه های مختلف پرسیده می شود در پاسخ داد.
ایده کلی ، زمان و حافظه مصرفی این مسائل نیز مثل تمامی مسائل بالاست.
جدول جستجو
[ویرایش]برای آرایه جدول جستجو به صورت زیر است:
3 | 2 | 1 | 0 | i/j |
---|---|---|---|---|
42 | 12 | 9 | 7 | 0 |
53 | 10 | 5 | 2 | 1 |
- | 18 | 3 | 3 | 2 |
- | 18 | 5 | 0 | 3 |
- | 30 | 15 | 5 | 4 |
- | 43 | 13 | 10 | 5 |
- | - | 15 | 3 | 6 |
- | - | 30 | 12 | 7 |
- | - | - | 18 | 8 |