Hacker News

مقدمه ای تعاملی برای چهار درخت

نظرات

1 min read Via growingswe.com

Mewayz Team

Editorial Team

Hacker News

چرا چهار درخت بیشتر از آنچه فکر می کنید اهمیت دارند

هر بار که روی نقشه دیجیتالی برای زوم کردن، پرس و جو از رستوران‌های اطراف یا تماشای یک ردیاب ناوگان بی‌درنگ ده‌ها نماد خودرو را بدون توقف مرورگرتان به‌روزرسانی می‌کنید، به احتمال زیاد یک چهاردرخت در پشت صحنه کارهای سنگین را انجام می‌دهد. Quadtrees یکی از آن ساختارهای داده ظریفی است که اکثر مردم هرگز درباره آن چیزی نمی شنوند، با این حال آنها بی سر و صدا برخی از حیاتی ترین سیستم های عملکردی در نرم افزارهای مدرن را تامین می کنند - از تشخیص برخورد بازی های ویدیویی گرفته تا سیستم های اطلاعات جغرافیایی که میلیون ها پرس و جو فضایی را در ثانیه پردازش می کنند. درک نحوه کار آنها فقط شما را به یک توسعه دهنده بهتر تبدیل نمی کند. اساساً طرز فکر شما را در مورد سازماندهی و جستجو از طریق داده های مکانی تغییر می دهد. چه در حال ساختن یک پلتفرم تدارکات تحویل، یک داشبورد تجزیه و تحلیل مبتنی بر مکان باشید، یا صرفاً سعی کنید 50000 نقطه داده را بدون خراب کردن مرورگر بر روی یک بوم ارائه دهید، چهار درخت راه حلی را ارائه می دهند که هم بصری و هم بسیار کارآمد است.

دقیقاً چهار درخت چیست؟

یک چهار درخت یک ساختار داده درختی است که در آن هر گره داخلی دقیقاً چهار فرزند دارد که هر کدام یک ربع از یک فضای دو بعدی را نشان می‌دهند. تصور کنید که یک منطقه مربع را بگیرید و آن را به چهار مربع مساوی تقسیم کنید - شمال غربی، شمال شرقی، جنوب غربی و جنوب شرقی. هر یک از آن مربع ها را می توان به چهار مربع دیگر تقسیم کرد، و به همین ترتیب، به صورت بازگشتی، تا زمانی که به شرایط توقف برسید. این شرط توقف معمولاً یا حداکثر عمق یا آستانه ای برای تعداد نقاط داده ای است که یک گره می تواند قبل از اینکه نیاز به تقسیم شدن داشته باشد، نگه دارد.

زیبایی این رویکرد در ماهیت تطبیقی آن نهفته است. نواحی متراکم با نقاط داده به سلول‌های ظریف‌تر و ظریف‌تر تقسیم می‌شوند، در حالی که مناطق پراکنده به‌عنوان مناطق بزرگ و تقسیم نشده باقی می‌مانند. چهاردرختی که مکان‌های 10000 کافی‌شاپ را در سراسر یک کشور ذخیره می‌کند، تقسیم‌بندی‌های عمیق و دقیقی را بر فراز منهتن ایجاد می‌کند - جایی که ممکن است 300 مغازه در چند کیلومتر مربع وجود داشته باشد - در حالی که بخش‌های وسیعی از وایومینگ روستایی را به‌عنوان یک گره منفرد و جدا نشده شامل صفر یا یک نقطه نگه می‌دارد. این وضوح تطبیقی همان چیزی است که چهاردرخت را در مقایسه با یک شبکه مسطح بسیار قدرتمند می کند که باعث هدر رفتن مقدار زیادی از حافظه در سلول های خالی می شود.

این مفهوم برای اولین بار توسط رافائل فینکل و جی.ال. بنتلی در سال 1974 توصیف شد، و از آن زمان به انواع مختلفی منشعب شد: چهاردرخت نقطه جفت مختصات منفرد را ذخیره می کند، چهاردرخت منطقه نمایانگر مناطق فضایی (مفید برای فشرده سازی تصویر) و خطوطدسته های چهارگانه لبه است. هر گونه برای موارد استفاده متفاوت بهینه می‌شود، اما اصل اصلی تقسیم‌بندی بازگشتی در همه آنها یکسان باقی می‌ماند.

درج و پرس و جو چگونه کار می کند

برای درج یک نقطه در یک چهار درخت، از گره ریشه شروع می‌کنید و تعیین می‌کنید که نقطه در کدام یک از چهار ربع قرار می‌گیرد. سپس دوباره به گره فرزند آن ربع بازگشته و این فرآیند را تکرار کنید. اگر به یک گره برگ برسید که از ظرفیت آن بیشتر نشده است (معمولاً 1 یا 4 نقطه تنظیم می شود)، به سادگی نقطه را در آنجا ذخیره می کنید. اگر برگ در حال حاضر ظرفیت خود را داشته باشد، به چهار فرزند تقسیم می شود، نقاط موجود خود را بین آنها توزیع می کند و سپس نقطه جدید را در فرزند مناسب وارد می کند. این فرآیند معمولاً در زمان O(log n) برای توزیع متعادل تکمیل می‌شود، اگرچه بدترین سناریوها با داده‌های بسیار خوشه‌ای می‌توانند عملکرد را کاهش دهند.

جستجوی محدوده - یافتن تمام نقاط در یک ناحیه مستطیلی مشخص - جایی است که چهار درخت واقعاً می درخشند. به جای بررسی تک تک نقاط مجموعه داده خود (عملیات O(n))، از ریشه شروع می‌کنید و یک سوال ساده در هر گره می‌پرسید: آیا مرز این گره با مستطیل جستجوی من قطع می‌شود؟ در غیر این صورت، کل زیردرخت را هرس می‌کنید - به طور بالقوه هزاران نکته را از در نظر گرفتن در یک مقایسه حذف می‌کنید. اگر تقاطع وجود داشته باشد، دوباره به فرزندان مربوطه مراجعه می کنید. نقاط یافت شده در گره های برگ که در مستطیل جستجو قرار می گیرند به مجموعه نتایج اضافه می شوند.

یک مثال عملی را در نظر بگیرید: شما مجموعه داده ای از 100000 مکان مشتری دارید و باید همه را در شعاع 5 کیلومتری یک فروشگاه جدید پیدا کنید. یک رویکرد brute-force نیاز به 100000 محاسبه فاصله دارد. یک چهاردرختی که به خوبی ساخته شده باشد ممکن است با حذف سریع کل مناطق جغرافیایی که به وضوح با منطقه جستجوی شما همپوشانی ندارند، آن را به 200-500 بررسی کاهش دهد. این یک بهبود عملکرد 200 برابر یا بیشتر است - تفاوت بین جستجوی 800 میلی ثانیه و 4 میلی ثانیه.

برنامه های دنیای واقعی که روی چهار درخت اجرا می شوند

کاربردهای چهاردرختی بسیار فراتر از علوم کامپیوتر دانشگاهی است. آنها برای سیستم‌هایی که میلیاردها نفر روزانه از آن‌ها استفاده می‌کنند، اغلب بدون اینکه متوجه شوند، اساسی هستند.

  • نقشه‌برداری و پیمایش: خدماتی مانند Google Maps و Mapbox از سیستم‌های کاشی چهاردرخت برای ارائه تصاویر نقشه استفاده می‌کنند. هر سطح زوم، کاشی‌ها را به چهار فرزند تقسیم می‌کند، به همین دلیل است که مختصات کاشی نقشه از یک الگوی z/x/y پیروی می‌کند که آدرس‌دهی چهاردرخت را منعکس می‌کند. وقتی روی یک بلوک شهری بزرگ‌نمایی می‌کنید، فقط کاشی‌های با وضوح بالا بارگیری می‌شوند - بقیه نقاط جهان در وضوح درشت باقی می‌مانند.
  • تشخیص برخورد در بازی‌ها: موتورهای بازی از درخت‌های چهارگانه (و همتای سه‌بعدی آن‌ها، octrees) استفاده می‌کنند تا زمانی که اشیا با هم برخورد می‌کنند به طور موثر تشخیص دهند. به جای آزمایش هر جفت شی - یک کابوس O(n²) با 1000 موجودیت روی صفحه - موتور فقط اشیایی را بررسی می کند که دارای سلول چهاردرختی یکسان هستند و بررسی ها را به تعداد قابل مدیریت کاهش می دهد.
  • فشرده‌سازی تصویر: چهار درخت منطقه می‌توانند تصاویر را با ادغام پیکسل‌های مجاور که رنگ‌های مشابه را به اشتراک می‌گذارند در بلوک‌های بزرگ‌تر فشرده کنند. این اساس الگوریتم‌های فشرده‌سازی خاصی است که به نسبت فشرده سازی 10:1 دست می‌یابند و در عین حال وفاداری بصری را در مناطقی با جزئیات کم حفظ می‌کنند.
  • مدیریت ناوگان و تدارکات: شرکت‌های تحویل‌دهنده از نمایه‌سازی مکانی برای تطبیق رانندگان با سفارش‌های نزدیک در زمان واقعی استفاده می‌کنند. یک چهار درخت به یک سیستم دیسپاچ اجازه می دهد تا فورا به این سوال پاسخ دهد که "کدام 5 راننده به این مکان پیکاپ نزدیکتر هستند؟" در ناوگانی متشکل از هزاران وسیله نقلیه که موقعیت های GPS خود را هر چند ثانیه به روز می کنند.
  • تحلیل‌های مکانی: پلت‌فرم‌هایی که داده‌های کسب‌وکار مبتنی بر مکان را جمع‌آوری می‌کنند - نقشه‌های تراکم مشتری، بهینه‌سازی منطقه فروش، تجزیه و تحلیل مکان فروشگاه - به ساختارهای داده‌های مکانی متکی هستند تا این پرسش‌ها را به جای پردازش دسته‌ای، تعاملی کنند.

بینش کلیدی در پشت چهاردرخت این است که اکثر پرس و جوهای فضایی نیازی به بررسی بیشتر داده ها ندارند. با سازمان‌دهی فضا به‌صورت سلسله مراتبی، جستجوهای brute-force را به پیمایش‌های هدفمند تبدیل می‌کنید - ثانیه‌ها را به میلی‌ثانیه تبدیل می‌کنید و تعامل در زمان واقعی را حتی با مجموعه‌های داده عظیم ممکن می‌کنید.

ساخت چهار درخت از ابتدا

پیاده‌سازی یک چهار درخت پایه به طرز شگفت‌آوری قابل دسترسی است، حتی برای توسعه‌دهندگان متوسط. ساختار هسته فقط به چند جزء نیاز دارد: یک مرز (منطقه مستطیلی که گره می پوشاند)، یک ظرفیت (حداکثر نقاط قبل از تقسیم)، یک آرایه نقاط، و ارجاع به چهار گره فرزند (در ابتدا تهی). کل تابع insert را می توان در کمتر از 30 خط کد در اکثر زبان ها نوشت.

عملیات تقسیم چهار گره فرزند جدید ایجاد می کند که هر کدام یک ربع از مرز والد را پوشش می دهند. برای والدین با مرز (x، y، عرض، ارتفاع)، فرزند شمال شرقی (x + عرض/2، y، عرض/2، ارتفاع/2)، شمال غربی (x، y، عرض/2، ارتفاع/2) و غیره می شود. پس از تقسیم، نقاط موجود به فرزندان مناسب توزیع می شود. یک اشتباه رایج فراموشی پاک کردن آرایه امتیازهای والد پس از توزیع مجدد است که منجر به نتایج تکراری در طول پرس‌و‌جوها می‌شود.

