рдЗрдирд╡рд░реНрдЯ рд╕реЙрд░реНрдЯ рдХрд░реЗрдВ

рднрд╛рд░рдд рдХрд╛ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ Zig-Zag, Zig-Zig рдФрд░ Zig рдХреЛ SplaySort рдПрд▓реНрдЧреЛрд░рд┐рдердо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:


рдЗрд╕ рд╕реАрдЬрди рдореЗрдВ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдвреЗрд░реЛрдВ рдХреА рдЦреЛрдЬ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЫрдБрдЯрд╛рдИ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдмрд╛рд░ рд╣рдо рдореБрдЦреНрдп рд╡рд┐рд╖рдп рд╕реЗ рдПрдХ рдХрджрдо рджреВрд░ рд╣реЛрдВрдЧреЗред рдЖрдЬ рдХреА рд╕рдВрд░рдЪрдирд╛ - рдЪрдВрдЪрд▓ рд╡реГрдХреНрд╖ - рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрдЧрд▓реЗ рдвреЗрд░ рдХреЗ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдорд╛рдирд╕рд┐рдХ рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣ рдПрдХ рдХрд╛рд░реНрдЯреЗрд╢рд┐рдпрди рдкреЗрдбрд╝ рджреНрд╡рд╛рд░рд╛ рдЫрдВрдЯрд╛рдИ рдкрд░ рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛рди рд╣реЛрдЧрд╛ред
EDISON рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ - рд╡реЗрдм-рд╡рд┐рдХрд╛рд╕
рдпрд╣ рд▓реЗрдЦ EDISON рдХреЗ рд╕рдорд░реНрдерди рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рдорд╛рд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреА рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рдк рдФрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рди рд╣реИ , рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рд╣рдо рдПрдХ рд╕рдЦреНрдд рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдЪреНрдЪ-рддрдХрдиреАрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ! ;-)






рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА рд╕реЙрд░реНрдЯ


Splay рдЯреНрд░реА рдПрдХ рдмреЗрд╣рддрд░ рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп "рдЕрд╕рд┐рдорд┐рдд" рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреИрд╕реЗ рд╕реЙрд░реНрдЯ рдХрд░реЗрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдореЗрдВ, рдХреЛрдИ рднреА рдмрд╛рдпрд╛ рдмрдЪреНрдЪрд╛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗ рдХрдо рд╣реИ, рдХреЛрдИ рднреА рд╕рд╣реА рдмрдЪреНрдЪрд╛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗ рдХрдо (рдпрд╛рдиреА рдЕрдзрд┐рдХ рдпрд╛ рдмрд░рд╛рдмрд░) рдирд╣реАрдВ рд╣реИред


рдЫрдБрдЯрд╛рдИ рдЖрдо рддреМрд░ рдкрд░ рд╕реАрдзреА рд╣реИ:

  • рдЪрд░рдг 1. рд╕рд░рдгреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЦреЛрдЬ рдкреЗрдбрд╝ рдХрд╛ рдирд┐рд░реНрдорд╛рдгред рд╣рдо рд╕рд░рдгреА рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЛ рд░реВрдЯ рдкрд░ рд░рдЦрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рд╢реЗрд╖ рддрддреНрд╡реЛрдВ рдХреА рдЬрдбрд╝ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░, рддреБрд▓рдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдмрд╛рдИрдВ рдпрд╛ рджрд╛рдИрдВ рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдФрд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдореМрдЬреВрджрд╛ рддрддреНрд╡ рдХреА рд╡рд░реНрддрдорд╛рди рдЯреНрд░реА рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ)ред рдЕрдВрдд рдореЗрдВ, рдЕрдЧрд▓рд╛ рддрддреНрд╡ рдПрдХ рд╢рд╛рдЦрд╛ рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ рдФрд░ рд╕реНрд╡рдпрдВ рдПрдХ рдиреЛрдб рдмрди рдЬрд╛рддрд╛ рд╣реИред
  • 2. . , ( , ) . .

