рдПрдл #, рдЬреБрдбрд╝реЗ рдЫрд╡рд┐ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛

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

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

рдкрд░рд┐рдЪрдп


V рдХреЗ рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдШрдЯрдХ C рдРрд╕реЗ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ v рдХрд╛ рдорд╛рди рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрди рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбрд╝рд╛ v рдХреЗ рдорд╛рди рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣ рд▓рд╛рдЬрд┐рдореА рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЪрд▓реЛ рдмрд╕ рддрд╕реНрд╡реАрд░ рджреЗрдЦрддреЗ рд╣реИрдВред рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЫрд╡рд┐ рдХреЗ рдЕрдЧреНрд░рднреВрдорд┐ рдкрд┐рдХреНрд╕рд▓ 1 рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВ , рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдкрд┐рдХреНрд╕реЗрд▓ 0 рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВ ред

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

рдЪрд┐рддреНрд░рд╛ 1: рд▓реЗрдмрд▓ рдХрдиреЗрдХреНрдЯреЗрдб рдШрдЯрдХ

1101110211010102111100020000000233330402000304025503000255030222



рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рджреЛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдиреАрдЪреЗ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред

рдкреБрдирд░рд╛рд╡рд░реНрддреА рд▓реЗрдмрд▓рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо


рд╣рдо рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐-рдЖрдзрд╛рд░рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рджреЗрдЦрдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрдЧрд╛ред

рдПрдХ рд▓реЗрдмрд▓ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ, рдЬрд┐рд╕реЗ рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдХреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВрдЧреЗ, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдпред

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

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

рдЪреВрдВрдХрд┐ рджреНрд╡рд┐рдЖрдпрд╛рдореА рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЫрд╡рд┐рдпрд╛рдВ рджреЛ рдЖрдпрд╛рдореА рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд┐рдЦрддреЗ рд╕рдордп, рдореИрдВ рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реВрдВрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдмрдирд╛рдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдпрд╣рд╛рдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рдд рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ рдореИрдЯреНрд░рд┐рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ

рдЖрдЗрдП рд╣рдо рдПрдл # -рдлрдВрдХреНрд╢рди рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ ред рдЬреБрдбрд╝рд╛ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЫрд╡рд┐ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреБрдирд░рд╛рд╡рд░реНрддреА рд▓реЗрдмрд▓рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо

let recMarkingOfConnectedComponents matrix =

        let copy = Matrix.clone matrix

        let (|Value|Zero|Out|) (x, y) = 
            if x < 0 || y < 0
                || x > (copy.values.[0, *].Length - 1)
                || y > (copy.values.[*, 0].Length - 1) then
                Out
            else
                let row = copy.values.[y, *]
                match row.[x] with
                    | 0 -> Zero
                    | v -> Value(v)

        let rec markBits x y value =
            match (x, y) with
            | Value(v) ->
                if value > v then
                    copy.values.[y, x] <- value
                    markBits (x + 1) y value
                    markBits (x - 1) y value
                    markBits x (y + 1) value
                    markBits x (y - 1) value
            | Zero | Out -> ()

        let mutable value = 2
        copy.values
        |> Array2D.iteri (fun y x v -> if v = 1 then
                                            markBits x y value
                                            value <- value + 1)

        copy 

рд╣рдо recMarkingOfConnectedCompords рдлрд╝рдВрдХреНрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ , рдЬреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рдкреИрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рджреЛ-рдЖрдпрд╛рдореА рд╕рд░рдгреА рд▓реЗрддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдореВрд▓ рд╕рд░рдгреА рдХреЛ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рдЗрд╕рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рдПрдВ, рдЬрд┐рд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред

let copy = Matrix.clone matrix

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

