SlideShare a Scribd company logo
1 of 48
Download to read offline
PFDS 7.4
Bottom-Up Mergesort
    with Sharing

                @rf0444
Bottom-Up Mergesort


2 7   1 3 4 8
Bottom-Up Mergesort

                sort
2 7   1 3 4 8          1 2 3 4 7 8
Bottom-Up Mergesort

                sort
2 7   1 3 4 8          1 2 3 4 7 8


                O(n)
Bottom-Up Mergesort

                     sort
    2 7    1 3 4 8          1 2 3 4 7 8

     add

5   2 7    1 3 4 8
Bottom-Up Mergesort

                     sort
    2 7    1 3 4 8            1 2 3 4 7 8

     add
                       O(1)
5   2 7    1 3 4 8
Bottom-Up Mergesort

                     sort
    2 7    1 3 4 8            1 2 3 4 7 8

     add             sort
5   2 7    1 3 4 8          1 2 3 4 5 7 8
Bottom-Up Mergesort

                     sort
    2 7    1 3 4 8            1 2 3 4 7 8

     add             sort
5   2 7    1 3 4 8          1 2 3 4 5 7 8


                     O(n)
Bottom-Up Mergesort

    5   2 7   1 3 4 8


   add 6
                        O(n)

    1 2 3 4 5 6 7 8
Bottom-Up Mergesort

         add      sort


  最悪    O(n)      O(n)



 ならし   O(log n)   O(n)
Bottom-Up Mergesort

add すると、たまに大きな merge が走る

  そのとき O(n)



merge を incremental にして、

少しずつ merge するようにしよう!
データ構造

segment 毎に schedule を用意



schedule にはまだ計算していない merge

部分を持っておく
データ構造


add の度に 各 segment の

 先頭 schedule から 2 つ取り除く

 先頭 schedule が nil なら 次の schedule へ
動作


segment




schedule
add 1回目 exec前


segment    5 




schedule
add 1回目 exec後


segment    5 




schedule
add 2回目 exec前


segment

              m 3   
                  5

schedule
add 2回目 exec後


segment

              3 5 

schedule
add 2回目 exec後


segment    3 5 




schedule    
add 3回目 exec前


segment    7    3 5 




schedule         
add 3回目 exec後


segment    7    3 5 




schedule
add 4回目 exec前

segment    m              3 5 

               m 4  7  

schedule
add 4回目 exec後

segment    m          3 5 

               4 7 

schedule
add 4回目 exec後

segment



               m 4 7 3 5 



schedule    
add 5回目 exec前

segment    6 



                    m 4 7 3 5 



schedule         
add 5回目 exec後

segment    6 



                3 4 m 7  5  



schedule
add 6回目 exec前

segment



           m 2   
               6    3 4 m 7  5  



schedule
add 6回目 exec中

segment



           2 6    3 4 m 7  5  



schedule
add 6回目 exec中

segment



           2 6    3 4 5 7 



schedule
add 6回目 exec後

segment    2 6    3 4 5 7 




schedule           
add 7回目 exec前

segment    8    2 6  3 4 5 7 




schedule              
add 7回目 exec後

segment    8    2 6  3 4 5 7 




schedule
add 8回目 exec前

segment



    m      3 4 5 7 
                      m     2 6 

                          m 1  8  
schedule
add 8回目 exec後

segment



    m      3 4 5 7 
                      m    2 6 

                          1 8 
schedule
add 8回目 exec後

segment



    m      3 4 5 7 
                      m 1 8  2 6  


schedule    
add 9回目 exec前

segment    9 


                m   3 4 5 7 

                      m 1 8  2 6  


schedule         
add 9回目 exec後

segment    9 


                m   3 4 5 7 

                     1 2 m 8  6  


schedule
計算量

1 回の add で merge 部分は、

最大で log n 個作られる

 1個作るのにかかるのは O(1)

 全部で O(log n)
計算量

1 回の add での exec によって、merge は