рдПрд▓реНрдЧреЛрд░рд┐рджрдорд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдкреЗрдбрд╝ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд╛рдлреА рд╕рд╣рдиреАрдп рд╣реИ - рдФрд╕рддрди, рдПрдХ рдирдпрд╛ рдиреЛрдб рдУ (рд▓реЙрдЧ рдПрди ) рдЦрд░реНрдЪ рдХрд░рддрд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рдЪрд░рдг рдХреА рд╕рдордп рдЬрдЯрд┐рд▓рддрд╛ рдУ ( рдПрди рд▓реЙрдЧ рдПрди ) рд╣реИ ред

рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд░рд╕рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреЗрдбрд╝ рдХреА рдкреИрджрд▓ рдпрд╛рддреНрд░рд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдмреЗрд╣рдж рдШреБрдорд╛рд╡рджрд╛рд░ рднреВрд▓рднреБрд▓реИрдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд▓рдВрдмреА рдпрд╛рддреНрд░рд╛ рдмрди рд╕рдХрддреА рд╣реИ, рдФрд░ рд╕рдордп рдЬрдЯрд┐рд▓рддрд╛ рдЕрдХреНрд╕рд░ рдУ ( рдПрди 2 ) рддрдХ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ ред

рд╕рд╛рдБрдк рдХрд╛ рдкреЗрдбрд╝


рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ 35-37 рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рджреЛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХреЛрдВ рд░реЙрдмрд░реНрдЯ рдЯрд╛рд░рдЬрди рдФрд░ рдбреИрдирд┐рдпрд▓ рд╕реНрд▓рд┐рдЯрд░ рдиреЗ рдЗрд╕ рдкреЗрдбрд╝ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╡рд┐рдХрд╕рд┐рдд рдХреАред рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рдХрд┐рд╕реА рднреА рдкреЗрдбрд╝ рдХреЗ рдиреЛрдб рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдСрдкрд░реЗрд╢рди (рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ, рдЦреЛрдЬ, рд╣рдЯрд╛рдПрдВ) рдХреЗ рд▓рд┐рдП, рддреБрд░рдВрдд рдкреЗрдбрд╝ рдХреЛ рдкреБрди: рд╕рдВрддреБрд▓рд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕рд╕реЗ рдиреЛрдб рдкреВрд░реА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдореВрд▓ рд╣реЛред


рдмрд╛рдИрдВ рддрд╕реНрд╡реАрд░ рдореЗрдВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЯ рдФрд░ рдкрд╛рд╕реНрдХрд▓ рдХреЗ рдЖрд╡рд┐рд╖реНрдХрд╛рд░рдХ рдХреА рдХрдВрдкрдиреА рдореЗрдВ рд░реЙрдмрд░реНрдЯ рдЯрд╛рд░рдЬрди (рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐, рджреВрд╕рд░рд╛ рджрд╛рдпрд╛рдВ) рд╣реИред рд╕рд╣реА рдлреЛрдЯреЛ рдореЗрдВ рдбреИрдирд┐рдпрд▓ рд╕реНрд▓рд┐рдЯрд░ рд╣реИред
рдЫрд╡рд┐ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдкреВрд░реНрдг рдкреНрд░рд╛рд░реВрдк рд╕рдВрд╕реНрдХрд░рдг рдЦреБрд▓ рдЬрд╛рдПрдЧрд╛ред


рд░реВрд╕реА рдореЗрдВ, рдЕрд╕рдлрд▓ рдирд╛рдо "рд╡рд┐рд╕реНрддрд╛рд░ рдкреЗрдбрд╝" рдЕрдЯрдХ рдЧрдпрд╛, рдХрдо рдЕрдХреНрд╕рд░ - "рддрд┐рд░рдЫрд╛ рдкреЗрдбрд╝"ред рдпрджреНрдпрдкрд┐ рдпрджрд┐ рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ "рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдкреЗрдбрд╝" (рдпрд╛, рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░, "рдмрджрд▓ рдЧрдпрд╛") рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕рд╛рд░ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╣ рд╣реИред

рдиреЛрдб рдХреЛ рд░реВрдЯ рдкрд░ рдзрдХреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рд╕рд░рд▓ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдерд╛рдХрдерд┐рдд рдореЛрдбрд╝:

рдЬрд┐рдЧ рдЯрд░реНрди


рдпрджрд┐ рдЖрдк рдЬрд┐рд╕ рддрддреНрд╡ рдХреЛ рдЬрдбрд╝ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рджреВрд╕рд░реЗ рд╕реНрддрд░ рдкрд░ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИред

рд╣рдо рдЗрд╕ рддрддреНрд╡ рдХреЛ рдПрдХреНрд╕ рдХреА рддрд░рд╣ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ , рдФрд░ рдЙрд╕рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ (рдЬреЛ рдХрд┐ рдкреЗрдбрд╝ рдХреА рдЬрдбрд╝ рднреА рд╣реИ) - рдкреА рдХреЗ рд░реВрдк рдореЗрдВ ред
рдП , рдмреА , рд╕реА рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдЗрди рд╕рдмрдЯреНрд░реЗрдб рдиреЛрдбреНрд╕ рдореЗрдВ рдХрд┐рддрдирд╛ рд╣реИ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рдХреЗрд╡рд▓ рдЗрди рдЙрдкрдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрдбрд╝реЛрдВ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдЬрд┐рдирдХреЗ рд╕рдВрдмрдВрдз рдПрдХреНрд╕ рдФрд░ рдкреА рдХреЗ рд╕рд╛рде "рдорд╛рддрд╛-рдкрд┐рддрд╛-рдмрдЪреНрдЪреЗ" рд╣реИрдВ ред рдпрджрд┐ рдХреЛрдИ рдЙрдкрдкреНрд░рдХрд╛рд░ рдЧрд╛рдпрдм рд╣реИ (рдпрджрд┐ X рдФрд░ P рдХрд╛ рдХреЛрдИ рд╡рдВрд╢рдЬ рдирд╣реАрдВ рд╣реИ), рддреЛ рдпрд╣ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдХреНрд░рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рдПрдХреНрд╕ рдХреЛ рдкреЗрдбрд╝ рдХреА рдЬрдбрд╝ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХреНрд╕ рдФрд░ рдкреА рдХреЗ рдмреАрдЪ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдмрдЪреНрдЪреЗ рдХреЗ рд░рд┐рд╢реНрддреЗ рдХреЛ рдЙрд▓реНрдЯрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ , рдФрд░ рдмреА рд╕рдмрдЯреНрд░реА рдХреЛ рднреА рдкрдЫрд╛рдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрд╣ рдПрдХреНрд╕ рдХрд╛ рд╕рд╣реА рд╡рдВрд╢рдЬ рдерд╛ , рдкреА рдХреЗ рдмрд╛рдПрдВ рд╡рдВрд╢рдЬ рдмрди рдЧрдпрд╛ ( рдЖрдкрдХреЛ рдП рдФрд░ рд╕реА рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ )ред рдФрд░ рдпрд╣ рд╕рдм рд╣реИ! рдЗрди рд╕рд░рд▓ рдЬреЛрдбрд╝рддреЛрдбрд╝реЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕рдВрд░рдЪрдирд╛, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЦреЛрдЬ рдкреЗрдбрд╝ рдерд╛, рдЗрд╕рд▓рд┐рдП рдмрдиреА рд░рд╣реА - рд╕рд┐рджреНрдзрд╛рдВрдд "рдмрд╛рдПрдВ рдмрдЪреНрдЪрд╛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗ рдХрдо рд╣реИ, рд╕рд╣реА рдмрдЪреНрдЪрд╛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдпрд╛ рдмрд░рд╛рдмрд░ рд╣реИ" рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдкрд┐рдЫрд▓рд╛ рдЪрд┐рддреНрд░ X , P рдХреЗ рдмрд╛рдПрдВ рд╡рдВрд╢рдЬ рд╣реИ ред рдпрджрд┐ рдПрдХреНрд╕ рдПрдХ рд╕рд╣реА рд╡рдВрд╢рдЬ рдерд╛, рдЖрдкрдХреЛ рдмрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


рдпрджрд┐ рдПрдХреНрд╕ рдореЗрдВ рдХрдард┐рдирд╛рдИ рдХрд╛ рджреВрд╕рд░рд╛ рд╕реНрддрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рддреАрд╕рд░рд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВред

