Advertisement
Alexxik

Untitled

Mar 19th, 2024 (edited)
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 1.92 KB | None | 0 0
  1. // Всплески пользовательской активности
  2.  
  3. // Поддерживаем окно событий за 5 минут и словарь user_id -> count .
  4. // При очередном событии выкидываем из окна все старые события и добавляем новое, попутно обновляем словарь.
  5. // Держим счётчик, который учитывает число пользователей с большими запросами
  6.  
  7.  
  8. class UserStatistics {
  9.     private var windowLen: Int
  10.     private var limit: Int
  11.     private var userCountOverLimit: Int
  12.     private var events: [(time: Int, userId: Int)]
  13.     private var userEventsCounter: [Int: Int]
  14.    
  15.     init(k: Int, limit: Int) {
  16.         windowLen = k
  17.         limit = limit
  18.         userCountOverLimit = 0
  19.         events = []
  20.         userEventsCounter = [Int: Int]()
  21.     }
  22.    
  23.     func removeOldEvents(time: Int) {
  24.         while !events.isEmpty {
  25.             let event = events.first!
  26.             if time - event.time < windowLen {
  27.                 break
  28.             }
  29.             events.removeFirst()
  30.             let count = userEventsCounter[event.userId]!
  31.             userEventsCounter[event.userId] = count - 1
  32.             if count == limit {
  33.                 userCountOverLimit -= 1
  34.             }
  35.             if userEventsCounter[event.userId] == 0 {
  36.                 userEventsCounter.removeValue(forKey: event.userId)
  37.             }
  38.         }
  39.     }
  40.    
  41.     func event(time: Int, userId: Int) {
  42.         removeOldEvents(time: time)
  43.         events.append((time: time, userId: userId))
  44.         userEventsCounter[userId, default: 0] += 1
  45.         if userEventsCounter[userId] == limit {
  46.             userCountOverLimit += 1
  47.         }
  48.     }
  49.    
  50.     func robotCount(time: Int) -> Int {
  51.         removeOldEvents(time: time)
  52.         return userCountOverLimit
  53.     }
  54. }
  55.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement