Transcript O(n)

Orthogonal Range Searching
Querying a Database
92 ‫ابان‬
‫عاطفه اکبری‬-‫زینب محمدی‬
‫ بسیاری از انواع پرسش هایی که روی یک پایگاه داده پرسیده میشود قابل‬‫تفسیر به صورت هندس ی است‪.‬‬
‫برای این منظور رکوردهای پایگاه داده را به نقاطی در فضای چند بعدی انتقال‬
‫می دهیم و پرسش ها را روی این نقاط اجرا میکنیم‪.‬‬
‫در هر مسیری که به چپ حرکت میکنیم برگهای زیر درخت راست را گزارش‬
‫میکنیم و در حرکت به سمت راست برگ های زیر درخت چپ را‪.‬‬
‫لم ‪ :1-5‬الگوریتم‬
‫دقیقا نقاطی را که در بازه قرار دارد گزارش میکند‪.‬‬
‫اثبات‪:‬‬
‫‪ -1‬هر نقطه ای که گزارش شده در بازه بوده‬
‫‪ -2‬هر نقطه ای که در بازه هست گزارش میشود‪.‬‬
Complexities:
Query Time
O( K + log n) T ,[x,x’]  output
Construction Time O(n log n)
Space
O(n)
PT
store T
‫فرض های اولیه‪ :‬هیچ دو نقطه ای مختصات ‪ x,y‬یکسان ندارند‬
‫ یک فضای ‪ 2‬بعدی را میتوان ترکیبی از ‪ 2‬تا فضای ‪1‬‬‫بعدی در نظر گرفت‪.‬‬
‫ساختمان داده ی مناسب ‪:‬‬
‫‪bst‬متوازن؟‬
‫با توجه به تعریف بازگشتی ‪ bst‬متوازن قابل تعمیم به‬
‫فضای با بعد باالتر هست‪.‬‬
‫تعریف بازگشتی‪ :‬مجموعه ای از نقاط که به دو‬
‫زیرمجموعه ی تقریبا مساوی تقسیم میشوند یک زیر‬
‫مجموعه شامل نقاط کوچکتر یا مساوی با راس جداساز‬
‫و دیگری شامل نقاط بزرگتر از راس جداساز‬
dimension d=2:
y
point p=( x(p) , y(p) ) , range
R = [x1 : x2]  [y1 : y2]
p R  x(p)  [x1 : x2] and y(p)  [y1 : y2] .
R
y2
y(p)
y1
p
x
x1
x(p) x2
L
L
2D-tree
Pright
Pleft
Pleft
Pright
OR
Pright
L
Pleft
‫خط جداساز‬:L
Buildkdtree(p,depth)
L1
L5
L9
p10
p2
p8
L2
p1
p5 p
6
p3
L4
p4
L3
L6
p9
L8 p7
L1
L7
L2
L6
L3
L4
p1
p3
L5
p4
p2
L7
L8
p5
p7
p6
L9
p9
p8
p10
‫زمان ساخت‪:‬‬
‫)‪O(nlogn‬‬
‫)‪T(n)=O(n)+2T(n/2‬‬
‫فضای ذخیره سازی‪O(n):‬‬
‫لم ‪ :3-5‬یک ‪ kdtree‬روی مجموعه ای از ‪n‬نقطه فضایی برابر با )‪ o(n‬خواهد‬
‫برد و در زمان )‪ o(nlogn‬ساخته میشود‪.‬‬
‫نتیجه‪ :‬اگر ناحیه ی پرسش ما با )‪region(v‬اشتراک داشته باشد باید به دنبال زیردرختی باشیم که‬
‫ریشه ی ان ‪v‬هست‪.‬‬
‫لم ‪ :4-5‬پرس و جو برای یک دامنه ی مستطیل شکل در یک ‪kdtree‬با ‪n‬نقطه در‬
‫زمان )‪ O(k+√n‬انجام میشود‪.‬‬
‫قضیه ‪:5-5‬‬
‫یک درخت ‪kd‬برای مجموعه ای از ‪n‬نقطه در صفحه در زمان )‪O(nlogn‬‬
‫ساخته میشود و فضایی برابر با )‪ O(n‬استفاده خواهد کرد‪.‬و پرس و جو برای‬
‫داده در فضای ‪ 2‬بعدی )‪O(K+√n‬میباشد‪.‬‬
‫ برای راحتی کار و پیدا کردن حداکثر ناحیه‬‫هایی که با مرز های ما برخورد دارند یکی از‬
‫‪ 4‬یال (چون فضا ‪ 2‬بعدی است) رو در نظر گرفته‬
‫و مساله را برای ان حل میکنیم و چون برای‬
‫همه ی یال ها روال کار مشابه است نتیجه را‬
‫در ‪ 4‬ضرب میکنیم‪.‬‬
‫ برای اینکه کران باال برای نواحی‬‫دارای اشتراک با ناحیه ی جستجو بدست‬
‫بیاید پاره خط ها را خط در نظر‬
‫میگیریم‪.‬‬
‫توجه‪:‬یال مورد نظر(خط قرمز)فقط یک سمت هر خط جداساز عمودی‬
‫قرار داشته و دو طرف هر خط جداساز افقی است‪.‬‬
‫اگر )‪Q(n‬را تعداد نود های دارای ناحیه ی مشترک در یک ‪ kdtree‬با ‪ n‬برگ‬
‫در نظر بگیریم میتوان روابط زیر را نتیجه گرفت‪:‬‬
‫اگر در عمق زوج درخت باشیم‪:‬‬
‫)‪Q(n)=1+Q(n/2‬‬
‫)‪(1‬‬
‫و اگر در عمق فرد باشیم‬
‫)‪Q(n)=1+2Q(n/2‬‬
‫از )‪ (1‬و )‪ (2‬نتیجه میشود‪:‬‬
‫)‪Q(n)ϵO)√ n‬‬
‫)‪Q(n)=O(k)+2Q(n/4‬‬
‫)‪(2‬‬
‫‪2‬تا خط عمودی و ‪ 2‬تا خط افقی داریم که حداکثر نواحی مشترک با هر یک از انها )‪o(√n‬است‬
‫فضای ‪ 3‬بعدی‪:‬‬
y
z
x
‫مشابه حالت قبل‪:‬‬
‫)‪x: Q(n)=1+Q(n/2‬‬
‫)‪y: Q(n)=1+2Q(n/2‬‬
‫)‪z: Q(n)=1+2Q(n/2‬‬
‫با ترکیب ‪ 3‬رابطه ی باال‪:‬‬
‫)‪Q(n)=O(1)+4Q(n/8‬‬
‫‪Q(n)ϵ‬‬
‫هر مکعب ‪ 6‬وجه دارد که برای هر کدام رابطه ی باال صادق است‪.‬‬
Range Tree
‫‪Range tree‬‬
‫نتیجه‪:‬پرس و جو در یک ‪kdtree‬درزمان‬
‫قابل اجراست‪.‬‬
‫ایا میتوان زمان را بهبود داد؟‬
‫‪Range tree‬‬
‫• زمان ساخت ‪ k_dtree‬از مرتبهی )‪O(n‬‬
‫• زمان جستجو در ‪ k_dtree‬ازمرتبهی‬
‫)‪O(n log n‬‬
‫)‪O(√n + k‬‬
‫)‪O((log n)2 + k‬‬
‫زیرمجموعه ی کانونی)‪ :p(v‬مجموعهی نقاطی که در‬
‫برگهای زیر درخت با ریشه ی ‪ v‬ذخیره شده اند‪.‬‬
‫• اجتماع مجزای )‪ O(log n‬زیرمجموعهی کانونی را برای هر درخت در الیهی اول‬
‫تعریف میکنیم‪.‬‬
‫• درخت اصلی‬
‫• درخت وابسته‬
‫بر اساس مؤلفه ‪x‬‬
‫بر اساس مؤلفه ‪y‬‬
Range Trees
2-level data structure:
root[T ]
Primary Level:
BST on
x-coordinates
Tassoc(v)
v
Secondary level:
BST on y-coord.
P(v)
P(v)
min(v)
max(v)
‫• در این جا به بررسی سه مورد میپردازیم‪:‬‬
‫• زمان ساخت‬
‫• فضای ساخت‬
‫• زمان جستجو‬
‫• فرض بر این است نقاط به صورت پیش فرض بر اساس ‪ x‬مرتب هستند‪.‬‬
‫زمان ساخت‪:‬‬
‫ساخت درخت وابسته‪O(nlogn) :‬‬
‫• یافتن میانه‪O(1) :‬‬
‫• رابطهی بازگشتی‪2T(n/2) :‬‬
‫• )‪T(n)=O(nlogn)+O(1)+2T(n/2‬‬
‫)‪T(n)=O(nlog2n‬‬
‫میتوان این زمان را بهینه تر کرد!‬
‫با فرض مرتب بودن نقاط به طور پیش فرض براساس ‪ y‬داریم‪:‬‬
‫ساخت درخت وابسته‪O(n) :‬‬
‫یافتن میانه‪O(1) :‬‬
‫روابط بازگشتی‪2T(n/2) :‬‬
‫در نهایت داریم‪T(n)=O(n)+2T(n/2):‬‬
‫)‪T(n)=O(nlog n‬‬
‫با استفاده از فرمول اصلی داریم‪:‬‬
‫لم ‪:6-5‬یک ‪range tree‬روی یک مجموعه از ‪n‬نقطه فضای )‪ O(nlogn‬نیاز دارد‪.‬‬
‫اثبات‪:‬به تعداد نود های هر سطح درخت اول ‚درخت وابسته داریم‪.‬مثال در سطح اول یک نود وجود دارد‬
‫و یک درخت وابسته با ‪ n‬نود‚در سطح دوم ‪ 2‬نود با ‪ n/2‬برگ وجود دارد که برای هر کدام درخت‬
‫وابسته با ‪n/2‬برگ وجود داردو‪....‬پس میتوان رابطه ی زیر را نوشت‪:‬‬
‫)‪O(n)+2O(n/2)+4O(n/4)+…+nO(1‬‬
‫عبارت باال به )‪O(n‬تعلق دارد‪.‬تعداد سطوح درخت اولیه‪ nlogn‬و هر سطح )‪O(n‬فضا نیاز دارد‪.‬پس‬
‫فضای ذخیره سازی‪O(nlogn):‬‬
‫الگوریتم جستجو برای ‪ Range Tree‬دوبعدی‪:‬‬
‫‪-1‬این الگوریتم در ابتدا در زمان )‪( O(logn‬برای هر گره میانی) زیرمجموعهی کانونی را انتخاب می کند‬
‫که همهی آنها با هم شامل نقاطی هستند که مؤلفهی ‪ x‬آنها در بازهی ]’‪ [x,x‬قرار دارد‪(.‬که میتواند‬
‫توسط یک جستجوی یک بعدی انجام شود‪).‬‬
‫‪-2‬نقاطی از مجموعهی فوق مد نظر است که مؤلفهی ‪ y‬آنها نیز در بازهی ]’‪ [y,y‬قرار داشته باشند‪(.‬این‬
‫کار نیز توسط یک الگوریتم جستجوی یک بعدی قابل انجام است‪ ،‬که در این الگوریتم همان ساختارهای‬
‫وابسته که قبال در مجموعهی کانونی ذخیره شده اند بکار می رود‪).‬‬
‫این الگوریتم یعنی ‪ 2-DRANGEQUERY‬شبیه همان الگوریتم ‪ 1-DRANGEQUERY‬است که‬
‫تفاوت این دو در فراخوانی ‪ REPORTSUBTREE‬است‪ ،‬که در این جا به جای آن از ‪1-‬‬
‫‪ DRANGEQUERY‬استفاده میشود‪.‬‬
Algorithm 2DRANGEQUERY(T.[x:x’]×[y:y’] (
Input. A 2-dimensional range tree T and a range [x:x’]×[y:y’].
Output. All points in T that lie in the range.
1. vsplit ← FINDSLPITNODE(T,x,x’(
2. If vsplit is a leaf
3. then check if the point stored at vsplit must be reported.
4. else (*follow the path to x and call 1DRANGEQUERY on
the subtrees right of the path.*)
5. v ←lc(vsplit )
6. While v is not a leaf
7. do if x ≤ xv
8. then 1DRANGEQUERY(Tassoc)rc)v((, [y:y’](
9. v ←lc(v)
10. else v ←rc(v)
11. Check if the point stored at v must be reported.
12. Similarly, follow the path from rc(vsplit ( to x’, call
1DRANGEQUERY with the range [y:y’] on the associated
structures of subtrees left of the path, and check if the point
stored at the leaf where the path ends must be reported.
15
‫لم ‪:5-7‬‬
‫نشان دهید یک جستجوی مستطیلی موازی محور ‪x‬ها و ‪y‬ها در یک ‪ Range Tree‬که ‪ n‬نقطه ذخیره کرده است زمان‬
‫)‪ O((log n)² + k‬نیاز دارد که ‪ k‬تعداد نقاط گزارش شده است‪.‬‬
‫• اثبات‪:‬‬
‫‪‬دردرخت اصلی‪ v‬در مسیر چپ و راست کال برای این که تصمیم بگیریم آیا به فراخوانی ‪ 1-DRANGEQUERY‬نیاز‬
‫است یا نه به زمان )‪ O(logn‬نیاز است‪.‬‬
‫‪ ‬اگر تمام گرههای میانی واقع شده در مسیر]’‪ [x,x‬که طول ‪ logn‬دارند را بخواهیم‪ ،‬باید الگوریتم‬
‫‪ DRANGEQUERY‬را فراخوانی کنیم که طبق لم ‪ 5-2‬از مرتبهی‬
‫)‪O(Kv + log |Tassoc(v)|)=O(Kv + log nv‬‬
‫است‪.‬‬
‫‪ Kv‬تعداد نقاط گزارش شده است‪.‬‬
‫اگر ‪ v‬را تعداد نقاطی که به ازای آنها الگوریتم فراخوانی می شود در نظر بگیریم زمان کل مصرف شده‬
‫برای الگوریتم برابر است با‪:‬‬
‫و داریم‪:‬‬
‫که اگر ‪ K‬را تعداد تمام نقاط گزارش شده در نظر بگیریم‪ ،‬جمع اول در این رابطه برابر است با‪:‬‬
‫و چون الگوریتم ‪ 1-DRANGEQUERY‬حداکثر ‪ log n‬بار انجام میشود‪ ،‬داریم‪:‬‬
‫و می دانیم ‪:‬‬
‫‪nv<=n‬‬
‫قضیه ‪:5-8‬‬
‫فرض کنید ‪ p‬یک مجموعه از ‪ n‬نقطه در صفحه باشد که یک ‪ Range Tree‬برای ذخیره‬
‫سازی این ‪ p‬نقطه به زمان )‪ O(n logn‬و برای ساخت هم به زمان )‪ O(n logn‬نیاز دارد‪.‬جستجو بر روی‬
‫‪ Range Tree‬میتواند نقاطی از مجموعهی ‪ p‬را که در مستطیلی موازی محور ‪x‬ها و ‪ y‬ها است را در‬
‫زمان )‪ O(logn2+k‬میدهد‪ K .‬تعداد نقاط گزارش شده است‪.‬‬
Higher_Dimensional Range Tree:
‫‪ ‬برای ساختن ‪ Range Tree‬هایی در ابعاد باالتر باید‬
‫چندین سطح از درختهای وابسته داشته باشیم‪.‬هر درخت‬
‫توسط اشاره گرهایی از درخت سطح قبل‪ ،‬قابل دسترسی‬
‫است‪.‬‬
‫ساخت درختهایی در ابعاد باالتر‪:‬‬
‫بعدی‬
‫(فرض کنید ‪ p‬مجموعه نقطههایی در فضای ‪ُ d‬‬
‫باشد‪).‬‬
‫‪ ‬ساختن یک درخت جستجوی دودویی متعادل براساس‬
‫مؤلفهی اول‬
‫‪‬در هر راس‬
‫‪ v‬در درخت سطح اول زیرمجموعهی کانونی‬
‫)‪p(v‬مجموعه نقاطی است که در برگهای زیردرخت با ریشه‬
‫‪ ‬درخت به صورت بازگشتی ساخته میشود‪.‬‬
‫‪‬توقف بازگشت لحظهای است که به یک درخت با عمق ‪ 1‬برسیم‪.‬‬
General Sets Of Point:
‫تا کنون فرض بر این بود که در مجموعهی ‪ p‬هیچ دو نقطهای‬
‫دارای مؤلفهی ‪ x‬یکسان و ‪ y‬یکسان نیستند‪.‬‬
‫راه حل‪:‬‬
‫‪‬استفاده از اعداد ترکیبی قاموسی بجای اعداد‬
‫‪Composite Number Space:‬‬
‫حقیقی‬
‫‪‬نمایش اعداد ترکیبی که از هر دو عدد عدد ‪ a,b‬ساخته‬
‫میشود به فرم زیر است‪:‬‬
‫)‪(a,b) → (a | b‬‬
‫‪‬حال یک رابطه کلی روی فضای ترکیبی توسط ترتیب قاموسی‬
‫)‪ (a | b‬و )’‪ (a’ | b‬داریم‪:‬‬
‫تعریف میکنیم‪ .‬پس برای دو عدد‬
‫)’‪(a | b) < (a’ | b’) ⇔ a<a’ or (a=a’ & b<b‬‬
‫‪‬نمایش هر نقطه در مجموعه ‪ p‬بصورت ) ‪ p = (px , py‬اکنون‬
‫بصورت‪:‬‬
‫در این روش‬
‫میآید‪.‬‬
‫مجموعهی جدید ’‪ p‬از ‪ n‬نقطه به وجود‬
‫‪‬هدف گزارش نقاطی از مجموعهی ‪ p‬است که در ناحیهی‬
‫‪ R‬هستند‪R=[x,x’]*[y,y’] .‬‬
‫‪‬ساختن درخت برروی ’‪p‬‬
‫انتقال ‪ R‬به فضای ترکیبی جدید ’‪R‬‬
‫] )∞‪R=[x:x’]×[y:y’] → R’ = [ (x | -∞) : (x’ | +∞) ] × [ (y | -∞) : (y’|+‬‬
‫درستی روش با لم زیر اثبات میشود‪.‬‬
‫لم ‪:5-10‬‬
‫فرض کنید ‪ p‬یک نقطه باشد و ‪Rectangular Range‬باشد‪.‬‬
‫آنگاه‪:‬‬
‫’‪p ∈ R ⇔ p’ ∈ R‬‬
‫فرض کنید ‪ p‬در ناحیهی ‪ R‬قرار دارد‪ ،‬طبق تعریف ‪ p‬در‪ R‬قرار دارد اگر وتنهااگر‬
‫’‪ x ≤ px ≤ x‬و ’‪y ≤ py ≤ y‬‬
‫وبه راحتی میتوان نشان داد حالت فوق برقرار است اگر و تنها اگر‪:‬‬
‫)∞‪(x | -∞) ≤ (px | py ) ≤ (x’ | +‬و )∞‪(y | -∞) ≤ (py | px ) ≤ (y’ | +‬‬