第VIII章(C)スライディングウィンドウ

実際には、スライディングウィンドウは、アレイのいくつかの非常に良い使用するため、同じキューに似ている区間

 

スライディングウィンドウ

配列は同じ要素ではないように、長くできるだけ配列を見つけるために、長さnのシーケンスを入力

思考:[R]が発生し、添え字の最後に出現する位置の値[L、R]の範囲にある場合各々は、A [R]、引張インデックスマップ記録要素とウィンドウ表示されてくる、決定されます次に、更新の長さ、及び更新Lは、[R]がある場合、現在のシーケンス[L、R-1] +1添字値最後に現れ、その後、サブインターバルシーケンスは[L、R]です。[R]は、そこマップに[R]に、されて、更新した場合は[Lは、R]このセクションは、新しい配列です。

1  / ** 
2       *入力長の配列N、シーケンスは同じ要素ではないように、可能な限りのような配列を見つける
 。3       * / 
4      パブリック 静的 ボイド getMin(INT [] A){
 5          int型の L = 0 、0 = MAXL、MAXR = 0 ;
 6          のHashMap <整数、整数>マップ= 新しい新規のHashMap <整数、整数> ();
 7          のためのINT R&LT = 0; R&LT <a.length; R&LT ++ ){
 8。             IF(地図。 GET(A [R&LT])== NULL || map.getとして(A [R&LT])< L){
 9。                 map.put(A [R&LT]、R&LT)
 10                  IF(RL> MAXR-MAXL){ //[L、R&LT] 
11。                      MAXR = R&LT; MAXL = L;
 12である                 }
 13である              }  { // 同じ遭遇[L、R-1] - > [ 最後に出現する位置1 +、R&LT] 
14                  IF( 1-RL> maxR- MAXL){
 15                      MAXR = 1-R&LT; MAXL = L;
 16                  }
 17。                  L map.get =(A [R&LT])+ 1として。18である             }
 19          }
 20である          のSystem.out.println(「L : "+ MAXL +" R&LT: "+ + MAXR"長さ:「+(。+ MAXR-MAXL 1 ));
 21である     }
 22は、     パブリック 静的 ボイドメイン(文字列[]引数){
 23          のint [] A = {3,4,5,1,2,4,5,3,6 }。
24          getMin(A)。
25      }

 

+ウィンドウのデータ構造をスライディング

ウィンドウの最小化問題をスライディング:正の整数であり、kを入力するn個の系列長の整数であり、F(i)はiは連続要素はO-(NK)を計算し、要素を起動kの最小値から最小値を示すの

アイデア:スライディングウィンドウのデータ構造+は、それぞれの新しい要素は、彼が前の要素のいくつかよりも小さい場合には、これらの要素は、もはや最小可能で来ません。最小出力は最小限であると思われるので、彼もそう、なぜなら短い間隔で、最大のインサートである場合。単調なキューは、その後、最小値は常に最初のチームで、重要な問題は、最小を知っている方法です、彼らので、次の2つのエッジのこの最小間隔に達した場合は、チームのヘッドを更新する際にある位置が、想像していることをこのゾーンであります我々は複数回挿入するように注意を払う必要があるときに、繰り返し範囲内の最小値を挿入した場合ので、それは同じであるべきであり、この時間は、チームが最初に移動する必要があります。

 1 /**
 2      * 滑动窗口的最小值问题:输入正整数k和一个长度为n的整数序列
 3      * f(i)表示从元素i开始连续k个元素的最小值,计算出0-(n-k)
 4      * 单调队列来实现
 5      */
 6     public static void getMin(int[] a,int k) {
 7         int[]s=new int[10];
 8         int rear=0;
 9         for(int i=0;i<k;i++) {
10             while(rear>0&&a[i]<s[rear-1]) {
11                 rear--;
12             }
13             s[rear++]=a[i];
14         }
15         int front=0;
16         for(int i=0;i<a.length-k;i++) {
17             System.out.println("f("+i+")="+s[front]);
18             if(s[front]==a[i]) {
19                 front++;
20             }
21             while(rear>front&&a[k+i]<s[rear-1]) {
22                 rear--;
23             }
24             s[rear++]=a[k+i];
25         }
26         System.out.println("f("+(a.length-k)+")="+s[front++]);
27     }
28     public static void main(String[] args) {
29         int[]a= {6,7,8,9,1,2,3};
30         getMin(a,3);
31     }

 

おすすめ

転載: www.cnblogs.com/code-fun/p/12596186.html