GoDasturchi
Sliding Window Counter

Sliding Window Counter

Sirg'anuvchi oyna hisoblagichi

Token bucket ajoyib, lekin bitta cheklovi bor: u "oxirgi soniyada nechta so'rov bo'ldi" degan aniq savolga javob bermaydi — faqat "hozir token bormi"ni biladi. Sirg'anuvchi oyna (sliding window) algoritmi boshqacha yondashadi: har bir so'rovning vaqt belgisini (timestamp) saqlaydi va faqat oxirgi N soniyadagilarni sanaydi.

example.go
func SlidingWindowAllow(timestamps []int64, now int64, windowSeconds int64, limit int) (bool, []int64) {
    fresh := []int64{}
    for _, t := range timestamps {
        if now-t < windowSeconds {
            fresh = append(fresh, t)
        }
    }
    if len(fresh) >= limit {
        return false, fresh
    }
    fresh = append(fresh, now)
    return true, fresh
}

Bu — Cycle Detection darsidagi "eski holatni filtrlash" g'oyasiga o'xshaydi: avval timestampsdan faqat oynaga (windowSeconds) mos keladiganlarini saqlab qolasiz (fresh), so'ngra shu tozalangan ro'yxat asosida qaror qabul qilasiz. now va vaqt belgilari time.Now() o'rniga oddiy int64 sifatida uzatiladi — bu Time-Based Refill darsidagidek, funksiyani sinash oson va bashorat qilinadigan qiladi.

>_ Exercise

SlidingWindowAllow(timestamps []int64, now int64, windowSeconds int64, limit int) (bool, []int64) funksiyasini yozing. Avval timestampsdan faqat now-t < windowSeconds shartiga mos keladiganlarni yangi slice'ga (fresh) yig'ing. Agar freshda allaqachon limit yoki undan ko'p vaqt belgisi bo'lsa, false va freshni qaytaring. Aks holda nowni freshga qo'shib, true va yangilangan freshni qaytaring.

Stuck? Reveal a hint to help you.

Hints (0/4)

Key Takeaway

Key Takeaway:

Sirg'anuvchi oyna algoritmi har bir so'rovning aniq vaqtini saqlab, doim "oxirgi N soniyada nechta so'rov bo'ldi" degan savolga aniq javob beradi. Token bucketga qaraganda ko'proq xotira talab qiladi, lekin chegara atrofidagi xatti-harakati aniqroq va bashorat qilinadigan.

NEXT UP

Cleaning Up Idle Limiters

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Sliding Window Counter

Sirg'anuvchi oyna hisoblagichi

Token bucket ajoyib, lekin bitta cheklovi bor: u "oxirgi soniyada nechta so'rov bo'ldi" degan aniq savolga javob bermaydi — faqat "hozir token bormi"ni biladi. Sirg'anuvchi oyna (sliding window) algoritmi boshqacha yondashadi: har bir so'rovning vaqt belgisini (timestamp) saqlaydi va faqat oxirgi N soniyadagilarni sanaydi.

example.go
func SlidingWindowAllow(timestamps []int64, now int64, windowSeconds int64, limit int) (bool, []int64) {
    fresh := []int64{}
    for _, t := range timestamps {
        if now-t < windowSeconds {
            fresh = append(fresh, t)
        }
    }
    if len(fresh) >= limit {
        return false, fresh
    }
    fresh = append(fresh, now)
    return true, fresh
}

Bu — Cycle Detection darsidagi "eski holatni filtrlash" g'oyasiga o'xshaydi: avval timestampsdan faqat oynaga (windowSeconds) mos keladiganlarini saqlab qolasiz (fresh), so'ngra shu tozalangan ro'yxat asosida qaror qabul qilasiz. now va vaqt belgilari time.Now() o'rniga oddiy int64 sifatida uzatiladi — bu Time-Based Refill darsidagidek, funksiyani sinash oson va bashorat qilinadigan qiladi.

>_ Exercise

SlidingWindowAllow(timestamps []int64, now int64, windowSeconds int64, limit int) (bool, []int64) funksiyasini yozing. Avval timestampsdan faqat now-t < windowSeconds shartiga mos keladiganlarni yangi slice'ga (fresh) yig'ing. Agar freshda allaqachon limit yoki undan ko'p vaqt belgisi bo'lsa, false va freshni qaytaring. Aks holda nowni freshga qo'shib, true va yangilangan freshni qaytaring.

Stuck? Reveal a hint to help you.

Hints (0/4)

Key Takeaway

Key Takeaway:

Sirg'anuvchi oyna algoritmi har bir so'rovning aniq vaqtini saqlab, doim "oxirgi N soniyada nechta so'rov bo'ldi" degan savolga aniq javob beradi. Token bucketga qaraganda ko'proq xotira talab qiladi, lekin chegara atrofidagi xatti-harakati aniqroq va bashorat qilinadigan.

NEXT UP

Cleaning Up Idle Limiters