рдЖрдЙрдЯ - рдЕрдиреБрд░реЛрдзрд┐рдд рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд┐-рдЖрдпрд╛рдореА рд╕рд░рдгреА рд╕реЗ рдкрд░реЗ рдЪрд▓рд╛ рдЧрдпрд╛ -
рд╢реВрдиреНрдп рдореЗрдВ рдкреГрд╖реНрдарднреВрдорд┐ рдкрд┐рдХреНрд╕реЗрд▓ (рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░)
рдорд╛рди рд╢рд╛рдорд┐рд▓ рд╣реИ - рдЕрдиреБрд░реЛрдзрд┐рдд рд╕реВрдЪрдХрд╛рдВрдХ рд╕рд░рдгреА рдХреЗ рднреАрддрд░ рд╣реИред

рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЕрдЧрд▓реЗ рдкреБрдирд░рд╛рд╡рд░реНрддрди рдлреНрд░реЗрдо рдореЗрдВ рдЫрд╡рд┐ рдмрд┐рдВрджреБ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЬрд╛рдВрдЪ рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛:

let (|Value|Zero|Out|) (x, y) = 
    if x < 0 || y < 0
        || x > (copy.values.[0, *].Length - 1)
        || y > (copy.values.[*, 0].Length - 1) then
        Out
    else
        let row = copy.values.[y, *]
        match row.[x] with
            | 0 -> Zero
            | v -> Value(v)

MarkBits рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рдкрд┐рдХреНрд╕реЗрд▓ рдФрд░ рдЙрд╕рдХреЗ рд╕рднреА рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ (рдКрдкрд░, рдиреАрдЪреЗ, рдмрд╛рдПрдВ, рджрд╛рдПрдВ) рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:

let rec markBits x y value =
    match (x, y) with
    | Value(v) ->
        if value > v then
            copy.values.[y, x] <- value
            markBits (x + 1) y value
            markBits (x - 1) y value
            markBits x (y + 1) value
            markBits x (y - 1) value
    | Zero | Out -> ()

рдлрд╝рдВрдХреНрд╢рди рдирд┐рдореНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдПрдХ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:

x - рдкрдВрдХреНрддрд┐ рд╕рдВрдЦреНрдпрд╛
y - рд╕реНрддрдВрдн рд╕рдВрдЦреНрдпрд╛
рдорд╛рди - рдкрд┐рдХреНрд╕реЗрд▓

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

if value > v then

рдЕрдиреНрдпрдерд╛, рдЕрдирдВрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реЛрдЧреА рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдЕрдЧрд▓рд╛, рд╡рд░реНрддрдорд╛рди рдорд╛рд░реНрдХрд░ рдорд╛рди рдХреЗ рд╕рд╛рде рдмрд┐рдВрджреБ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ:

copy.values.[y, x] <- value

рдФрд░ рд╣рдо рдЕрдкрдиреЗ рд╕рднреА рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреБрди: рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

markBits (x + 1) y value
markBits (x - 1) y value
markBits x (y + 1) value
markBits x (y - 1) value

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

let mutable value = 2
copy.values
|> Array2D.iteri (fun y x v -> if v = 1 then
                                    markBits x y value
                                    value <- value + 1) 

рдЫрд╡рд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд▓реЗрдмрд▓ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рд╕реЗрдЯ рдХрд░реЗрдВ, рдЬреЛ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдЬреБрдбрд╝реЗ рд╕рдореВрд╣реЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдЧрд╛ред

let mutable value = 2

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЫрд╡рд┐ рдореЗрдВ рд╕рд╛рдордиреЗ рдХреЗ рдкрд┐рдХреНрд╕рд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 1 рдкрд░ рд╕реЗрдЯ рд╣реИрдВ , рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд▓реЗрдмрд▓ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рднреА 1 рд╣реИ , рддреЛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд▓реЗрдмрд▓ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп 1 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, -1 рдХреЗ рд╢реБрд░реБрдЖрддреА рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рд╕рднреА рдкрд┐рдХреНрд╕рд▓ рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ ред рддрдм рд╣рдо рдорд╛рди рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛ рдирд┐рд░реНрдорд╛рдг, Array2D.iteri рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╕рд░рдгреА рдореЗрдВ рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рддрд╛ рд╣реИ , рдФрд░ рдпрджрд┐ рдЦреЛрдЬ рдХреЗ рджреМрд░рд╛рди рдПрдХ рдмрд┐рдВрджреБ 1 рдкрд░ рд╕реЗрдЯ рд╣реИ

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

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

рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

let a = array2D [[1;1;0;1;1;1;0;1]
                 [1;1;0;1;0;1;0;1]
                 [1;1;1;1;0;0;0;1]
                 [0;0;0;0;0;0;0;1]
                 [1;1;1;1;0;1;0;1]
                 [0;0;0;1;0;1;0;1]
                 [1;1;0;1;0;0;0;1]
                 [1;1;0;1;0;1;1;1]]
let A = Matrix.ofArray2D a

let t = System.Diagnostics.Stopwatch.StartNew()
let R = Algorithms.recMarkingOfConnectedComponents A
t.Stop()

printfn "origin =\n %A" A.values
printfn "rec markers =\n %A" R.values
printfn "elapsed recurcive = %O" t.Elapsed 

origin =
 [[1; 1; 0; 1; 1; 1; 0; 1]
 [1; 1; 0; 1; 0; 1; 0; 1]
 [1; 1; 1; 1; 0; 0; 0; 1]
 [0; 0; 0; 0; 0; 0; 0; 1]
 [1; 1; 1; 1; 0; 1; 0; 1]
 [0; 0; 0; 1; 0; 1; 0; 1]
 [1; 1; 0; 1; 0; 0; 0; 1]
 [1; 1; 0; 1; 0; 1; 1; 1]]

rec markers =
 [[2; 2; 0; 2; 2; 2; 0; 3]
 [2; 2; 0; 2; 0; 2; 0; 3]
 [2; 2; 2; 2; 0; 0; 0; 3]
 [0; 0; 0; 0; 0; 0; 0; 3]
 [4; 4; 4; 4; 0; 5; 0; 3]
 [0; 0; 0; 4; 0; 5; 0; 3]
 [6; 6; 0; 4; 0; 0; 0; 3]
 [6; 6; 0; 4; 0; 3; 3; 3]]

elapsed recurcive = 00:00:00.0037342

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

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

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЯреЗрд▓ рд░рд┐рдХрд░реНрд╕рди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЯреЗрд▓ рд░рд┐рдХрд░реНрд╕рди рдХреА рджреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВ:

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

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреБрдирд░рд╛рд╡рд░реНрддрди рдХреЛрдИ рдЕрдВрддрд┐рдо рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╕ рдПрдХ рджреНрд╡рд┐-рдЖрдпрд╛рдореА рд╕рд░рдгреА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдХреЗ рдкрд░рд┐рд╡реГрддреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд╣рдо 4 рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рднреА рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдмрд┐рдВрджреБ рдХреЗ рд╕рднреА рдЪрд╛рд░ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЦреЛрдЬреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬреБрдбрд╝реЗ рдШрдЯрдХреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рд╕реНрддреНрд░реАрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рдЕрдиреНрдп рдирд╛рдо рднреА рд╣реИ, "рдкреНрд░рдЧрддрд┐рд╢реАрд▓ рдЕрдВрдХрди рдХрд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо" рдФрд░ рдпрд╣рд╛рдВ рд╣рдо рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред
. . . , , .

рдКрдкрд░ рджреА рдЧрдИ рдкрд░рд┐рднрд╛рд╖рд╛ рдФрд░ рднреА рдЕрдзрд┐рдХ рднреНрд░рд╛рдордХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдФрд░ рджреВрд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред

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

рдЪрд┐рддреНрд░рд╛ 2: рдЪрд╛рд░ рдЬреБрдбрд╝реЗ рдШрдЯрдХ
\ рд╢реБрд░реВ {рдореИрдЯреНрд░рд┐рдХреНрд╕} рдЪрд┐рддреНрд░рд╛ 2: рдЖрда рд╕реЗ рдЬреБрдбрд╝реЗ рдШрдЯрдХ \ рд╢реБрд░реВ {рдореИрдЯреНрд░рд┐рдХреНрд╕} рдкрд╣рд▓реА рддрд╕реНрд╡реАрд░ рдЪрд╛рд░-рдЬреБрдбрд╝реЗ рдШрдЯрдХ рджрд┐рдЦрд╛рддреА рд╣реИ
12тИЧ34



1234тИЧ5678

рдЕрдВрдХ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╡рд░реНрддрдорд╛рди рдмрд┐рдВрджреБ (рдмрд╛рдПрдВ, рджрд╛рдПрдВ, рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ) рдХреЗ 4 рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдПрдХ рдмрд┐рдВрджреБ рдХреЗ рдЖрда-рдЬреБрдбрд╝реЗ рдШрдЯрдХ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ 8 рдкрдбрд╝реЛрд╕реА рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЪрд╛рд░-рдЬреБрдбрд╝реЗ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред

рдЕрдм рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╕реЗрдЯреЛрдВ рдкрд░ рдирд┐рд░реНрдорд┐рдд рдЦреЛрдЬ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреНрдпрд╛ рд╣реИ ?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╕реЗрдЯ рд╣реИрдВ

(1,2,3,4,8)(5,6,7)


рдпреЗ рд╕реЗрдЯ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреЗрдбрд╝реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:





рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗрдЯ рдореЗрдВ рдиреЛрдбреНрд╕ 3 рдореВрд▓ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдиреЛрдбреНрд╕ рдореЗрдВ 6.

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

рдЪрд┐рддреНрд░ 4: рдЦреЛрдЬ-рд╕рдВрдШ
\ _ {рдореИрдЯреНрд░рд┐рдХреНрд╕} рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдКрдкрд░ рджреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦреЗрдВ рдФрд░ рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рд╕реЗрдЯ рдкреЗрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдмрдВрдз рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ,рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ 3 , рд╕рдВрдЦреНрдпрд╛ 0 рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ
1234567823037703


рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдореЗрдВред рдФрд░ рдкрд╣рд▓реЗ рдкреЗрдбрд╝ рдореЗрдВ, рд╕рдВрдЦреНрдпрд╛ 3 рдкрд╣рд▓реЗ рд╕реЗрдЯ рдХреА рдЬрдбрд╝ рд╣реИред рд╕рд╛рджреГрд╢реНрдп рд╕реЗ, рдЖрдк рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рд╕реЗ рд╕рдВрдЦреНрдпрд╛ 7 рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рд╕реЗ рд╕рдВрдЦреНрдпрд╛ 0 рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ ред 7 рдирдВрдмрд░ рджреВрд╕рд░реЗ рд╕реЗрдЯ рдХреЗ рдкреЗрдбрд╝ рдХреА рдЬрдбрд╝ рднреА рд╣реИред

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

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

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

рд╣рдо рддрд╛рд▓рд┐рдХрд╛ рдХреЛ PARENT рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓-рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ ред рдЕрдЧрд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЦреЛрдЬ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рд▓реЗрдмрд▓ рдПрдХреНрд╕ рдХреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдЧрд╛рдФрд░ рдХреА рдПрдХ рд╕рд░рдгреА PARENT ред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреЗрдбрд╝ рдХреА рдЬрдбрд╝ рддрдХ рдореВрд▓ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреА рд╣реИ рдФрд░ рдкреЗрдбрд╝ рдХреЗ рдореВрд▓ рдиреЛрдб рдХреЗ рд▓реЗрдмрд▓ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреА рд╣реИ рдХрд┐ X рдХрд┐рд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ ред

 ╠Ж   ╠Ж  .
X тАФ  
PARENT тАФ , ╠Ж    -

procedure find(X, PARENT);
{
j := X;
while PARENT[j] <> 0
    j := PARENT[j]; return(j);
}

рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ F # рдкрд░ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
let rec find x =
    let index = Array.tryFindIndex ((=)x) parents.[0, *]
    match index with
    | Some(i) -> 
        match parents.[1, i] with
        | p when p <> 0 -> find p
        | _ -> x
    | None -> x 

рдпрд╣рд╛рдВ рд╣рдо рдЦреЛрдЬ рдХреЗ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдп рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ , рдЬреЛ рд╡рд░реНрддрдорд╛рди рд▓реЗрдмрд▓ рдПрдХреНрд╕ рдХреЛ рд▓реЗрддрд╛ рд╣реИ ред PARRENT рд╕рд░рдгреА рдпрд╣рд╛рдВ рд╕реЗ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реБрдИ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реИрд╢реНрд╡рд┐рдХ рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реЗ рджреЗрдЦрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдлрд╝рдВрдХреНрд╢рди рд╢реАрд░реНрд╖ рд░реЗрдЦрд╛ рдкрд░ рд▓реЗрдмрд▓ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдореВрд▓ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдиреАрдЪреЗ рдХреА рд░реЗрдЦрд╛ рдкрд░ рд╕реНрдерд┐рдд рд╣реИред

let index = Array.tryFindIndex ((=)x) parents.[0, *]

рдпрджрд┐ рдЦреЛрдЬ рд╕рдлрд▓ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рдЗрд╕рдХреЗ рдЕрднрд┐рднрд╛рд╡рдХ рд╕реЗ рдорд┐рд▓рддреЗ рд╣реИрдВ рдФрд░ 0 рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ ред рдпрджрд┐ рдорд╛рддрд╛-рдкрд┐рддрд╛ 0 рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ , рддреЛ рдЗрд╕ рдиреЛрдб рдореЗрдВ рднреА рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рддрдм рддрдХ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдкреИрд░реЗрдВрдЯ 0 рдХреЗ рдмрд░рд╛рдмрд░ рди рд╣реЛ ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рд╕реЗрдЯ рдХрд╛ рд░реВрдЯ рдиреЛрдб рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред

match index with
    | Some(i) -> 
        match parents.[1, i] with
        | p when p <> 0 -> find p
        | _ -> x
    | None -> x 

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

   .
X тАФ ,   .
Y тАФ ,   .
PARENT тАФ , ╠Ж    -.

procedure union(X, Y, PARENT);
{
j := X;
k := Y;
while PARENT[j] <> 0
    j := PARENT[j];
while PARENT[k]] <> 0
    k := PARENT[k];

if j <> k then PARENT[k] := j;
} 

рдПрдл # рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ
let union x y =
    let j = find x
    let k = find y
    if j <> k then parents.[1, k-1] <- j 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди рдпрд╣рд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

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

let neighbors_labels x y =
    match (x, y) with
    | (0, 0) -> []
    | (0, _) -> [step1.[0, y-1]]
    | (_, 0) -> [step1.[x-1, 0]]
    | _ -> [step1.[x, y-1]; step1.[x-1, y]]
    |> List.filter ((<>)0) 

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

|> List.filter ((<>)0)

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

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

рдЪрд┐рддреНрд░ 5: рдореВрд▓ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЫрд╡рд┐
рд╕рдВрд╕рд╛рдзрди рд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЦрд╛рд▓реА рд╕рд╛рд░рд┐рдгреА рдирд┐рд░реНрдорд┐рддрдЪрд░рдг 1, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реА рдкрд╛рд╕ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪрд┐рддреНрд░ 6: рдкреНрд░рд╛рдердорд┐рдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░рдг 1 рдХреЛ рд░реЛрдХреЗрдВ
1101110111010101111100010000000111110101000101011101000111010111





0000000000000000000000000000000000000000000000000000000000000000


рдкреНрд░рд╛рдердорд┐рдХ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рдкрд╣рд▓реЗ рдХреБрдЫ рдЪрд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (рдореВрд▓ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЫрд╡рд┐ рдХреА рдХреЗрд╡рд▓ рдкрд╣рд▓реА рддреАрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ)ред

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рдПрдХ рдХрджрдо-рджрд░-рдЪрд░рдг рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдЪрд▓реЛ рдЫрджреНрдо-рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ рдЬреЛ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред

     .
B тАФ   .
LB тАФ   .

procedure classical_with_union-find(B, LB);
{
тАЬ  .тАЭ initialize();
тАЬ  1 ╠Ж  L     .тАЭ
for L := 0 to MaxRow
{
тАЬ     L  тАЭ
for P := 0 to MaxCol
    LB[L,P] := 0;
тАЬ  L.тАЭ
for P := 0 to MaxCol
    if B[L,P] == 1 then
    {
        A := prior_neighbors(L,P);
        if isempty(A)
        then {M := label; label := label + 1;};
        else M := min(labels(A));
        LB[L,P] := M;
        for X in labels(A) and X <> M
           union(M, X, PARENT);
    }
}
тАЬ  2 ,    1,     .тАЭ
for L := 0 to MaxRow
    for P := 0 to MaxCol
        if B[L, P] == 1
        then LB[L,P] := find(LB[L,P], PARENT);
};
      LB ( step1)     ( ).


рдЪрд┐рддреНрд░ 7: рдЪрд░рдг 1. рдмрд┐рдВрджреБ (0,0), рд▓реЗрдмрд▓ = 1
100000000000000000000000

рдЪрд┐рддреНрд░ 8: рдЪрд░рдг 2. рдмрд┐рдВрджреБ (1,0), рд▓реЗрдмрд▓ = 1
110000000000000000000000

рдЪрд┐рддреНрд░рд╛ 9: рдЪрд░рдг 2. рдмрд┐рдВрджреБ (2.0), рд▓реЗрдмрд▓ = 1
110000000000000000000000

рдЪрд┐рддреНрд░рд╛ 10: рдЪрд░рдг 4. рдмрд┐рдВрджреБ (3.0), рд▓реЗрдмрд▓ = 2
110200000000000000000000

рдЪрд┐рддреНрд░ 11: рдЕрдВрддрд┐рдо рдЪрд░рдг, рдкреНрд░рдердо рдЙрддреНрддреАрд░реНрдг рдХрд╛ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо
1102220311020203111100030000000344440503000405036604000366040773

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореВрд▓ рдЫрд╡рд┐ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рджреЛ рд╕реЗрдЯ рдорд┐рд▓реЗ

(1,2)тИТ(3,7)


рджреГрд╖реНрдЯрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдЗрд╕реЗ рдЕрдВрдХ 1 рдФрд░ 2 (рдЕрдВрдХреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (1,3) рдФрд░ (2,3) ) рдФрд░ рдЕрдВрдХ 3 рдФрд░ 7 (рдЕрдВрдХреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (7,7) рдФрд░ (7,6) ) рдХреЗ рд╕рдВрдкрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдЦреЛрдЬ-рд╕рдВрдШ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред

рдЪрд┐рддреНрд░ 12: рдЦреЛрдЬ рдПрдХрддреНрд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрдореНрдкреНрдпреВрдЯреЗрдб рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛
12345670100003

рдЕрдВрдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрд╡рд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВред

рдЪрд┐рддреНрд░ 13: рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо
1101110311010103111100030000000344440503000405036604000366040333

рдЕрдм рд╕рднреА рдЬреБрдбрд╝реЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрджреНрд╡рд┐рддреАрдп рд▓реЗрдмрд▓ рд╣реИрдВ рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдмрд╛рдж рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдл # рдХреЛрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ
let markingOfConnectedComponents matrix =

    // up to 10 markers
    let parents = Array2D.init 2 10 (fun x y -> if x = 0 then y+1 else 0)

    // create a zero initialized copy
    let step1 = (Matrix.cloneO matrix).values

    let rec find x =
        let index = Array.tryFindIndex ((=)x) parents.[0, *]
        match index with
        | Some(i) -> 
            match parents.[1, i] with
            | p when p <> 0 -> find p
            | _ -> x
        | None -> x

    let union x y =
        let j = find x
        let k = find y
        if j <> k then parents.[1, k-1] <- j

    // returns up and left neighbors of pixel
    let neighbors_labels x y =
        match (x, y) with
        | (0, 0) -> []
        | (0, _) -> [step1.[0, y-1]]
        | (_, 0) -> [step1.[x-1, 0]]
        | _ -> [step1.[x, y-1]; step1.[x-1, y]]
        |> List.filter ((<>)0)

    let mutable label = 0
    matrix.values
    |> Array2D.iteri (fun x y v ->
                        if v = 1 then
                            let n = neighbors_labels x y
                            let m = if n.IsEmpty then
                                        label <- label + 1
                                        label
                                    else
                                        n |> List.min
                            n |> List.iter (fun v -> if v <> m then union m v)
                            step1.[x, y] <- m)

    let step2 = matrix.values
                |> Array2D.mapi (fun x y v ->
                        if v = 1 then step1.[x, y] <- find step1.[x, y]
                        step1.[x, y])

    { values = step2 } 

рдХреЛрдб рдХрд╛ рдПрдХ рд▓рд╛рдЗрди-рдмрд╛рдп-рд▓рд╛рдЗрди рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЕрдм рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣рд╛рдВ рдЖрдк рдмрд╕ # рдХреЛрдб рдХреЛ рдЫрджреНрдо рдХреЛрдб рдореЗрдВ рдореИрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХреЗ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо


рдЖрдЗрдП рджреЛрдиреЛрдВ рдПрд▓реНрдЧреЛрд░рд┐рджрдо (рдкреБрдирд░рд╛рд╡рд░реНрддреА рдФрд░ рдкрдВрдХреНрддрд┐-рд╡рд╛рд░) рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЧрддрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред
let a = array2D [[1;1;0;1;1;1;0;1]
                 [1;1;0;1;0;1;0;1]
                 [1;1;1;1;0;0;0;1]
                 [0;0;0;0;0;0;0;1]
                 [1;1;1;1;0;1;0;1]
                 [0;0;0;1;0;1;0;1]
                 [1;1;0;1;0;0;0;1]
                 [1;1;0;1;0;1;1;1]]
let A = Matrix.ofArray2D a

let t1 = System.Diagnostics.Stopwatch.StartNew()
let R1 = Algorithms.markingOfConnectedComponents A
t1.Stop()

let t2 = System.Diagnostics.Stopwatch.StartNew()
let R2 = Algorithms.recMarkingOfConnectedComponents A
t2.Stop()

printfn "origin =\n %A" A.values
printfn "markers =\n %A" R1.values
printfn "rec markers =\n %A" R2.values

printfn "elapsed lines = %O" t1.Elapsed
printfn "elapsed recurcive = %O" t2.Elapsed 

origin =
 [[1; 1; 0; 1; 1; 1; 0; 1]
 [1; 1; 0; 1; 0; 1; 0; 1]
 [1; 1; 1; 1; 0; 0; 0; 1]
 [0; 0; 0; 0; 0; 0; 0; 1]
 [1; 1; 1; 1; 0; 1; 0; 1]
 [0; 0; 0; 1; 0; 1; 0; 1]
 [1; 1; 0; 1; 0; 0; 0; 1]
 [1; 1; 0; 1; 0; 1; 1; 1]]