рдЕрдЧрд░ рдПрдХреНрд╕ рдПрдХ рдкреИрд░реЗрдВрдЯ рд╣реИ рдкреА , рдЬреЛ рдмрд╛рд░реА рдореЗрдВ рдПрдХ рдкреИрд░реЗрдВрдЯ рд╣реИ рдЬреА , рддреЛ рд╣рдо рдХреЗрд╡рд▓ рджреЛ рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╣реИ:
1) рдЕрдЧрд░ рдПрдХреНрд╕ рдПрдХ рд╣реИ рд╡рдВрд╢рдЬ рдХреЗ рд▓рд┐рдП рдкреА рдПрдХ рд╣реА рддрд░рдл рдХреЗ рд░реВрдк рдореЗрдВ рдкреА рдХреЗ рд▓рд┐рдП рдЬреА ;
2) рдЕрдЧрд░ X рдФрд░ P рдЕрдкрдиреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдореБрдЦреА рд╡рдВрд╢рдЬ рд╣реИрдВ ред

рдкрд╣рд▓реЗ, рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдЬрд┐рдЧрдЬрд┐рдЧ рдЯрд░реНрди


P рдХреЗ рд▓рд┐рдП X рдХреЛ рдмрд╛рдПрдВ рд╡рдВрд╢рдЬ рд╣реЛрдиреЗ рджреЗрдВ , рдФрд░ G рдХреЗ рд▓рд┐рдП P рдХреЛ рдмрд╛рдПрдВ рд╡рдВрд╢рдЬ (рд╡рд┐рдХрд▓реНрдк рдЬрдм X рдФрд░ P рдПрдХ рд╕рд╛рде рджрд╛рдПрдВ рд╡рдВрд╢рдЬ рд╣реИрдВ рдЙрд╕реА рддрд░рд╣ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП)ред


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХреНрд╕ , рдкреА рдФрд░ рдЬреА рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ , рд╕рд╛рде рд╣реА рд╕рд╛рде рдмреА рдФрд░ рд╕реА рдХреЛ рдареАрдХ рд╕реЗ рдЖрдЙрдЯрд╡реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдФрд░ рд╣рдорд╛рд░реЗ рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА рдХреЛ рдЗрд╕рд╕реЗ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдЬрд┐рдЧрдЬреИрдЧ рдЯрд░реНрди


рдпрджрд┐ X рд╕рд╣реА рд╡рдВрд╢рдЬ рд╣реИ, рдФрд░ P рдмрд╛рдПрдВ рд╣реИ (рдпрд╛ X рдмрдЪрд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ P рд╕рд╣реА рд╣реИ, рд╕рд╛рд░ рдирд╣реАрдВ рд╣реИ), рддреЛ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдЪрд┐рддреНрд░ рд╕реЗ рд╕рдм рдХреБрдЫ рд╕рдордЭ рдЧрдП рд╣реИрдВ:


рдпрджрд┐ рдкреЗрдбрд╝ рдореЗрдВ X рдЕрднреА рднреА рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреЗ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдкрд░ рд╣реИ, рддреЛ рдЙрд╕реЗ рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрд╕ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЛ ZigZig рдпрд╛ ZigZag (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдпрд╣ рдХрдИ рдмрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛) рд╢рд╛рдЦрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреЗ рддреАрд╕рд░реЗ рд╕реНрддрд░ рдкрд░ рд╣реИред

рдЗрдирд╡рд░реНрдЯ рд╕реЙрд░реНрдЯ :: Splay рд╕реЙрд░реНрдЯ


рджрд░рдЕрд╕рд▓, рдпрд╣рд╛рдБ рд╣рдо рдкреЗрдбрд╝реЛрдВ рдХреА рдЫрдБрдЯрд╛рдИ рдореЗрдВ рднреА рдЙрд╕реА рддрд░рд╣ рдХрд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ - рдкрд╣рд▓реЗ рд╣рдо рдПрдХ рдмрд╛рдЗрдирд░реА рд╕реЙрд░реНрдЯ рдЯреНрд░реА рдмрдирд╛рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдЙрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдкреЗрдбрд╝ рдореЗрдВ рдПрдХ рдирдпрд╛ рдЧрд╛рдБрда рдбрд╛рд▓рддреЗ рд╣реИрдВ - рд▓рдХреАрд░реЗрдВ рдФрд░ рдЬрд╝рд┐рдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЗрд╕реЗ рдЬрдбрд╝ рдмрдирд╛рддреЗ рд╣реИрдВред

