Sliding window min/max - Dynamic Programming - Algorithms and Problem SolvingAlgorithms and Problem Solving



Sliding window min/max - Dynamic Programming - Algorithms and Problem SolvingAlgorithms and Problem Solving

Given an array of integer A[] and the size of sliding window w. Assume that the window of size w starting from left keeps sliding by moving the window one element to right each time. Find the stream of sliding minimums in optimal way. A sliding minimum is the minimum element of current window.

Let's start with an example for our convenience.

             sliding window                Min         Max              ---------------               -----       -----              [1  2  -1] -3  4  2  5  3       -1          2               1 [2  -1  -3] 4  2  5  3       -3          2               1  2 [-1  -3  4] 2  6  3       -3          4               1  2  -1 [-3  4  2] 5  3       -3          4               1  2  -1  -3 [4  2  5] 3        2          5               1  2  -1  -3  4 [2  5  3]       2          5  

First, let us concentrate on finding sliding min. An O(n*w) bruteforce solution would be to do go through each of the element of the array and find minimum of w elements from the current position to the right. There could be another solution using heap for maintaning the min of sliding window. This is of O(nlgw) time and O(lgw) space complexity. But we can do far better in O(n) using a DP approach.

Observe that element at position i can be shared across sliding windows starting at most w positions to left of i including i. So,  the sliding minimum at a position is the minimum of  a block of w elements from current position to the right and the minimum of a block of w elements from current element to the left.

So, we can  divide the array into [n/w] blocks. Then we can find min in left while traversing from left to right of the current window. But what about min in right? the trick is that we can traverse backwards to get the right min at a position. Also note that: windows separated by elements >=w will have no overlapping. So, left min/right min should be reset at the boundary of each block of w elements in the direction of traversal.

For Example: A = [2,1,3,4,6,3,8,9,10,12,56],  w=4

  1. partition the array in blocks of size w=4. The last block may have less then w.
    2, 1, 3, 4 | 6, 3, 8, 9 | 10, 12, 56|
  2. Traverse the list from start to end and calculate min_so_far. Reset min to 0 after each block (of w elements).
    left_min[] = 2, 1, 1, 1 | 6, 3, 3, 3 | 10, 10, 10
  3. Similarly calculate min_in_future by traversing from end to start.
    right_min[] = 1, 1, 3, 4 | 3, 3, 8, 9 | 10, 12, 56
  4. now, min at each position i in current window, sliding_min(i) = min {right_min[i], left_min[i+w-1]}
    sliding_min = 1, 1, 3, 3, 3, 3, 8, ….
//base cases  left_min[0] = A[0]  right_min[n - 1] = A[n - 1]    //DP  left_min[i]  = (i % w == 0) ? A[i] : min{left_min[i - 1], A[i]}, for  i = [1..(n-1)]  right_min[j] = (j % w == 0) ? A[j] : min(right_min[j + 1], A[j]), for j = [(n-1).. 0]    //Optimization  sliding_min[i] = min{right_min[i], left_min[i + w - 1]}, for i = [0..(in.length - w + 1)]  


Read full article from Sliding window min/max - Dynamic Programming - Algorithms and Problem SolvingAlgorithms and Problem Solving


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts