برای سنجیدنِ همزمانیِ بازهها، باید معنایِ لحظهٔ پایان روشن باشد. اگر پایانِ یک بازه و شروعِ دیگری یک زمان باشد، آیا هر دو همزماناند؟ این تمرین با خطِ جاروب و قراردادِ نیمهباز، همهٔ بازهها را نگه میدارد و تعدادِ فعالها و طولِ پوشش را دقیق حساب میکند.
چهار بازه و دو پرسش
دادهٔ اصیل A=[۰،۳)،B=[۱،۴)،C=[۳،۵) وD=[۵،۶) است. نشانهٔ کروشهٔ شروع و پرانتزِ پایان یعنی start شامل وend خارج است. سؤالِ اول، بیشترین تعدادِ بازهٔ همزمان است؛ سؤالِ دوم طولِ قسمتهایی است که دستکم یک بازه آنها را میپوشاند.
هر بازه شناسهٔ مستقل دارد. طولِ مجموعِ همهٔ بازهها، طولِ اجتماع نیست؛ بخشِ مشترک نباید برای اجتماع دوباره شمرده شود. فایل بهجایِ یک شمارندهٔ بینام، شناسههای فعالِ هر قطعه را هم نگه میدارد تا معلوم شود هر عدد از کجا آمده است.
رویدادهایِ همزمان را گروه کنیم
برای هر زمان، دو فهرستِ پایانها و شروعها میسازیم. در یک گروه، ابتدا شناسههایِ پایانیافته از active حذف و سپس شروعهایِ تازه اضافه میشوند. وضعیتِ بعد از گروه، وضعیتِ قطعه تا زمانِ بعدی را توصیف میکند. به این ترتیب، یک حالتِ میانیِ مصنوعی داخلِ یک زمان، قلهٔ اشتباه نمیسازد.
در زمان۳،A خارج وC وارد میشود. مجموعهٔ بعد از رویداد، B وC است؛ تعداد دو است. در زمان۵،C خارج وD وارد میشود. دفترِ JSON، قبل،پایانها،شروعها وبعدِ هر گروه را جدا مینویسد.
قله و طولِ اجتماع
برای هر دو زمانِ مجاور، بازهٔ قطعه، شناسههایِ فعال و تعداد ثبت میشود. در این مثال قله۲ است و طولِ اجتماع۶، چون فاصلهٔ صفر تا۶ بدونِ شکاف پوشیده شده است. برای اجتماع، فقط طولِ قطعههایی را جمع میکنیم که activeِ غیرخالی دارند.
ورودیِ خالی، قله و اجتماعِ صفر دارد. دو بازهٔ جدا با شکاف و یک جفتِ تودرتو نیز واقعاً اجرا شدهاند؛ شکاف به طولِ اجتماع افزوده نمیشود و بازهٔ داخلی، طولِ پوششِ قبلی را دوباره زیاد نمیکند.
اگر قراردادِ بسته را انتخاب کنیم چه؟
در زمان۳ با شرطِ start≤۳≤end، سه شناسهٔ A وB وC حاضرند. عددِ سه برای قراردادِ بستهٔ آن لحظه معنای دیگری دارد، اما برای نیمهبازِ همین تمرین اشتباه است. پس تفاوت را صرفاً خطایِ شمارش نمینامیم؛ نخست باید تعریفِ بازهٔ موردِ نیاز را انتخاب کنیم.
منبعِ آموزشیِ Princeton برای مسئلهٔ خودش، endpointهایِ برابر را کنار گذاشته است. گروهبندیِ مساویها و ترتیبِ پایانقبلازشروع، توسعهٔ اصیلِ این تمریناند و به همان کدِ منبع نسبت داده نمیشوند. مستنداتِ PostgreSQL فقط برای روشنکردنِ قراردادِ شامل وناشامل خوانده شده؛ پایگاهِ داده در فایل اجرا نشده است.
کنترلِ مستقل از شمارندهٔ رویداد
oracle، تمامِ زمانهایِ مرزی را میگیرد و برای هر قطعه، نقطهٔ میانیِ کسری میسازد. سپس روی تکتکِ بازههایِ اصلی، شرطِ start≤mid<end را بررسی میکند. شناسهها، قله و اجتماع از این مسیرِ مستقل با خطِ جاروب برابر شدهاند.
تمامِ ۶۴زیرمجموعهٔ شش بازهٔ مثبتِ ممکن با endpointهایِ صفر تا۳ هم اجرا شدهاند. طولِ صفر، جهتِ معکوس، شناسهٔ تکراری و زمانِ بولین در چهار آزمون رد میشوند. سقفِ محلی۱۰بازه با زمانِ صحیحِ کراندار است؛ منطقهٔ زمانی، ساعتِ تابستانی، رزروِ واقعی یا benchmarkِ ظرفیت در این کد نداریم.
زمانبندیِ وزنی زیرمجموعهٔ مناسب انتخاب میکند؛ اینجا همهٔ بازهها حفظ میشوند. جلوگیری از رزروِ تکراری هم به قراردادِ عملیاتیِ جدا نیاز دارد. ادامه در مبانی هوش مصنوعی؛ محاسبهٔ این fixture وعدهٔ هماهنگیِ واقعیِ نوبتها نیست.
فایل تمرین و منبع
کد مستقلِ تمرین و کنترلها؛ Python · ورودیها و تمام خروجی واقعیِ همین تمرین؛ JSON
- مستندات رسمی PostgreSQL۱۸،بخش۸٫۱۷٫۳و۵؛ قراردادِ شامل وناشامل و بازهٔ خالی،بدونِ اجرای PostgreSQL
- پاسخِ رسمی آزمون COS226،پاییز۲۰۰۵،پرسش۵صفحه۲؛ الگوریتمِ endpointها با فرضِ مرزهای متمایز؛ tie-policyِ این تمرین اصیل است
منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.