рдЬреАрддрдиреЗ рдХреЗ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ, рдпрд╣ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдПрдХ рдиреЛрдб рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реБрдП (рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЬрдбрд╝ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП zigzag рдХрд░рдирд╛ рд╣реИ) рдФрд╕рдд O (рд▓реЙрдЧ рдПрди ) рдкрд░ рд▓рд╛рдЧрдд рд╣реЛрддреА рд╣реИ - рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрд╕ рдЪрд░рдг рдХреА рдЬрдЯрд┐рд▓рддрд╛ O ( n рд▓реЙрдЧ рдПрди ) рд╣реИ ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЕрджреНрднреБрдд рдкрд░рд┐рд╡рд░реНрддрди рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ - рдпрд╣ рд╕реАрдзрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рд░ рд╕рдордп рдРрд╕реА рд╕реАрдзреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдирд┐рд░реНрдгрд╛рдпрдХ рд░реВрдк рд╕реЗ рджреВрд╕рд░реЗ рдЪрд░рдг (рдЯреНрд░реА рдЯреНрд░реИрд╡рд░реНрд╕рд▓) рдХреЛ рддреЗрдЬ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдВрддрд┐рдо рд╕реАрдврд╝реА рдХреЛ рдУ ( рдПрди ) рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рдордп рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рд╕рдмрд╕реЗ рдЦрд░рд╛рдм, рдордзреНрдпрдо, рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда) рдХреА рдХреБрд▓ рдЬрдЯрд┐рд▓рддрд╛ рдУ ( рдПрди рд▓реЙрдЧ рдПрди ) рд╣реИ ред

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдЫрдВрдЯрдиреА рдорд░реНрдЬрд╕реЙрд░реНрдЯ, рдХреНрд╡рд┐рдХрд╕реЙрд░реНрдЯ рдФрд░ рдЕрдиреНрдп рд╣реАрдкрд╕реЙрд░реНрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдореА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА рдХреЗ рд╕рд╛рде рдСрдкрд░реЗрд╢рди рдХреЛ рдХреИрд╕реЗ рддреЗрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рдХрд▓реНрдкрд┐рдд рдХрд╣рд╛рдиреА рдХрд╛ рдиреИрддрд┐рдХ рдпрд╣ рд╣реИ: рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЦреЛрдЬ рдкреЗрдбрд╝ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реИ - рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рддреЛ рдЗрд╕реЗ рдЖрддреНрдо-рд╕рдВрддреБрд▓рди рдмрдирд╛рдПрдВред рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ - рдПрдХ рд╢рд╛рдирджрд╛рд░ рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ, рдЕрд░реНрдерд╛рддред рдкреЗрдбрд╝ рдореЗрдВ рдХрд┐рд╕реА рднреА рдиреЛрдб рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ, рдЗрд╕ рдиреЛрдб рдХреЛ рдЬрдбрд╝ рдмрдирд╛рдПрдВред рдмреЗрд╢рдХ, рдЕрдиреНрдп рд╡реИрдХрд▓реНрдкрд┐рдХ рдЖрддреНрдо-рд╕рдВрддреБрд▓рди рдЦреЛрдЬ рдкреЗрдбрд╝ (рд▓рд╛рд▓-рдХрд╛рд▓реЗ рдкреЗрдбрд╝, рдПрд╡реАрдПрд▓ рдкреЗрдбрд╝, рдЖрджрд┐) рд╣реИрдВ, рдЬреЛ рдЕрдзрд┐рдХ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реА рдХреЛрдб


рдирд░реНрд╡рд╕ рджрд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ
/*
 *------------------------------------------------------------
 *
 *      File..........: $RCSfile: splaysort.c,v $
 *      Revision......: $Revision: 1.2 $
 *      Author........: Gary Eddy (gary@cs.mu.OZ.AU)
 *			Alistair Moffat (alistair@cs.mu.OZ.AU)
 *      Date..........: $Date: 1995/09/07 06:19:17 $
 *
 *	Description:
 *		Sorts by repeated insertion into a splay tree.
 *		Insertions are done top down
 *
 *------------------------------------------------------------
 */

#include	<stdio.h>
#include	<stdlib.h>
#include	<malloc.h>
#include	<alloca.h>

char	*sort_name = "Splaysort";
char	*sort_version = "$Revision: 1.2 $";

