Slide 1

Slide 1 text

2022.06.22
 potatotips #78
 tokizo / @tokizuoh 累積和で処理効率を改善しよう 配列の

Slide 2

Slide 2 text

コードはSwiftPM経由で利用可能! https://github.com/tokizuoh/swift-prefix-sum

Slide 3

Slide 3 text

tokizo / @tokizuoh ・ トキゾー
 ・ 株式会社はてな ・ HealthKitはイイゾー!
  ・ https://github.com/tokizuoh/contrail

Slide 4

Slide 4 text

こんなときどうしますか?

Slide 5

Slide 5 text

問題設定 ・ ランニングアプリ
 ・ 日ごとの距離を管理 ・ A日からB日までの合計距離が知りたい 11 km 5 km 0 km 0 km 7 km 0 km 10 km 15 km 1 km 4 km 0 km 2 km 1 km 7 km 11 km 13 km 0 km 3 km 0 km 0 km 1 km 4 km 2 km 6 km 3 km 5 km 4 km 2 km 2 km 12 km 0 km 2 km 1 km 0 km 2 km 0 km https://www.irasutoya.com/2019/12/blog-post_26.html

Slide 6

Slide 6 text

問題設定 ・ ランニングアプリ
 ・ 日ごとの距離を管理 ・ A日からB日までの合計距離が知りたい 11 km 5 km 0 km 0 km 7 km 0 km 10 km 15 km 1 km 4 km 0 km 2 km 1 km 7 km 11 km 13 km 0 km 3 km 0 km 0 km 1 km 4 km 2 km 6 km 3 km 5 km 4 km 2 km 2 km 12 km 0 km 2 km 1 km 0 km 2 km 0 km https://www.irasutoya.com/2019/12/blog-post_26.html

Slide 7

Slide 7 text

問題設定 ・ ランニングアプリ
 ・ 日ごとの距離を管理 ・ A日からB日までの合計距離が知りたい 11 km 5 km 0 km 0 km 7 km 0 km 10 km 15 km 1 km 4 km 0 km 2 km 1 km 7 km 11 km 13 km 0 km 3 km 0 km 0 km 1 km 4 km 2 km 6 km 3 km 5 km 4 km 2 km 2 km 12 km 15 km 0 km 2 km 1 km 0 km 2 km 0 km https://www.irasutoya.com/2019/12/blog-post_26.html

Slide 8

Slide 8 text

問題設定 ・ ランニングアプリ
 ・ 日ごとの距離を管理 ・ A日からB日までの合計距離が知りたい 11 km 5 km 0 km 0 km 7 km 0 km 10 km 15 km 1 km 4 km 0 km 2 km 1 km 7 km 11 km 13 km 0 km 3 km 0 km 0 km 1 km 4 km 2 km 6 km 3 km 5 km 4 km 2 km 2 km 12 km 15 km = 12 + 0 + 2 + 1 0 km 2 km 1 km 0 km 2 km 0 km https://www.irasutoya.com/2019/12/blog-post_26.html

Slide 9

Slide 9 text

問題設定 ・ ランニングアプリ
 ・ 日ごとの距離を管理 ・ A日からB日までの合計距離が知りたい 11 km 5 km 0 km 0 km 7 km 0 km 10 km 15 km 1 km 4 km 0 km 2 km 1 km 7 km 11 km 13 km 0 km 3 km 0 km 0 km 1 km 4 km 2 km 6 km 3 km 5 km 4 km 2 km 2 km 12 km 15 km = 12 + 0 + 2 + 1 0 km 2 km 1 km 0 km 2 km 0 km https://www.irasutoya.com/2019/12/blog-post_26.html

Slide 10

Slide 10 text

問題設定 ・ ランニングアプリ
 ・ 日ごとの距離を管理 ・ A日からB日までの合計距離が知りたい 11 km 5 km 0 km 0 km 7 km 0 km 10 km 15 km 1 km 4 km 0 km 2 km 1 km 7 km 11 km 13 km 0 km 3 km 0 km 0 km 1 km 4 km 2 km 6 km 3 km 5 km 4 km 2 km 2 km 12 km 15 km = 12 + 0 + 2 + 1 0 km 2 km 1 km 0 km 2 km 0 km https://www.irasutoya.com/2019/12/blog-post_26.html 効率化したい!

Slide 11

Slide 11 text

累積和を使って効率化

Slide 12

Slide 12 text

累積和とは 適切な前処理をしておくことで、配列上の区間 の総和を求めるクエリを爆速で処理できるよう になる手法 累積和を何も考えずに書けるようにする! - Qiita
 https://qiita.com/drken/items/56a6b68edef8fc605821

Slide 13

Slide 13 text

累積和とは 適切な前処理をしておくことで、配列上の区間 の総和を求めるクエリを爆速で処理できるよう になる手法 累積和を何も考えずに書けるようにする! - Qiita
 https://qiita.com/drken/items/56a6b68edef8fc605821

Slide 14

Slide 14 text

・ 前処理
 ・ クエリ
 ・ 処理 累積和 3ステップ

Slide 15

Slide 15 text

累積和 / 前処理 3 4 5 6 2 7 1

Slide 16

Slide 16 text

累積和 / 前処理 3 4 5 6 2 7 1 0 0 0 0 0 0 0 0 New !

Slide 17

Slide 17 text

累積和 / 前処理 3 4 5 6 2 7 1 1 0 0 0 0 0 0 0

Slide 18

Slide 18 text

累積和 / 前処理 3 4 5 6 2 7 1 1 0 0 0 0 0 0 8

Slide 19

Slide 19 text

累積和 / 前処理 3 4 5 6 2 7 1 1 8 0 10 16 21 25 28

Slide 20

Slide 20 text

累積和 / クエリ 3 5 4 6 2 7 1 1 8 0 10 16 21 25 28 ↓この区間の総和を求めたい! (= 17)

Slide 21

Slide 21 text

累積和 / 処理 3 5 4 6 2 7 1 1 8 0 10 16 21 25 28 ↓この区間の総和を求めたい! (= 17) 25 - 8 = 17

Slide 22

Slide 22 text

Swiftで実装して
 処理速度を比較してみた

Slide 23

Slide 23 text

Swiftで愚直な手法と累積和を比較 https://github.com/tokizuoh/swift-prefix-sum/blob/develop/Tests/SwiftPrefixSumTests/PrefixSumArrayTests.swift ⇒ 愚直な手法と比べて約23倍速い (…そもそも0.07秒なので効率化しなくても問題なさそう) 配列長10000, 100個のクエリの条件でテスト

Slide 24

Slide 24 text

Thank you !