برای استفاده در تولید، چندین بهینه سازی مهم است. تنظیم ظرفیت گره روی 4-8 نقطه معمولاً از ظرفیت 1 بهتر است، زیرا عمق درخت و سربار اشیاء گره را کاهش می دهد. افزودن حداکثر حد عمق (معمولاً 8-12 سطح) از موارد پاتولوژیک که در آن بسیاری از نقاط دارای مختصات یکسانی هستند از ایجاد درختان بی‌نهایت عمیق جلوگیری می‌کند. و برای مجموعه‌های داده پویا که نقاط حرکت می‌کنند - مانند ردیابی وسیله نقلیه - یک مکانیسم حذف یا استراتژی برای بازسازی دوره‌ای درخت می‌خواهید، زیرا درخت‌های چهارگانه مانند درختان قرمز-سیاه تعادل خود را حفظ نمی‌کنند.

💡 DID YOU KNOW?

Mewayz replaces 8+ business tools in one platform

CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.

Start Free →

چهار درخت در پلتفرم های تجاری و تجزیه و تحلیل

پلتفرم‌های تجاری مدرن به طور فزاینده‌ای با داده‌های مکانی سروکار دارند، خواه مکان مشتری، مناطق تحویل، مناطق فروش یا ردیابی دارایی باشد. چالش فقط ذخیره این داده ها نیست - بلکه باعث می شود آن ها در زمان واقعی در مقیاس قابل پرس و جو باشند. هنگامی که یک کسب و کار در 50 شهر نیاز به تجسم تراکم مشتری، محرک های تحویل مسیر یا تجزیه و تحلیل عملکرد فروش منطقه ای دارد، استراتژی نمایه سازی فضایی اساسی تعیین می کند که داشبورد در 200 میلی ثانیه بارگیری می شود یا 20 ثانیه.

این یکی از دلایلی است که پلتفرم‌هایی مانند Mewayz - که 207 ماژول شامل CRM، صورت‌حساب، مدیریت ناوگان، رزرو و تجزیه و تحلیل را در یک سیستم‌عامل تجاری واحد ادغام می‌کند - از مدیریت کارآمد داده‌های مکانی در زیر پوشش بهره می‌برند. هنگامی که یک ماژول مدیریت ناوگان نیاز به نمایش 500 وسیله نقلیه فعال بر روی نقشه دارد، یا زمانی که یک ماژول CRM بیش از 138000 مکان کاربر را برای برنامه ریزی قلمرو تجسم می کند، رویکردهای ساده لوحانه به سادگی مقیاس نمی شوند. ساختارهای نمایه سازی فضایی مانند چهار درخت (یا معادل های پایگاه داده آنها، مانند PostGIS R-trees و MySQL spatial index) ارائه این ویژگی ها را بدون نیاز به سخت افزار درجه یک سازمانی امکان پذیر می کند.

برای کسب‌وکارهایی که پلت‌فرم‌ها را ارزیابی می‌کنند، راهکاری عملی است: ابزارهایی که مکان و داده‌های مکانی را به خوبی مدیریت می‌کنند، فقط از الگوریتم‌های فانتزی برای این کار استفاده نمی‌کنند. آنها در حال ایجاد تفاوت بین سیستم رزروی هستند که می تواند فوراً ارائه دهندگان خدمات موجود را در فاصله 10 کیلومتری نشان دهد و سیستمی که بارگیری نتایج مشابه 8 ثانیه طول می کشد. عملکرد در این سطح مستقیماً به تجربه کاربر و در نهایت درآمد تبدیل می شود.

چهاردرخت در مقابل دیگر ساختارهای داده مکانی