markers =
 [[1; 1; 0; 1; 1; 1; 0; 3]
 [1; 1; 0; 1; 0; 1; 0; 3]
 [1; 1; 1; 1; 0; 0; 0; 3]
 [0; 0; 0; 0; 0; 0; 0; 3]
 [4; 4; 4; 4; 0; 5; 0; 3]
 [0; 0; 0; 4; 0; 5; 0; 3]
 [6; 6; 0; 4; 0; 0; 0; 3]
 [6; 6; 0; 4; 0; 3; 3; 3]]
rec markers =
 [[2; 2; 0; 2; 2; 2; 0; 3]
 [2; 2; 0; 2; 0; 2; 0; 3]
 [2; 2; 2; 2; 0; 0; 0; 3]
 [0; 0; 0; 0; 0; 0; 0; 3]
 [4; 4; 4; 4; 0; 5; 0; 3]
 [0; 0; 0; 4; 0; 5; 0; 3]
 [6; 6; 0; 4; 0; 0; 0; 3]
 [6; 6; 0; 4; 0; 3; 3; 3]]
elapsed lines = 00:00:00.0081837
elapsed recurcive = 00:00:00.0038338

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреБрдирд░рд╛рд╡рд░реНрддреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдЧрддрд┐ рд▓рд╛рдЗрди-рдмрд╛рдп-рд▓рд╛рдЗрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдЧрддрд┐ рд╕реЗ рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣реА рд╣рдо рдареЛрд╕ рд░рдВрдЧ рд╕реЗ рднрд░реЗ рдПрдХ рдЪрд┐рддреНрд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕рдХреЗ рдЖрдХрд╛рд░ рдХреЛ 100x100 рдкрд┐рдХреНрд╕реЗрд▓ рддрдХ рдмрдврд╝рд╛ рджреЗрдВрдЧреЗред
let a = Array2D.create 100 100 1
let A = Matrix.ofArray2D a

let t1 = System.Diagnostics.Stopwatch.StartNew()
let R1 = Algorithms.markingOfConnectedComponents A
t1.Stop()
printfn "elapsed lines = %O" t1.Elapsed

let t2 = System.Diagnostics.Stopwatch.StartNew()
let R2 = Algorithms.recMarkingOfConnectedComponents A
t2.Stop()
printfn "elapsed recurcive = %O" t2.Elapsed 

elapsed lines = 00:00:00.0131790
elapsed recurcive = 00:00:00.2632489

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкреБрдирд░рд╛рд╡рд░реНрддреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░реИрдЦрд┐рдХ рд╕реЗ 25 рдЧреБрдирд╛ рдзреАрдорд╛ рд╣реИред рдЖрдЗрдП рддрд╕реНрд╡реАрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ 200x200 рдкрд┐рдХреНрд╕реЗрд▓ рддрдХ рдмрдврд╝рд╛рдПрдВред
elapsed lines = 00:00:00.0269896
elapsed recurcive = 00:00:06.1033132

рдЕрдВрддрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рд╕реМ рдмрд╛рд░ рд╣реИред рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 300x300 рдкрд┐рдХреНрд╕рд▓ рдХреЗ рдЖрдХрд╛рд░ рдкрд░, рдкреБрдирд░рд╛рд╡рд░реНрддреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдПрдХ рд╕реНрдЯреИрдХ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

рд╕рд╛рд░рд╛рдВрд╢


рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ, рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреБрдбрд╝реЗ рдШрдЯрдХреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдПрдл # рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рдВрдЪ рдХреА рдЧрдИ рдереАред рдпрд╣рд╛рдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдФрд░ рд╢рд╛рд╕реНрддреНрд░реАрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рдереЗ, рдЙрдирдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рддреБрд▓рдирд╛рддреНрдордХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдпрд╣рд╛рдБ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЬреАрдердм рдкрд░ рднреА рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
ред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдл # рдФрд░ рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ред

All Articles