تعیین کنید که آیا دو محدوده تاریخ همپوشانی دارند

ساخت وبلاگ

با توجه به دو محدوده تاریخ ، ساده ترین یا کارآمدترین روش برای تعیین اینکه آیا دو محدوده با هم همپوشانی دارند چیست؟

به عنوان نمونه ، فرض کنید ما دامنه هایی را که توسط متغیرهای DateTime StartDate1 به Enddate1 و StartDate2 به EndDate2 مشخص شده ایم ، نشان داده ایم.

Charlesbretana با تشکر از آن ، حق با شماست - این تقریباً شبیه یک نسخه دو بعدی از سوال من است!

وضعیت "دو محدوده تاریخ" را به موارد تقسیم کنید (دو مورد وجود دارد) و سپس برای هر مورد آزمایش کنید.

سلام .. الف: startdate1 ، b: enddate1 ، c: startdate2 ، d: enddate2. اگر بد سپس فرض می کنیم که آنها از هم تلاقی ندارند.د) "این همیشه به ما می دهد که آیا از آن عبور می کند یا نه.

39 پاسخ 39

(starta = startB)

اثبات: اجازه دهید شرط به این معنی باشد که Daterange A کاملاً پس از daterange b

(True if StartA>endb)

بگذارید شرط به این معنی باشد که daterange a قبل از daterange b کاملاً است

سپس همپوشانی وجود دارد اگر نه A و نه B درست باشد - (اگر یک محدوده کاملاً پس از دیگری باشد و نه کاملاً قبل از دیگری ، پس باید همپوشانی داشته باشند.)

اکنون یکی از قوانین د مورگان می گوید:

نه (A یا B) نه A و نه B

که ترجمه می شود: (starta = startB)

NOTE: This includes conditions where the edges overlap exactly. If you wish to exclude that, change the>= operators to>وت

Note2با تشکر از baodad ، به این وبلاگ مراجعه کنید ، همپوشانی واقعی حداقل از:

نکته 3. با تشکر از tomosius ، نسخه کوتاه تر می خواند: daterAngesOverlap = max (start1 ، start2)

If start and end dates can be out of order, i.e., if it is possible that startA> endA or startB>Endb ، سپس شما همچنین باید بررسی کنید که آنها در نظم هستند ، به این معنی که شما باید دو قانون اعتبار اضافی اضافه کنید: (starta (starta (starta (max (starta "، starta))

But to implement Min() and Max() , you have to code, (using C teary for terseness),: ((StartA>startb)؟starta: startB)

این یک منطق ساده مبتنی بر این دو فرض است: 1) Starta

devy ، شما درست هستید. به جز اینکه اگر Starta = Enda نیز کار کند. در واقع ، این دقیقاً همان چیزی است که کلمات شروع و پایان می یابد. اگر دو متغیر به نام های بالا و پایین ، یا شرق و غرب ، یا HighValue و Lovalue دارید ، می توان فرض کرد که چیزی یا شخصی ، در جایی باید اطمینان حاصل شود که یکی از جفت مقادیر در متغیرهای مخالف ذخیره نمی شود. فقط یکی از دو جفت است زیرا ، خوب ، اگر هر دو جفت مقادیر تغییر کنند نیز کار خواهد کرد.

شما به راحتی می توانید شروع و پایان قابل تهی را اضافه کنید (با معنایی که "شروع تهی" = "از ابتدای زمان" و "پایان تهی" = "تا پایان زمان") مانند آن: (starta === null|| endb === null || starta<= endB) && (endA === null || startB === null || endA>= startB)

من معتقدم که کافی است بگوییم که این دو محدوده در صورتی همپوشانی دارند:

من (startdate1) را پیدا کردم<= EndDate2) and (EndDate1>= startDate2) نماد آسانتر برای درک ، Range1 همیشه در آزمون ها در سمت چپ است.

این فرض می کند که تاریخ های شروع و پایان فراگیر هستند. تغییر دادن

این بسیار خوب کار خواهد کرد حتی اگر StartDate2 قبل از StartDate1 باشد. بنابراین نیازی به فرض نیست که StartDate1 زودتر از StartDate2 است.

من پیدا کردم (startdate1

چگونه می توان به گونه ای سازگار شد که با داده هایی که دارای startdate1 و/یا enddate1 است ، کار کند؟کد فرض می کند که StartDate1 و EndDate1 همیشه وجود دارند. چه می شود اگر StartDate1 داده شود اما هیچ EndDate1 یا EndDate1 داده نشده اما StartDate1 داده نشده است. چگونه این مورد اضافی را کنترل کنیم؟

این کتابخانه دوره زمانی مقاله برای . NET رابطه دو دوره زمانی را با دوره بندی شمارش شرح می دهد:

enter image description here

خوب ، من جبر Allens Interval Allens را در جاوا نیز اجرا کرده ام ، به API IntervalRelation و Isointerval مراجعه کنید

برای استدلال در مورد روابط زمانی (یا هرگونه روابط فواصل دیگر ، به آن برسید) ، جبر فاصله آلن را در نظر بگیرید. این 13 رابطه احتمالی را که دو فاصله می توانند با توجه به یکدیگر داشته باشند ، توصیف می کند. شما می توانید منابع دیگری را پیدا کنید - به نظر می رسد "فاصله آلن" یک اصطلاح جستجوی عملیاتی است. همچنین می توانید اطلاعات مربوط به این عملیات را در برنامه های توسعه یافته Snodgrass در SQL (PDF موجود به صورت آنلاین در URL) پیدا کنید ، و در تاریخ ، داده های زمانی داروین و لورنتزوس و مدل رابطه (2002) یا نظریه زمان و رابطه: پایگاه داده های زمانی و رابطه ایمدل رابطه ای و SQL (2014 ؛ به طور مؤثر نسخه دوم TD & RM).

پاسخ کوتاه (ish) این است: با توجه به دو فواصل تاریخ A و B با اجزای . Start و . end و محدودیت . start

شما فقط می توانید 13 نفر دریافت کنید اگر همه چیز را خنده دار حساب کنید. من می توانم "15 رابطه ممکن را که دو فواصل می توانند داشته باشند" بدست آورم که وقتی با آن دیوانه می شوم. با شمارش معقول ، من فقط شش نفر می گیرم ، و اگر شما مراقبت می کنید که آیا A یا B اول می آید ، من فقط سه مورد دریافت می کنم (بدون تقاطع ، جزئی از هم تلاقی ، یکی کاملاً در داخل دیگر). 15 مانند این پیش می رود: [قبل: قبل ، شروع ، درون ، پایان ، بعد از] ، [شروع ، در داخل ، پایان ، بعد از] ، [در داخل ، پایان ، بعد از] ، [پایان: پایان ، بعد از] ، [بعد از: بعد از]

من فکر می کنم که شما نمی توانید دو ورودی را "قبل" و "بعد از آن: بعد" حساب کنید. اگر برخی از روابط را با معکوس های آنها برابر کنید ، می توانم 7 مدخل را ببینم (به نمودار موجود در URL ویکی پدیا مراجعه کنید ؛ این 7 مدخل دارد که 6 مورد از آنها معکوس متفاوتی دارد ، با این که برابر با معکوس مشخص نیست). و اینکه آیا سه معقول است به نیازهای شما بستگی دارد.

شما فقط می توانید 13 نفر دریافت کنید اگر همه چیز را خنده دار حساب کنید. من می توانم "15 رابطه ممکن را که دو فواصل می توانند داشته باشند" بدست آورم که وقتی با آن دیوانه می شوم. با شمارش معقول ، من فقط شش نفر می گیرم ، و اگر شما مراقبت می کنید که آیا A یا B اول می آید ، من فقط سه مورد دریافت می کنم (بدون تقاطع ، جزئی از هم تلاقی ، یکی کاملاً در داخل دیگر). 15 مانند این پیش می رود: [قبل: قبل ، شروع ، درون ، پایان ، بعد از] ، [شروع ، در داخل ، پایان ، بعد از] ، [در داخل ، پایان ، بعد از] ، [پایان: پایان ، بعد از] ، [بعد از: بعد از]

به روزرسانی خود را دوباره: B1 به A قبل: قبل و B13 به A بعد از آن: بعد. نمودار خوب شما از دست رفته است: شروع بین B5 B6 و پایان: پایان بین B11 و B12. اگر در یک نقطه پایانی قابل توجه است ، پس باید آن را حساب کنید ، بنابراین قسمت نهایی 15 است ، نه 13. من فکر نمی کنم چیز پایانی قابل توجه باشد ، بنابراین من شخصاً آن را حساب می کنم [قبل: قبل ، درون ، بعد از آن]، [در درون ، بعد از] ، [پس از: بعد از] که به 6 رسیدم. انحصار نقاط پایانی روابط اصلی را تغییر نمی دهد!

یعنی در طرح من این معادل است: (B2 ، B3 ، B4) ، (B6 ، B7 ، B9 ، B10) ، (B8 ، B11 ، B12). من می دانم که B7 به معنای اطلاعاتی است که این دو محدوده دقیقاً همزمان هستند. اما من اطمینان ندارم که این اطلاعات اضافی باید بخشی از روابط تقاطع پایه باشد. به عنوان مثال ، هنگامی که دو فواصل دقیقاً یکسان هستند حتی اگر همزمان نباشند یا حتی با هم همپوشانی نداشته باشند ، آیا باید این "رابطه" دیگری تلقی شود؟من می گویم نه ، و دیدن این جنبه اضافی تنها چیزی است که B7 را از B6 متمایز می کند ، بنابراین فکر می کنم داشتن نقاط پایانی- به عنوان موارد جداگانه باعث می شود همه چیز متناقض باشد.

emtucifor: خوب - می بینم که چرا "قبل" و "بعد از آن" را به عنوان ورودی ها اشتباه کردم. با این حال ، من نمی توانم تصور کنم که "شروع: شروع" و "پایان: پایان" باید به نظر برسد. از آنجا که شما نمی توانید نمودار من را ویرایش کنید ، آیا می توانید با یک کپی اصلاح شده از نمودار که روابط "شروع: شروع" و "پایان: پایان" را به من ارسال کنید (به نمایه من مراجعه کنید)؟من با گروه بندی های شما مشکل اساسی ندارم.

اگر همپوشانی خود نیز باید محاسبه شود ، می توانید از فرمول زیر استفاده کنید:

بنابراین همپوشانی مقدار زمانی است که این دو رویداد به اشتراک می گذارند؟آیا این کار برای همه روشهای مختلف رویدادها می تواند با هم همپوشانی داشته باشد؟

تمام راه حل هایی که بسیاری از شرایط را بر اساس جایی که دامنه ها در رابطه با یکدیگر هستند ، بررسی می کنند ، با اطمینان از اینکه یک محدوده قبل یا همزمان با دیگری شروع می شود ، می توانند تا حد زیادی ساده شوند. در صورت لزوم می توانید این کار را با تعویض دامنه ها انجام دهید.

سپس ، اگر شروع دامنه دوم این باشد ، می توانید همپوشانی را تشخیص دهید:

  • کمتر از یا مساوی با انتهای دامنه اول (اگر دامنه ها فراگیر باشد ، حاوی زمان شروع و پایان). یا
  • کمتر از (اگر دامنه شامل شروع و منحصر به فرد از پایان باشد).

For example (assuming inclusive at both ends), there's only four possibilities for range 2, of which one is a non-overlap (the>در پایان دامنه به این معنی است که مهم نیست که دامنه به پایان برسد):

نقطه پایانی دامنه دوم به هیچ وجه بر نتیجه تأثیر نمی گذارد. بنابراین ، در شبه کد ، شما می توانید کاری مانند (با فرض S

یا گزینه بازگشتی یک سطح محدود:

اگر دامنه ها در پایان منحصر به فرد هستند ، فقط باید جایگزین کنید

این امر تعداد چک هایی را که باید انجام دهید بسیار محدود می کند زیرا با اطمینان از اینکه محدوده اول هرگز بعد از دوم شروع نمی شود ، نیمی از فضای مشکل را حذف می کنید.

و از آنجا که "مذاکره کد" ، در اینجا برخی از کد های پایتون وجود دارد که این کار را در عمل نشان می دهد ، و موارد آزمایشی کاملاً کمی وجود دارد. اول ، کلاس ENSEVIVERANGE:

سپس یک کنترل کننده مورد آزمایش به ما اجازه می دهد تا نتیجه یک مورد آزمایشی را به خوبی ارائه دهیم:

سرانجام ، یک بخش مناسب از موارد آزمایشی که در صورت لزوم می توانید خود را اضافه کنید:

در حال اجرا که خروجی را تولید می کند:

جایی که هر خط دارد:

  • دو دامنه مورد ارزیابی قرار می گیرند.
  • نمایش گرافیکی از "فضای محدوده" (از پایین ترین شروع به بالاترین انتها) که در آن هر کاراکتر یک مقدار در آن "فضای محدوده" است:
    • "مقدار فقط در محدوده اول را نشان می دهد.
    • ، مقدار فقط در محدوده دوم را نشان می دهد.
    • |مقدار در هر دو محدوده را نشان می دهد. وت
    • مقدار در هیچ محدوده ای را نشان نمی دهد.

    کاملاً واضح می بینید که وقتی حداقل یک مقدار در هر دو محدوده وجود دارد (به عنوان مثال ، یک شخصیت |) فقط در بررسی همپوشانی درست می شوید. هر مورد دیگر نادرست است.

استراتژی‌های اسکالپ...
ما را در سایت استراتژی‌های اسکالپ دنبال می کنید

برچسب : نویسنده : ناصر تقوایی بازدید : <-PostHit-> تاريخ : پنجشنبه 8 تير 1402 ساعت: 21:38