セグメントそれぞれ最大2つずつ進む



サイズ n への add の merge 部分の計算は、

最大で 2 * log2 n → O(log n)
            ↑ セグメントの数 (最大)
計算量


sort

  schedule に残っている merge を消化

  セグメントを merge ← O(n)
計算量
n   schedule 内の要素数

0         0

1         0

2         0

3         0

4         4

5         2

6         0

7         0

8         12

9         10
計算量
Lemma 7.2

       サイズ n の sortable が持っている、

       サイズ m のセグメントの持つ要素数は、

       多くとも

       2 m - 2 (n mod m + 1)
計算量

サイズ n の sortable が持っている、

セグメント内の要素数は、多くとも



                       i
2n - 2 i Σ0 b i (n mod 2 - 1)
         =
potential


                              i
ψ(n) = 2n - 2 i Σ0 b i (n mod 2 - 1)
                =


0 ≦ ψ(n) ≦ 2n
potential
                    b の項

n    2n        0    1      2    3        ψ(n)
0    0    +                          =    0
1    2    +    -2                    =    0
2    4    +         -2               =    2
3    6    +    -2   -4               =    0
4    8    +                -2        =    6
5    10   +    -2          -4        =    4
6    12   +         -2     -6        =    4
7    14   +    -2   -4     -8        =    0
8    16   +                     -2   =   14
9    18   +    -2               -4   =    12
10   20   +         -2          -6   =    12
比較
n   schedule 内の要素数       ψ(n)       2n

0         0               0         0

1         0               0         2

2         0               2         4

3         0               0         6

4         4          ≦    6     ≦   8

5         2               4         10

6         0               4         12

7         0               0         14

8         12             14         16

9         10              12        18
計算量

sort

  schedule に残っている merge を消化

  ↑ O(n)

  セグメントを merge ← O(n)
計算量

         add       sort


        O(n)
最悪                 O(n)
      → O(log n)


ならし    O(log n)    O(n)

More Related Content

More from rf0444

Start FRP
Start FRPStart FRP
Start FRPrf0444
 
PFDS 11.2.2
PFDS 11.2.2PFDS 11.2.2
PFDS 11.2.2rf0444
 
PFDS 10.1.2
PFDS 10.1.2PFDS 10.1.2
PFDS 10.1.2rf0444
 
PFDS 9.3.2
PFDS 9.3.2PFDS 9.3.2
PFDS 9.3.2rf0444
 
PFDS 9.3.1
PFDS 9.3.1PFDS 9.3.1
PFDS 9.3.1rf0444
 
PFDS 8.4.1
PFDS 8.4.1PFDS 8.4.1
PFDS 8.4.1rf0444
 
Tapl 5
Tapl 5Tapl 5
Tapl 5rf0444
 
Haskellday rf
Haskellday rfHaskellday rf
Haskellday rfrf0444
 
PFDS 6.4.3
PFDS 6.4.3PFDS 6.4.3
PFDS 6.4.3rf0444
 

More from rf0444 (9)

Start FRP
Start FRPStart FRP
Start FRP
 
PFDS 11.2.2
PFDS 11.2.2PFDS 11.2.2
PFDS 11.2.2
 
PFDS 10.1.2
PFDS 10.1.2PFDS 10.1.2
PFDS 10.1.2
 
PFDS 9.3.2
PFDS 9.3.2PFDS 9.3.2
PFDS 9.3.2
 
PFDS 9.3.1
PFDS 9.3.1PFDS 9.3.1
PFDS 9.3.1
 
PFDS 8.4.1
PFDS 8.4.1PFDS 8.4.1
PFDS 8.4.1
 
Tapl 5
Tapl 5Tapl 5
Tapl 5
 
Haskellday rf
Haskellday rfHaskellday rf
Haskellday rf
 
PFDS 6.4.3
PFDS 6.4.3PFDS 6.4.3
PFDS 6.4.3
 

PFDS 7.4