چهاردرخت تنها گزینه برای نمایه سازی فضایی نیستند و درک گزینه های جایگزین به شما کمک می کند ابزار مناسب را انتخاب کنید. R-trees که به‌طور گسترده در پایگاه‌های داده‌ای مانند PostGIS و ماژول R*Tree SQLite استفاده می‌شود، داده‌ها را در مستطیل‌های حداقل محدود سازماندهی می‌کند و جستجوهای محدوده و جستجوهای نزدیک‌ترین همسایه را به طور موثر مدیریت می‌کند. آنها معمولاً از چهار درخت برای ذخیره سازی مبتنی بر دیسک بهتر عمل می کنند زیرا عملیات I/O را به حداقل می رسانند، به همین دلیل است که اکثر پایگاه های داده فضایی از گونه های R-tree در داخل به جای چهار درخت استفاده می کنند.

فضای پارتیشن

درخت K-d با استفاده از تقسیم‌بندی‌های تراز محور متناوب (اول توسط x، سپس توسط y، سپس دوباره توسط x) و برای جستجوهای نزدیک‌ترین همسایه در ابعاد متوسط عالی هستند. زمانی که ابعاد کم و مجموعه داده ایستا است، عملکرد بهتری از چهار درخت دارند، اما به‌روزرسانی پویا سخت‌تر است. Geohashes کاملاً رویکرد متفاوتی دارند و طول و عرض جغرافیایی را در یک رشته رمزگذاری می‌کنند که در آن پیشوندهای مشترک نشان‌دهنده نزدیکی فضایی است - آنها را برای نمایه‌سازی پایگاه‌داده و ذخیره‌سازی در حافظه نهان ایده‌آل می‌کند اما برای جستجوهای محدوده دلخواه کمتر انعطاف‌پذیر است.

چهاردرختها در سناریوهایی که با نقاط قوت آنها عمل می کنند، خود را حفظ می کنند: نمایه سازی فضایی در حافظه، مجموعه داده های پویا با درج و حذف مکرر، برنامه های تجسم سازی که در آن ساختار شبکه سلسله مراتبی به طور طبیعی به سطوح بزرگنمایی نقشه می کشد، و موقعیت هایی که سادگی پیاده سازی اهمیت دارد. برای یک برنامه جلویی که 10000 نقطه داده را بر روی بوم با پان و زوم ارائه می‌کند، یک چهار درخت پیاده‌سازی شده در 100 خط جاوا اسکریپت به سادگی با حذف تأخیر شبکه، از هر راه‌حل مبتنی بر پایگاه داده بهتر است.

شروع به کار: مراحل بعدی عملی

اگر می خواهید درک خود را از چهاردرخت فراتر از خواندن در مورد آنها عمیق تر کنید، موثرترین روش ساختن یکی به صورت بصری است. یک برنامه بوم ساده ایجاد کنید که در آن کلیک کردن امتیاز اضافه می کند و تقسیم درخت را در زمان واقعی تماشا کنید. یک مستطیل محدوده پرس و جو اضافه کنید که می توانید آن را بکشید و نقاطی را که پیدا می کند برجسته کنید. این تعامل عملی شهودی را ایجاد می‌کند که هیچ مقداری از خواندن نمی‌تواند با آن مطابقت داشته باشد - بلافاصله خواهید دید که چرا داده‌های خوشه‌ای درختان عمیق‌تری ایجاد می‌کنند و چگونه رفتار هرس در طول جستجوها، بخش‌های بزرگی از فضا را حذف می‌کند.

برای برنامه های تولید، این دستورالعمل ها را در نظر بگیرید: اگر داده های شما در یک پایگاه داده زندگی می کنند، به جای پیاده سازی چهار درخت در کد برنامه، از نمایه سازی فضایی پایگاه داده شما (شاخص های PostGIS، MySQL Spatial، MongoDB 2dsphere) استفاده کنید. اگر در حال انجام تجسم سمت سرویس گیرنده یا پردازش درون حافظه هستید، کتابخانه‌هایی مانند d3-quadtree برای جاوا اسکریپت یا pyquadtree برای Python به شما پیاده‌سازی‌های آزمایش شده در نبرد را می‌دهند. و اگر در حال ساختن پلتفرمی هستید که هر نوع داده موقعیت مکانی را مدیریت می کند - از آدرس های مشتری گرفته تا مسیریابی تحویل تا مدیریت قلمرو - برای درک نمایه سازی فضایی وقت بگذارید، زیرا اساساً آنچه را که برنامه شما می تواند در مقیاس انجام دهد شکل می دهد.