/*
** Define DATAPTR for the 12 byte per record version of the program.
** Otherwise only 8 extra bytes per record are used and data
** references are done by indexing the data array.
** Different compiler/architecture combinations can cause wild
** variation in the ratio of speeds between these variations.
*/

#define DATAPTR

#ifdef DATAPTR
#define DATA(p) ((p)->data)
#else
#define DATA(p) (A+size*(p-T))
#endif

/*
** With the fast copy option enabled a more intelligent copy is used
** depending on the size of the items being copied.
** This approach adopted from the nqsort program of Bentley and McIlroy,
** see Software Practice and Experience, v23, n11, November 1993, 1249-65.
*/

#define FASTCOPY

#ifdef FASTCOPY
#define COPYCODE(TYPE, parmi, parmj, n) { \
        long i = (n) / sizeof (TYPE); \
        register TYPE *pi = (TYPE *) (parmi); \
        register TYPE *pj = (TYPE *) (parmj); \
        do { \
                *pi++ = *pj++;                    \
        } while (--i > 0);      \
}

void
copyfunc(char *d, char *s, int size, int copytype)
{
        if(copytype <= 1)
                COPYCODE(long, d, s, size)
        else
                COPYCODE(char, d, s, size)
	return;
}

#define COPY(d,s,size) \
        if (copytype == 0) { \
                *(long *)(d) = *(long *)(s); \
        } else \
                copyfunc(d, s, size, copytype)
#else
#define COPY(d,s,size)	memcpy(d,s,size)
#endif

typedef struct  node_rec node;

struct	node_rec {
	node	*left, *rght;
#ifdef DATAPTR
	char	*data;
#endif
};

/*
 *	sort():
 *		The entire sort code 
 *
 *	Accesses outside variables:	none
 *
 *	Return value...:		none
 */

