علی قدرتی
علی قدرتی
خواندن ۱ دقیقه·۳ سال پیش

پنجره کشویی - Sliding Window


پنجره کشویی تکنیک حل مسئله ساختار داده و الگوریتم برای مسائلی است که روی آرایه ها یا لیست ها اعمال می شوند. حل این مشکلات با استفاده از رویکرد brute force در O(n²) یا O(n3) بدون دردسر است. با این حال، تکنیک پنجره کشویی می تواند پیچیدگی زمانی را به O(n) کاهش دهد.

ایده اصلی پشت تکنیک پنجره کشویی تبدیل دو حلقه تو در تو به یک حلقه است.

در زیر چند سرنخ اساسی برای شناسایی چنین مشکلی وجود دارد:

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

فرض کنید آرایه ای به صورت زیر داریم:

پنجره ی کشویی ما با سایز 3 به صورت زیر روی این آرایه حرکت میکند.

مراحل اساسی برای حل مشکل پنجره کشویی

این تکنیکی است که می تواند در بسیاری از الگوریتم ها استفاده شود. در زیر گام های اساسی برای حل مشکلات مربوط به تکنیک پنجره کشویی آورده شده است:

  • یک HashMap یا Dictionary را برای شمارش ورودی آرایه خاص بگیرید و با استفاده از یک حلقه بیرونی، پنجره را به سمت راست افزایش دهید.
  • یکی را داخل یک حلقه بگیرید تا با حرکت به سمت راست، سمت پنجره را کاهش دهید. این حلقه بسیار کوتاه خواهد بود.
  • حداکثر یا حداقل اندازه یا تعداد پنجره فعلی را بر اساس تعداد قراردادی در مسئله ذخیره کنید.

مثالی برای برای یافتن بزرگترین مجموع پنج عنصر متوالی:

[ 5, 7, 1, 4, 3, 6, 2, 9, 2 ]


مسئله های زیادی برای استفاده از این تکنیک وجود دارد. در لینک Github میتوانید نمونه ای از این ها را ببینید.

پنجره کشوییالگوریتمc
شاید از این پست‌ها خوشتان بیاید