چهاردرخت ها اصل گسترده تری را در علم کامپیوتر نشان می دهند: ساختاری که برای داده های خود انتخاب می کنید، سؤالاتی را تعیین می کند که می توانید به طور مؤثر به آنها پاسخ دهید. یک لیست مسطح از مختصات می تواند پاسخ دهد "همه امتیازها را به من بدهید"، اما یک چهار درخت می تواند پاسخ دهد "همه نقاط نزدیک اینجا را به من بدهید" - و می تواند آنقدر سریع این کار را انجام دهد تا احساس آنی کند. در دنیایی که 73 درصد داده‌های کسب‌وکار دارای یک جزء فضایی بر اساس برآوردهای صنعت هستند، این قابلیت فقط علمی نیست. این یک مزیت رقابتی است.

سوالات متداول

چهار درخت چیست و چگونه کار می کند؟

یک چهار درخت یک ساختار داده مبتنی بر درخت است که به صورت بازگشتی یک فضای دو بعدی را به چهار ربع مساوی تقسیم می کند. هر گره می تواند تعداد محدودی از نقاط داده را قبل از تقسیم به چهار گره فرزند نگه دارد. این پارتیشن بندی سلسله مراتبی پرس و جوهای فضایی - مانند یافتن همه نقاط در یک منطقه معین - را بسیار سریع می کند و زمان جستجو را از خطی به لگاریتمی در اکثر سناریوهای عملی کاهش می دهد.

چهاردرخت معمولاً در برنامه‌های دنیای واقعی کجا استفاده می‌شوند؟

چهاردرخت طیف گسترده‌ای از سیستم‌ها از جمله نقشه‌های دیجیتال با عملکرد نزدیک به زوم، داشبوردهای ردیابی ناوگان بی‌درنگ، موتورهای تشخیص برخورد بازی‌های ویدیویی، و سیستم‌های اطلاعات جغرافیایی که میلیون‌ها جستجوی فضایی را در ثانیه پردازش می‌کنند، نیرو می‌دهند. هر برنامه‌ای که نیاز به جستجو، درج یا مدیریت کارآمد اشیاء توزیع شده در یک فضای دو بعدی دارد، می‌تواند از فهرست‌سازی چهاردرختی بهره‌مند شود.

چهاردرختها چگونه با سایر ساختارهای داده مکانی مقایسه می شوند؟

بر خلاف شبکه‌های مسطح، چهاردرخت وضوح خود را با چگالی داده تطبیق می‌دهند - مناطق پراکنده درشت باقی می‌مانند در حالی که مناطق شلوغ بیشتر تقسیم می‌شوند. در مقایسه با درختان k-d، چهار درخت برای پیاده سازی ساده تر هستند و برای داده های دوبعدی توزیع شده یکنواخت مناسب تر هستند. درخت‌های R با زیبایی بیشتر مناطق همپوشانی را مدیریت می‌کنند، اما چهاردرخت با سرعت درج برنده می‌شوند و موازی‌سازی آنها برای بارهای کاری بلادرنگ آسان‌تر است.

آیا چهار درخت می توانند به بهینه سازی عملکرد در نرم افزارهای تجاری کمک کنند؟

کاملاً. هر ابزار تجاری که داده های مکان، تجزیه و تحلیل فضایی یا داشبوردهای تعاملی را مدیریت می کند، از بهینه سازی چهار درختی سود می برد. پلتفرم‌هایی مانند Mewayz، یک سیستم‌عامل تجاری ۲۰۷ ​​ماژول که از ۱۹ دلار در ماه شروع می‌شود، از ساختارهای داده کارآمد در پشت صحنه برای ارائه تجربیات سریع و پاسخگو - از نقشه‌های مکان یاب تا تجزیه و تحلیل بلادرنگ در هزاران نقطه داده استفاده می‌کند.