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

Swift and Timsort

Da1305e5281b5208da85d14a356d01f3?s=47 Takanori Hirobe
September 19, 2021
250

Swift and Timsort

Swiftの標準ライブラリには数多くのアルゴリズムが用意されていますが、その中で最も頻繁に使われているものの1つはソートであると言えるでしょう。

そんなSwiftのソートアルゴリズムですが、具体的にどのようなアルゴリズムが採用されているかご存知でしょうか。
また、ソートアルゴリズムの重要な指標である時間計算量、空間計算量、安定性はどのような特徴を持っているでしょうか。

もし知らなければ、知っておいて損はないでしょう。5分で解説します。

Da1305e5281b5208da85d14a356d01f3?s=128

Takanori Hirobe

September 19, 2021
Tweet

Transcript

  1. Takanori Hirobe SwiftͷιʔτΞϧΰϦζϜͷಛ௃Λ 5෼Ͱ͖ͪΜͱ஌Δ iOSDC 2021

  2. None
  3. ͲΜͳΞϧΰϦζϜΛ࢖͍ͬͯΔͷ͔

  4. ͲΜͳΞϧΰϦζϜΛ࢖͍ͬͯΔͷ͔ 🤔

  5. Timsort ͱݺ͹ΕΔΞϧΰϦζϜ Λ࢖͍ͬͯΔ

  6. Timsortͱ͸ ؆୯ͳ֓ཁ

  7. Timsortͱ͸ ؆୯ͳ֓ཁ • 2002೥ʹTim PetersʹΑͬͯPythonͷιʔτΞϧΰϦζϜͱ࣮ͯ͠૷͞Εͨ

  8. Timsortͱ͸ ؆୯ͳ֓ཁ • 2002೥ʹTim PetersʹΑͬͯPythonͷιʔτΞϧΰϦζϜͱ࣮ͯ͠૷͞Εͨ • SwiftͰ͸Swift 5.0(ABI҆ఆԽͷλΠϛϯά)͔Β࠾༻͞Ε͍ͯΔ

  9. Timsortͱ͸ ؆୯ͳ֓ཁ • 2002೥ʹTim PetersʹΑͬͯPythonͷιʔτΞϧΰϦζϜͱ࣮ͯ͠૷͞Εͨ • SwiftͰ͸Swift 5.0(ABI҆ఆԽͷλΠϛϯά)͔Β࠾༻͞Ε͍ͯΔ • Swift

    5.0ະຬͰ͸ҟͳΔΞϧΰϦζϜ͕࢖ΘΕ͍ͯͨ
  10. Timsortͱ͸ ؆୯ͳ֓ཁ • 2002೥ʹTim PetersʹΑͬͯPythonͷιʔτΞϧΰϦζϜͱ࣮ͯ͠૷͞Εͨ • SwiftͰ͸Swift 5.0(ABI҆ఆԽͷλΠϛϯά)͔Β࠾༻͞Ε͍ͯΔ • Swift

    5.0ະຬͰ͸ҟͳΔΞϧΰϦζϜ͕࢖ΘΕ͍ͯͨ • ༏ΕͨੑೳΛ͍࣋ͬͯͯɺRust΍JavaͳͲͰ΋࠾༻͞Ε͍ͯΔ
  11. ΞϧΰϦζϜͷੑೳ

  12. ΞϧΰϦζϜͷੑೳ • ଎͞ • ҆ఆੑ • ϝϞϦ࢖༻ྔ

  13. ΞϧΰϦζϜͷੑೳ • ଎͞ • ҆ఆੑ • ϝϞϦ࢖༻ྔ

  14. ଎͞

  15. ଎͞ • ଎͍ʂ

  16. ଎͞ • ଎͍ʂ • Ҏ্ɻ

  17. ଎͞ • ଎͍ʂ • Ҏ্ɻ • ଎͞ʹ͍ͭͯ࿩͍ͯͨ͠Β5෼Ͱ͸શ͘଍Γͳ͍

  18. ΞϧΰϦζϜͷੑೳ • ଎͞ • ҆ఆੑ • ϝϞϦ࢖༻ྔ

  19. ιʔτΞϧΰϦζϜͱ҆ఆੑ

  20. ҆ఆੑ ྫΛ࢖ͬͯߟ͑Δ

  21. ҆ఆੑ ྫΛ࢖ͬͯߟ͑Δ

  22. ҆ఆੑ ྫΛ࢖ͬͯߟ͑Δ

  23. ҆ఆੑ ྫΛ࢖ͬͯߟ͑Δ

  24. ਤʹ͢Δͱ

  25. None
  26. value

  27. None
  28. None
  29. None
  30. ιʔτͰ͖ͨʂʂ

  31. ҆ఆੑʁ

  32. ҆ఆͳιʔτͱෆ҆ఆͳιʔτ

  33. ҆ఆͳιʔτ

  34. ҆ఆͳιʔτ ιʔτલ ιʔτޙ

  35. ҆ఆͳιʔτ ιʔτલ ιʔτޙ

  36. ҆ఆͳιʔτ value͕ಉ͡ ιʔτલ ιʔτޙ

  37. ҆ఆͳιʔτ value͕ಉ͡ value͕ಉ͡Ͱ΋લޙͷҐஔؔ܎͕อଘ͞ΕΔ ੨ ԫ ੺ ੨ ԫ ੺

  38. ҆ఆͳιʔτ value͕ಉ͡ value͕ಉ͡Ͱ΋લޙͷҐஔؔ܎͕อଘ͞ΕΔ ੨ ԫ ੺ ੨ ԫ ੺

  39. ෆ҆ఆͳιʔτ ιʔτલ ιʔτޙ

  40. ෆ҆ఆͳιʔτ value͕ಉ͡ ԫ ੺ ੨ ੨ ԫ ੺ ιʔτલ ιʔτޙ

  41. ෆ҆ఆͳιʔτ value͕ಉ͡ ԫ ੺ ੨ ੨ ԫ ੺ ಉ͡valueಉ࢜ͷલޙͷҐஔؔ܎͕อଘ͞Εͳ͍

  42. ෆ҆ఆͳιʔτ value͕ಉ͡ ԫ ੺ ੨ ੨ ԫ ੺ ಉ͡valueಉ࢜ͷલޙͷҐஔؔ܎͕อଘ͞Εͳ͍

  43. ͳͥ҆ఆੑ͕ॏཁͳͷ͔

  44. Swiftͷྺ࢙తͳࣄ৘

  45. Swiftͷྺ࢙తͳࣄ৘ • Timsort͸҆ఆͳιʔτ

  46. Swiftͷྺ࢙తͳࣄ৘ • Timsort͸҆ఆͳιʔτ • Swift 5.0Ҏ߱

  47. Swiftͷྺ࢙తͳࣄ৘ • Timsort͸҆ఆͳιʔτ • Swift 5.0Ҏ߱ • Swift 5.0ະຬͰ͸Introsort͕࢖ΘΕ͍ͯͨ

  48. Swiftͷྺ࢙తͳࣄ৘ • Timsort͸҆ఆͳιʔτ • Swift 5.0Ҏ߱ • Swift 5.0ະຬͰ͸Introsort͕࢖ΘΕ͍ͯͨ •

    Introsort͸ෆ҆ఆͳιʔτ
  49. Swiftͷྺ࢙తͳࣄ৘ • Timsort͸҆ఆͳιʔτ • Swift 5.0Ҏ߱ • Swift 5.0ະຬͰ͸Introsort͕࢖ΘΕ͍ͯͨ •

    Introsort͸ෆ҆ఆͳιʔτ • SwiftͷόʔδϣϯʹΑͬͯιʔτͷ҆ఆੑ͕ҟͳΔ
  50. Swiftͷྺ࢙తͳࣄ৘ • Timsort͸҆ఆͳιʔτ • Swift 5.0Ҏ߱ • Swift 5.0ະຬͰ͸Introsort͕࢖ΘΕ͍ͯͨ •

    Introsort͸ෆ҆ఆͳιʔτ • SwiftͷόʔδϣϯʹΑͬͯιʔτͷ҆ఆੑ͕ҟͳΔ • ιʔτ݁Ռ͕ҟͳΔՄೳੑ͕͋Δ
  51. ࠷ޙʹ஫ҙ఺

  52. ࠷ޙʹ஫ҙ఺ • υΩϡϝϯτͰ͸҆ఆੑʹ͍ͭͯ͸อো͍ͯ͠ͳ͍ͷͰ஫ҙ • ҆ఆੑʹ͍ͭͯ͸ Implementation Detail (࣮૷ʹґଘ)ͱ͍͏ѻ͍ "The sorting

    algorithm is not guaranteed to be stable." https://developer.apple.com/documentation/swift/array/1688499-sort
  53. ΞϧΰϦζϜͷੑೳ • ଎͞ • ҆ఆੑ • ϝϞϦ࢖༻ྔ

  54. ϝϞϦ࢖༻ྔ

  55. TimsortͷϝϞϦ࢖༻ྔ • ιʔτΞϧΰϦζϜ͝ͱʹϝϞϦ࢖༻ྔ͸ҟͳΔ

  56. TimsortͷϝϞϦ࢖༻ྔ • ιʔτΞϧΰϦζϜ͝ͱʹϝϞϦ࢖༻ྔ͸ҟͳΔ • Timsort͸ɺιʔτ͞ΕΔ഑ྻͷ൒෼ͷେ͖͞ͷϝϞϦΛ֬อ͢Δ • ͋͘·Ͱཧ࿦্ͷ࠷େͷ஋ͳͷͰɺ࣮ࡍ͸΋ͬͱগͳ͍ • ͨͩ͠ɺ׬શϥϯμϜͳ഑ྻ͸ϝϞϦ࢖༻ྔ͕େ͖͘ͳΔ܏޲͕͋Δ

  57. TimsortͷϝϞϦ࢖༻ྔ

  58. TimsortͷϝϞϦ࢖༻ྔ Ұॠ͚ͩϝϞϦ࢖༻ྔ͕૿͑Δ

  59. TimsortͷϝϞϦ࢖༻ྔ Ұॠ͚ͩϝϞϦ࢖༻ྔ͕૿͑Δ ී௨ͷΞϓϦͰ໰୊ʹͳΔ͜ͱ͸ͳ͍͸ͣ

  60. ·ͱΊ • ݱࡏͷSwiftͰ࢖ΘΕ͍ͯΔTimsort͸҆ఆੑ΍࣌ؒܭࢉྔͷ؍఺Ͱɺ༏Εͨੑ ೳΛ͍࣋ͬͯΔ • ྺ࢙తࣄ৘ʹΑΓɺSwift 5.0ͷલޙͰιʔτ݁Ռ͕มΘΔՄೳੑ͕͋Δ • Timsort͸ɺ࠷େͰݩͷ഑ྻͷ൒෼ͷϝϞϦΛ֬อ͢ΔՄೳੑ͕͋Δ

  61. ࣗݾ঺հ • Takanori Hirobe / ኍ෦وಙ • 4ࡀ͝Ζ͔Βͣͬͱؔ੢ʹࡏॅ • @taka1068

    • Twitter, GitHub, Qiita
  62. Further Reading • ೔ຊޠࢿྉ • https://tech.preferred.jp/ja/blog/tim-sort/ • ӳޠࢿྉ • https://swiftrocks.com/introsort-timsort-swifts-sorting-algorithm

    • ΞϧΰϦζϜมߋͷPull request • https://github.com/apple/swift/pull/19717
  63. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