・二分探索木 (binary search tree) ・AVL tree ・B-tree ・B+ tree
について順を追いながら説明。 流れを細かく書いたので、わかりやすいと思います。
͜ΕͰΘ͔Δ(?) B-tree ΞϧΰϦζϜ2018/12/06 ࣾษڧձϋτωίΤ
View Slide
ϋτωίΤ@nekoneneneࢲॳԻϛΫͰ͢͝ଘ͋ͷํ
• BͱݺΕΔ• σʔλߏͷҰछͰ͋ΔߏͷҰछ• ϧʔτ͔Βͷߴ͕͞Ұఆͷฏߧʢ͍͜͏͗ʣͷҰछ• Mongo DBͳͲͷσʔλϕʔεͷ΄͔ɺ WindowsͷϑΝΠϧγεςϜNTFS MacͷϑΝΠϧγεςϜAPFS ͳͲͰΘΕ͍ͯΔB-tree
• MySQLͷσʔλϕʔεΤϯδϯ InnoDB Ͱɺ ॱʑʹΞΫηε͢ΔੑೳΛ্͛ͨ B+ tree ͕ΘΕ͍ͯΔ• Oracle Database MacͷϑΝΠϧγεςϜͩͬͨHFS+ Ͱ B* tree ͕ΘΕ͍ͯΔʢࠓճѻ͍·ͤΜʣB-tree ѥछ
Χϯλϯͳͷ͔Β ࢝Ί͍ͯ͜͏
• ͬͱ୯७ͳߏ• খ͍͞ΛࠨԼʹɺେ͖͍ΛӈԼʹ͚͍ͭͯ͘ೋ୳ࡧ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢ೋ୳ࡧɿྫ105
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢ೋ୳ࡧɿྫ105ϊʔυࢠϊʔυ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢ೋ୳ࡧɿྫ10532
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢ೋ୳ࡧɿྫ105328
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢ೋ୳ࡧɿྫ1053284
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢ೋ୳ࡧɿྫ10532184
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢ೋ୳ࡧɿྫ10532184 6
• ͷόϥϯε͕ۉʹ͍ͬͯΕɺ ཁૉ n ʹରͯ͠୳ࡧʹ͔͔Δ࠷ѱܭࢉྔ O (log n) ʹͰ͖Δ• ͭ·Γɺσʔλ͕૿͑ͯݕࡧͷ͕࣌ؒ૿͑ͳ͍ೋ୳ࡧͷར1052 81612 20ཁૉ nܭࢉྔ
• ࠨԼͷਤͷΑ͏ͳภͬͨߏͷ࠷ѱͷ߹Λߟ͑Δ• ཁૉ͕ଟ͍΄ͲൺֱΛ͓͜ͳ͏ͷͰ࠷ѱܭࢉྔ O (n)ೋ୳ࡧͷܽཁૉ nܭࢉྔ10532
ͦΕͳΒͬͨ ߏʹ͠Α͏ʂ
• ߟҊऀͷ2ਓͷ໊લ͕༝དྷʢAdelson-Velskii and Landis' treeʣ• ࠨ෦ͷߴ͞ͱӈ෦ͷߴ͕͞1ΑΓେ͖͘ͳͬͨΒ ʮͷճసʯʹΑΓ࠶ߏ͠ɺฏߧΛอͭAVL
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢AVLɿྫ105
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢AVLɿྫ1053ʮ10ʯ͔Βݟͯ ࠨߴ͞ 2 ӈߴ͞ 0 ʹͳͬͯ͠·͏ͦ͜Ͱɺͷճసʂ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢AVLɿྫ1053த৺ʹ͍ͨ ʮ5ʯΛʹͯ͠ ଞΛࢠʹ͢Δ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢AVLɿྫ10532
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢AVLɿྫ10532 8
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢AVLɿྫ10532 84
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢AVLɿྫ10532 841
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢AVLɿྫ10532 841 ͭͳ͛ΒΕΔՕॴͷߴ͞ͷ͕ࠩ2 ͜Εͷճస͕ى͜Δʁ??
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢AVLɿྫ10532 841ʮ5ʯ͔Βݟͯ ࠨͷߴ͞ 3 ӈͷߴ͞ 2ʮ3ʯ͔Βݟͯ ࠨͷߴ͞ 2 ӈͷߴ͞ 1ࠨ෦ͱӈ෦ͷߴ͞ͷࠩΛ ݟΔͷͰɺ·ͩ͑·͢
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢AVLɿྫ10532 841 6ʮ10ʯ͔Βݟͯ ࠨͷߴ͞ 2 ӈͷߴ͞ 0ͷճసνϟϯεʂ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢AVLɿྫ10532 841 6த৺ʹ͍Δ ʮ8ʯΛʹ͠ɺ ଞ2ͭࢠʹ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢AVLɿྫ8532 64110ʂ
• ࠷ѱܭࢉྔ͕େ͖͘ͳΒͳ͍Α͏ɺ ͷճసΛ༻͍ɺͰ͖Δ͚ͩภΓͷͳ͍Λ࡞͍ͬͯͬͨ• ͜ͷΑ͏ͳฏୱʹ͚ۙΔߏΛ ฏߧʢ͍͜͏͗ʣͱݺͿAVL ͓͞Β͍
• ͷߴ͕͞ߴ͘ͳΓ͍͢• ݁Ռɺσʔλྔ͕ͱͯଟ͍߹ɺݕࡧʹ͕͔͔࣌ؒΔ• → ͦ͜Ͱ B-tree ʂAVLͷܽ
• ֤ϊʔυʹ࣋ͨͤΔΛ1ͭͰͳ͘ෳʹ͠ɺͷߴ͞Λ͑Δ• ࠓ·ͰͷϊʔυXΑΓখ͍͔ͦ͞ΕҎ্͔ɺͷ 2ຊͷࢬ͔͍࣋ͬͯ͠ͳ͔͕ͬͨɺB-treeͰΑΓଟ͘ͷࢬΛ࣋ͭ• ྫ͑ X ͱ Y ͷ 2 ͭͷΛϊʔυʹͭͱܾΊͨ߹ɺ Xະຬ / XҎ্ͰYະຬ / YҎ্ ͷ3ຊͷࢬΛϊʔυ࠷େͰ࣋ͭʢΦʔμʔ3ʣͦ͜Ͱ B-tree
• ϊʔυ͕࠷େͰ࣋ͭࢬͷʹԠͯ͡ɺ ʮΦʔμʔ m ͷB-treeʯͱ͍͏ݴ͍ํΛ͢Δ• Φʔμʔ 3 ʙ 5 ͕Α͋͘ΔΒ͍͠• ࠓճɺΦʔμʔ 3 ͷ B-tree ʢͭ·Γϊʔυʹ2ͭͷΛ࣋ͭʣ ʹ͍ͭͯྫΛݟ͍ͯ͘ɻ ࢠϊʔυΛ2ʙ3࣋ͭ͜ͱ͔Βɺ2-3 tree ͱݺΕΔΦʔμʔ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B-treeɿྫ5 10 ϊʔυʹ2ͭͷ Λͭ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B-treeɿྫ5 10 ϊʔυʹ 3ͭͷ͕……3த৺ͷϊʔυʹҠಈʂ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B-treeɿྫ5103
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B-treeɿྫ5102 3
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B-treeɿྫ582 3 10
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B-treeɿྫ582 3 104
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B-treeɿྫ582 3 104த৺ͷ ϊʔυʹҠಈʂ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B-treeɿྫ582 3 104Զ͕ϊʔυͩʂத৺ͷ ϊʔυʹҠಈʂ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B-treeɿྫ382 1045
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B-treeɿྫ381 10452
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B-treeɿྫ361 8452 10த৺ͷ ϊʔυʹҠಈʂ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B-treeɿྫ3618452 10͋Ε……͓अຐʁ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B-treeɿྫ3618452 10த৺ͷ ϊʔυʹҠಈʂ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B-treeɿྫ3618452 10ߴ͞Ξοϓʂˍʂ
• جຊͷΞϧΰϦζϜ B-tree• ࠷ԼͷϊʔυΛϙΠϯλͰͭͳ͗߹Θͤͨ͜ͱͰɺ খ͞ͳ͔Βେ͖ͳॱʑʹΞΫηε͍ͯ͘͠ ͱ͍͏ڍಈͷύϑΥʔϚϯεΛ্͛Δ͜ͱʹޭ• ઌ΄Ͳಉ༷ɺΦʔμʔ 3 ʢϊʔυ͕࠷େͰ࣋ͭࢬ͕3ຊʣͷ B+ tree ʹ͍ͭͯݟ͍ͯ͘B+ tree
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ5 10
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ5 10 ϊʔυʹ 3ͭͷ͕……3த৺ͷϊʔυʹҠಈʂ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ553 10ϊʔυҠಈͭͭ͠…ͱͷ͢ʂ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ553 10࠷Լಉ࢜Λ ϙΠϯλͰͭͳ͙ʂ͜Ε͕ B+ tree ͷҰ൪ͷಛʂ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ553 10
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ552 103
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ552 83 10த৺ͷ ϊʔυʹҠಈʂ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ552 83 108ͱͷ͢
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ552 83 1084த৺ͷ ϊʔυʹҠಈʂ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ552 8310843ͱͷ͢
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ55 83108433ͭʹͳͬͯ͠·ͬͨ……2
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ55 83108432த৺ͷ ϊʔυʹҠಈʂ3ͭʹͳͬͯ͠·ͬͨ……
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ53 85Θ͔Γ͍͢Α͏ ্෦͚ͩߟ͑Δ৽͍͠ύύͩΑͱͷ͢
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ53 85Θ͔Γ͍͢Α͏ ্෦͚ͩߟ͑Δ5ະຬ5Ҏ্
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ55 83108432ͳͷͰಉ༷ʹ……
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ55 831084325͜͏ͳΔʂ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ55 831084325ʢҙʣ͜͏ͳΒͳ͍ Φʔμʔ 3 ͷ BͰ ࠷ 2 ͭͷ ࢠϊʔυΛ࣋ͭ
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ55 831084325Λͯ࣍͠…
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ55 8310843152
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ55 8310843152 6
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ55 8310843152 6ʂ
• ࠷Լͷϊʔυ͕ϙΠϯλͰͭͳ͕͍ͬͯΔͨΊɺ খ͞ͳ͔Βେ͖ͳॱʑʹΞΫηε͍͖͍ͯͨ͠߹ʹɺ ຖճݕࡧͷखؒΛڬ·ͳͯ͘ࡁΉ• ͳ͓ɺ͜ͷ࠷ԼͷϊʔυΛ ʮϦʔϑϊʔυʢleaf nodesʣʯͱݴ͍·͢B+ tree ͓͞Β͍
• 10 → 5 → 3 → 2 → 8 → 4 → 1 → 6 ͷॱʹೖΕ͍͖ͯ·͢B+ treeɿྫ55 8310843152 6Ϧʔϑϊʔυ
• ΧϥϜʹΠϯσοΫεΛషΔ͜ͱͰɺ B+ tree ͷߏ͕࡞ΒΕɺॱʑʹͳ͍ͬͯΔͷͰ ൣғݕࡧ͕εϐʔυग़͍͢͠• ͳ͓ɺInno DB ͰϦʔϑϊʔυؒͷϙΠϯλ͕ ҰํͰͳ͘ํʹͳ͍ͬͯΔInno DB ʹ͓͍ͯ5 8 10431 2 6
• AVL https://www.cs.usfca.edu/~galles/visualization/AVLtree.html• B-tree https://www.cs.usfca.edu/~galles/visualization/BTree.html• B+ tree https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html• ͦͷଞ https://www.cs.usfca.edu/~galles/visualization/Algorithms.htmlศརͳγϛϡϨʔλʔ