segment tree
build: O(nlogn)
storage: O(nlogn)
query: O(logn+k)
----------------------------------
interval tree
build: O(nlogn)
storage O(n)
query: O(logn+k)
----------------------------------
range tree
build: O(nlogn)
storage: O(n)
query: O(logn+k)
جواب:
الگوریتم:
1- تصویر بازه ها روی محور x را حساب می کنیم و یک درخت بازه روی آن می سازیم. (interval tree)
2- در هر نود درخت بازه ی ساخته شده، یک درخت محدوده (range tree) روی تصویر پاره خطها روی محور y (یک نقطه به ازای هر پاره خط) می سازیم.
3- کوئری را اول روی درخت بازه جواب می دهیم بعد روی درخت محدوده ی آن.
اثبات درستی:
در قدم اول [x,x'] را پیدا می کنیم و در قدم دوم بازه ی y را هم چک می کنیم.
زمان، پیش پردازش، کوئری:
برای درخت بازه ها: تعداد پاره خط ها = تعداد پاره خط های ورودی = n
برای درخت محدوده: تعداد نقاط = تعداد پاره خط های ورودی = n
1- پیدا کردن بازه های شامل یک نقطه: segment tree معمولی
2- پیدا کردن مساحت مستطیل ها (اجتماع بازه ها): semi static segment tree
3- پیدا کردن پاره خطهای متقاطع با یک پاره خط عمودی: augmented segment tree
(در هر گره یک BST نگهداری می کنیم که ترتیب خطهای عمودی را نگه می دارد. شبیه کاری که در سوئیپ می کردیم)
4- پیدا کردن مستطیل های شامل یک نقطه: multi-level segment tree
segment tree دو بعدی
Voronoi Diagrams and Delauney triangulations are data structures to reason about points and regions in space...
... not to be confused with the abstract, Paul Klee like work of Robert Delaunay.
http://www.cse.wustl.edu/~pless/546/
linkage measures
بر اساس معیارهای زیر می توانیم گرافهای متفاوتی برای خوشه بندی نقاط بسازیم. اولین چیزی که به ذهن آدم می رسد یک گراف کامل است که فاصله ی هر دو نقطه را وزن یال قرار بدهیم، اما این کار هزینه ی زیادی دارد.
1- کمترین فاصله: فاصله ی هر نقطه از یک خوشه را تا یک نقطه از خوشه ی دیگر مینیمم کند.
به این روش ها نزدیک ترین همسایه می گویند. کلا هر روشی که بر مبنای نزدیک ترین خوشه به یک نقطه عمل کند single linkage است.
در ساخت گراف آن، به این معنی است که بین نزدیک ترین دو نقطه ی دو خوشه (نزدیک ترین خوشه ها) متفاوت یک یال رسم کنیم. (راسهای گراف نقاط هستند). چون همیشه یالها بین خوشه های متفاوت رسم می شوند، گراف ساخته شده یک درخت است. به همین دلیل به این روشها minimal spanning tree هم می گویند.
(هر نقطه به نزدیک ترین مرکز خود وصل است)
(نزدیک بودن محلی)
2- بیشترین فاصله: فاصله ی بین نقاط دو خوشه متمایز را ماکسیمم می کند. (بین هر دو خوشه نه، بین هر خوشه تا نزدیک ترین خوشه ها به آن)
به این روشها دورترین همسایه می گویند. اگر تا جایی ادامه دهیم که فاصله ی دو خوشه از یک حد آستانه مشخص شده توسط کاربر بیشتر شود، به آن اتصال کامل می گویند.
با این روش گرافی که ساخته می شود، هر خوشه آن یک زیرگراف کامل است.
هدف این الگوریتم ها مینیمم کردن قطر خوشه ها است و وقتی بهترین جواب را می دهند که خوشه ها فشرده باشند و اندازه ی تقریبا مساوی داشته باشند.
(نزدیک بودن سراسری)
** هر دوی روشهای بالا به داده های پرت (که با داده های دیگر فاصله زیاد دارند) و نویز (خطای تصادفی) حساس هستند. به همین دلیل روش های دیگری ارائه شد که بین این دو روش افراطی بودند:
3- فاصله میانگینها: بین میانگین دو خوشه فاصله را مینیمم کنیم.
** این روش مشکل قبل را حل می کند و محاسبه ی آن ساده است، اما برای داده های غیر عددی جواب نمی دهد، در نتیجه ملاک دیگری ارائه شد:
4- میانگین فاصله ی نقاط دو خوشه
1/(n1*n2) * sum (pi, qj)
pi in C1, q in C2
بر خلاف تعریف فاصله ی مرکزها، میانگین را می توانیم برای داده های غیرعددی هم تعریف کنیم. (مثلا مد یا میانه)
**** این روشها برای خوشه بندی سلسله مراتبی هستند.