void
sort(void *A, size_t n, size_t size, int (*cmp)(const void *, const void *))
{
	register node *next, *curr, *prnt;
	char 	*item;
	node	*l, *r, *ch;
	node	root, *T, *new, *end, *move;
#ifndef DATAPTR
	char	*p;
#endif

/*
** Determine which copying method will be used.
*/
#ifdef FASTCOPY
	int	copytype=((char *)A - (char *)0) % sizeof(long) ||
		size % sizeof(long) ? 2 : size == sizeof(long) ? 0 : 1;
#endif


	if(n < 2)
		return;
	if((T = new = (node *) malloc(sizeof(*T)*n)) == NULL) {
		fprintf(stderr, "Couldn't allocate space for structure\n");
	}
	/* 
	** Do the first insertion manually to avoid the empty tree
	** case in the main loop.
	*/
	curr = new++;
	item = A;
	curr->left = curr->rght = NULL;
#ifdef DATAPTR
	curr->data = item;
#endif
	item += size;
	end = T+n;
	/*
	** For each item move down the tree dividing it into
	** two subtrees, one containing items less than the new
	** element and the other those which are greater.
	** The pointers l and r refer to the greatest element in the
	** smaller subtree and the smallest element in the large
	** subtree respectively. During the splitting of the tree
	** l and r retain children that may be incorrect in the final
	** tree but these false links are cut at the end of the
	** insertion.
	*/

	for( ; new<end; ) {
		l = r = &root;
		while(curr != NULL) {
			if(cmp(item, DATA(curr)) < 0) {
				/* Left root case */
				if((ch = curr->left) == NULL) {
					r = r->left = curr;
					break;
				}
				/* Left zig-zig */
				else if(cmp(item, DATA(ch)) < 0) {
					curr->left = ch->rght;
					ch->rght = curr;
					r = r->left = ch;
					curr = ch->left;
				}
				/* Left zig-zag */
				else {
					r = r->left = curr;
					l = l->rght = ch;
					curr = ch->rght;
				}
			}
			else {
				/* Right root case */
				if((ch = curr->rght) == NULL) {
					l = l->rght = curr;
					break;
				}
				/* Right zig-zag */
				else if (cmp(item, DATA(ch)) < 0) {
					l = l->rght = curr;
					r = r->left = ch;
					curr = ch->left;
				}
				/* Right zig-zig */
				else {
					curr->rght = ch->left;
					ch->left = curr;
					l = l->rght = ch;
					curr = ch->rght;
				}
			}
		}
		/* Cut false links */
		r->left = l->rght = NULL;
		new->rght = root.left;
		new->left = root.rght;
#ifdef DATAPTR
		new->data = item;
#endif
		curr = new++;
		item += size;
	}
	/* Now copy all of the data back into the input array.
	** Uses an iterative destructive inorder traversal.
	** Last item inserted is the current root.
	*/
	prnt = NULL;
	move = T;
	while (1) {
		if ((next = curr->left) != NULL) {
			/* left subtree exists */
			curr->left = prnt;
			prnt = curr;
			curr = next;
		}
		else {
			next = curr->rght;
			curr->rght = move++;
			if (next != NULL) {
				/* and arrange for a visit */
				if((curr = next->left) != NULL) {
					next->left = prnt;
					prnt = next;
					continue;
				}
				else {
					curr = next;
					continue;
				}
			}
			/* no right subtree either, turn around*/
			if (prnt != NULL) {
				curr = prnt;
				prnt = prnt->left;
				curr->left = NULL;
				continue;
			}
			/* nothing left to be done */
			break;
		}
	}
#ifndef DATAPTR
	/*
	** Change the goes-to array in rght to a comes_from in left.
	** Note the kludge on pointers, where left points into the 
	** character array containing the elements.
	*/
	for(next = T, p = A; next < end; p += size, next++)
		next->rght->left = (node *)p;
	/* and use the `comes from' array to unscramble the permutation */
	item = (char *)malloc(size);
        for (next=T; next<end; next++) {
                char *datacurr, *dataleftcurr, *final;
                if (next->left == NULL)
                        continue;
                curr = next;
                final = datacurr = DATA(curr);
                COPY(item, datacurr, size);
                while ((char *)(curr->left) != final) {
                        dataleftcurr = (char *)(curr->left);
                        COPY(datacurr, dataleftcurr, size);
                        prnt = curr;
                        curr = T + (((char *)(curr->left)-A)/size);
                        prnt->left = NULL;
                        datacurr = dataleftcurr;
                }
                COPY(datacurr, item, size);
                curr->left = NULL;
        }
#else
	/* Change the goes-to array in rght to a comes_from in left */
	for(next = T; next < end; next++)
		next->rght->left = next;
	/* and use the `comes from' array to unscramble the permutation */
	/*
	** This 12 byte version uses the presence of the data pointer
	** by making it the flag for already placed items. This means
	** that left pointers can point to nodes, eliminating the
	** calculation to find the next node.
	*/
	item = (char *)malloc(size);
	for (next=T; next<end; next++) {
		char *datacurr, *dataleftcurr, *final;
		/* second condition guarantees at least one iteration
		** of while loop.
		*/
		if (DATA(next) == (char *) NULL || next->left == next)
			continue;
		final = datacurr = DATA(next);
		curr = next->left;
		COPY(item, datacurr, size);
		while ((dataleftcurr = DATA(curr)) != final) {
			COPY(datacurr, dataleftcurr, size);
			prnt = curr;
			curr = curr->left;
			DATA(prnt) = (char *) NULL;
			datacurr = dataleftcurr;
		}
		COPY(datacurr, item, size);
		DATA(curr) = (char *) NULL;
	}
#endif
	free(item);
	free(T);
} /* sort() */

рдЕрдЧрд▓реА рд╕реАрд░реАрдЬ рдХрд╛ рдЯреНрд░реЗрд▓рд░


рдФрд░ рд╣рдо рдвреЗрд░ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВред рдЕрдЧрд▓реА рдЫреЛрдЯреА рд╕реА рдмрд╛рдд рдЖрдЬ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧреАред рдпрд╣ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдПрдХ рдкреЗрдбрд╝ рдЬреИрд╕реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рдвреЗрд░ рдФрд░ рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА рджреЛрдиреЛрдВ рд╣реИред



рд╕рдВрджрд░реНрдн


рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА , рд╕реЗрдкреНрд▓реЗ рдЯреНрд░реА

рд╕реЗрдкреНрд▓реЗ рдЯреНрд░реА

рд╢реНрд░реГрдВрдЦрд▓рд╛ рд▓реЗрдЦ:



AlgoLab рдореЗрдВ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдПрдХреНрд╕реЗрд▓ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА рдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

All Articles