рдХреИрд╢реЗ-рд╕рдЪреЗрдд рдмрд╛рдЗрдирд░реА рдЦреЛрдЬ

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

рдЕрд╕реНрд╡реАрдХрд░рдг: рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡реА рд╕рдорд╛рдзрд╛рди рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдореИрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреИрд╢ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрдИ, рдЬрдм рдЕрдиреБрдХреВрд▓рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВред рдореИрдВ рдХреИрд╢реЗ-рдХреЙрдиреНрд╕рд┐рдпрд╕ рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдХреЗ рдПрдХ рдЖрджрд░реНрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реВрдВ, рдореИрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдХрд╛рдлреА рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рднреА рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ (рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд░реНрдЯрд┐рд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ N-2 ^ K-1 рдХреЗ рдмрд░рд╛рдмрд░ рд▓реА рдЧрдИ рд╣реИ)ред рдореИрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реА # рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ (рд╕рдордЧреНрд░ рдкреНрд░рджрд░реНрд╢рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЦреНрдп рдЬреЛрд░ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рдмрд╕реЗ рддреЗрдЬ рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрдирд╛рдиреЗ рдкрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХреА рддреБрд▓рдирд╛рддреНрдордХ рд╕рд╛рдкреЗрдХреНрд╖рддрд╛ рдкрд░ рд╣реИ)ред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗрд╡рд▓ рдмрдбрд╝реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рдкреНрд░рднрд╛рд╡реА рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдардХ рдХреЛ рдЗрд╕ рдмрд╛рдд рдХреА рдмреБрдирд┐рдпрд╛рджреА рд╕рдордЭ рд╣реИ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреИрд╢ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЦреЛрдЬ рдХреЗ рд╢рд╛рд╕реНрддреНрд░реАрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рд░рдгреА a рдФрд░ рдХреБрдЫ рддрддреНрд╡ x , рдЬрд┐рд╕реЗ рд╣рдо рдЗрд╕рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ:
 public bool Contains(int x) { int l = 0, r = N - 1; while (l <= r) { int m = (l + r) / 2; if (a[m] == x) return true; if (a[m] > x) r = m - 1; else l = m + 1; } return false; } 
рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдкрд╣рд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд░, рдЙрди рд╕рд░рдгреА рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИрдВред рдЖрдЗрдП 15 рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдЯреНрд░реА рдмрдирд╛рдПрдВ:

рдпрд╣ рдЖрдВрдХрдбрд╝рд╛ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреЗрдбрд╝ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╕рдордп, рдкрд╣рд▓реЗ 7 рд╡реЗрдВ рддрддреНрд╡ рдХреА рдЕрдкреАрд▓ рд╣реЛрдЧреА, рдФрд░ рдлрд┐рд░ ( a[7]!=x рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ a[7]!=x ) рд╕реЗ 3 рдпрд╛ 11 рд╡реЗрдВ рддрдХред рдЗрддрдиреЗ рдЫреЛрдЯреЗ рд╕рд░рдгреА рдкрд░, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмрдбрд╝реЗ рд╕рд░рдгреА рдореЗрдВ, рдпреЗ рдПрдХреНрд╕реЗрд╕ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреИрд╢ рдХреА рд╡рд┐рднрд┐рдиреНрди рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдВрдЧреЗ, рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред рдЖрдЗрдП рддрддреНрд╡реЛрдВ рдХреЛ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╕рд░рдгреА рддрдХ рд▓рдЧрд╛рддрд╛рд░ рдкрд╣реБрдВрдЪ рд╕реНрдореГрддрд┐ рдХреЗ рдирд┐рдХрдЯ рднрд╛рдЧреЛрдВ рдкрд░ рд╣реЛред рдкрд╣рд▓реЗ рд╕рдиреНрдирд┐рдХрдЯрди рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдПрдХ рд╕рд░рд▓ рдЪреМрдбрд╝рд╛рдИ-рдкрд╣рд▓реА рдЦреЛрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рд╡реГрдХреНрд╖ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рд╡реГрдХреНрд╖ рдкрд░ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ:

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

рдЕрдм рдЖрдЗрдП рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрд╕рдВрдзрд╛рди рдХреА рдУрд░ рдмрдврд╝реЗрдВред рдкреНрд░рдпреЛрдЧ рдХреА рд╢реБрджреНрдзрддрд╛ рдФрд░ рд╕рдЯреАрдХ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмреЗрдВрдЪрдорд╛рд░реНрдХрдбреЙрдЯрдиреЗрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдордп рдХреЛ рдорд╛рдкреЗрдВрдЧреЗред рдЖрдЗрдП рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрдХреВрд▓рди (рд╕реНрд░реЛрдд рдХреЛрдб GitHub рдкрд░ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП) рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдП рдЧрдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рдмрд╕реЗ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдмрдЯреНрд░реА рд╣рд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХреНрд▓рд╛рд╕рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдХреИрд╢-рд╕рдЪреЗрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВрдЧреЗ (CacheConsciousSearchK рдКрдВрдЪрд╛рдИ K рдХреЗ рд╕рд╛рде рдПрдХ рдЙрдкрд╢реАрд░реНрд╖рдХ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ)ред рд╣рдо рдкреЗрдбрд╝ рдХреА рдКрдБрдЪрд╛рдИ рдХреЛ 24 рддрдХ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдореЗрд░реА рдорд╢реАрди рдкрд░ (Intel Core i7-3632QM CPU 2.20GHz), рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдереЗ (рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЕрд╕реНрдерд╛рдпреА рдЕрдиреБрдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ):
 // Microsoft.NET 4.5 x64 SimpleSearch : 6725ms CacheConsciousSearch1 : 4428ms CacheConsciousSearch2 : 3963ms CacheConsciousSearch3 : 3778ms CacheConsciousSearch4 : 3774ms CacheConsciousSearch5 : 3762ms 
рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╕реНрд░реЛрдд рдХреЛрдб
 public class CacheConsciousBinarySearchCompetition : BenchmarkCompetition { private const int K = 24, N = (1 << K) - 1, IterationCount = 10000000; private readonly Random random = new Random(); private Tree originalTree; private int[] bfs; protected override void Prepare() { originalTree = new Tree(Enumerable.Range(0, N).Select(x => 2 * x).ToArray()); bfs = originalTree.Bfs(); } [BenchmarkMethod] public void SimpleSearch() { SingleRun(originalTree); } [BenchmarkMethod] public void CacheConsciousSearch1() { SingleRun(new CacheConsciousTree(bfs, 1)); } [BenchmarkMethod] public void CacheConsciousSearch2() { SingleRun(new CacheConsciousTree(bfs, 2)); } [BenchmarkMethod] public void CacheConsciousSearch3() { SingleRun(new CacheConsciousTree(bfs, 3)); } [BenchmarkMethod] public void CacheConsciousSearch4() { SingleRun(new CacheConsciousTree(bfs, 4)); } [BenchmarkMethod] public void CacheConsciousSearch5() { SingleRun(new CacheConsciousTree(bfs, 5)); } private int SingleRun(ITree tree) { int searchedCount = 0; for (int iteration = 0; iteration < IterationCount; iteration++) { int x = random.Next(N * 2); if (tree.Contains(x)) searchedCount++; } return searchedCount; } interface ITree { bool Contains(int x); } class Tree : ITree { private readonly int[] a; public Tree(int[] a) { this.a = a; } public bool Contains(int x) { int l = 0, r = N - 1; while (l <= r) { int m = (l + r) / 2; if (a[m] == x) return true; if (a[m] > x) r = m - 1; else l = m + 1; } return false; } public int[] Bfs() { int[] bfs = new int[N], l = new int[N], r = new int[N]; int tail = 0, head = 0; l[head] = 0; r[head++] = N - 1; while (tail < head) { int m = (l[tail] + r[tail]) / 2; bfs[tail] = a[m]; if (l[tail] < m) { l[head] = l[tail]; r[head++] = m - 1; } if (m < r[tail]) { l[head] = m + 1; r[head++] = r[tail]; } tail++; } return bfs; } } class CacheConsciousTree : ITree { private readonly int[] a; private readonly int level; public CacheConsciousTree(int[] bfs, int level) { this.level = level; int size = (1 << level) - 1, counter = 0; a = new int[N]; var was = new bool[N]; var queue = new int[size]; for (int i = 0; i < N; i++) if (!was[i]) { int head = 0; queue[head++] = i; for (int tail = 0; tail < head; tail++) { a[counter++] = bfs[queue[tail]]; was[queue[tail]] = true; if (queue[tail] * 2 + 1 < N && head < size) queue[head++] = queue[tail] * 2 + 1; if (queue[tail] * 2 + 2 < N && head < size) queue[head++] = queue[tail] * 2 + 2; } } } public bool Contains(int x) { int u = 0, deep = 0, leafCount = 1 << (level - 1); int root = 0, rootOffset = 0; while (deep < K) { int value = a[root + u]; if (value == x) return true; if (++deep % level != 0) { if (value > x) u = 2 * u + 1; else u = 2 * u + 2; } else { int subTreeSize = (1 << Math.Min(level, K - deep)) - 1; if (value > x) rootOffset = rootOffset * leafCount * 2 + (u - leafCount + 1) * 2; else rootOffset = rootOffset * leafCount * 2 + (u - leafCount + 1) * 2 + 1; root = (1 << deep) - 1 + rootOffset * subTreeSize; u = 0; } } return false; } } } 
рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рддрд╣рдд рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдмрд┐рдЯ рдЖрдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ред рд╕рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рджреЗрддреЗ рд╣реИрдВ:

рдореЛрдиреЛ 3.3.0 рдХреЗ рддрд╣рдд, рдкрд░рд┐рдгрд╛рдо рднреА рд╕рдорд╛рди рд╣реЛ рдЧрдП:

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

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

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

Source: https://habr.com/ru/post/In202820/


All Articles