Upgrade to Pro — share decks privately, control downloads, hide ads and more …

累積和で配列の処理効率を改善しよう

E3e4dfe29f0e4b7f948dd15fec8488da?s=47 tokizo
June 22, 2022
170

 累積和で配列の処理効率を改善しよう

E3e4dfe29f0e4b7f948dd15fec8488da?s=128

tokizo

June 22, 2022
Tweet

Transcript

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

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

  3. tokizo / @tokizuoh ・ トキゾー
 ・ 株式会社はてな ・ HealthKitはイイゾー!
  ・

    https://github.com/tokizuoh/contrail
  4. こんなときどうしますか?

  5. 問題設定 ・ ランニングアプリ
 ・ 日ごとの距離を管理 ・ 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
  6. 問題設定 ・ ランニングアプリ
 ・ 日ごとの距離を管理 ・ 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
  7. 問題設定 ・ ランニングアプリ
 ・ 日ごとの距離を管理 ・ 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
  8. 問題設定 ・ ランニングアプリ
 ・ 日ごとの距離を管理 ・ 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
  9. 問題設定 ・ ランニングアプリ
 ・ 日ごとの距離を管理 ・ 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
  10. 問題設定 ・ ランニングアプリ
 ・ 日ごとの距離を管理 ・ 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 効率化したい!
  11. 累積和を使って効率化

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

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

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

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

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

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

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

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

    1 8 0 10 16 21 25 28
  20. 累積和 / クエリ 3 5 4 6 2 7 1

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

    1 8 0 10 16 21 25 28 ↓この区間の総和を求めたい! (= 17) 25 - 8 = 17
  22. Swiftで実装して
 処理速度を比較してみた

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

  24. Thank you !