рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рдПрд▓рдПрд╕рдбреА рд╕реЙрд░реНрдЯ (рд░реЗрдбрд┐рдХреНрд╕ рд╕реЙрд░реНрдЯ)



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

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

рдЗрд╕рд▓рд┐рдП, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЫрдВрдЯрд╛рдИ рдЯрд┐рдХрд╛рдК рд╣реИред рд╣рдо рдкреВрд░реНрдгрд╛рдВрдХ 32 рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВрдЧреЗред рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ ~ (n + 4KB) рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХреБрдЫ рд╣рдж рддрдХ рдмреЗрдХрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдХреБрдЫ рд╡реГрджреНрдзрд┐ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

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

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

рдореЗрдореЛрд░реА рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рдЫрдВрдЯрдиреА рд╣реЛрддреА рд╣реИред

//================================================== // RADIX  (  by rebuilder) //   ,  . //   (n),   ~(n+4k) //================================================== procedure RSort(var m: array of Longword); //-------------------------------------------------- procedure Sort_step(var source, dest, offset: array of Longword; const num: Byte); var i,temp : Longword; k : Byte; begin for i := High(source) downto 0 do begin temp := source[i]; k := temp SHR num; dec(offset[k]); dest[offset[k]] := temp; end; end; //-------------------------------------------------- //    ,     var s : array[0..3] of array[0..255] of Longword; i,k : longword; //     k offset : array[0..3] of byte absolute k; m_temp : array of Longword; begin SetLength(m_temp, Length(m)); //    FillChar(s[0], 256 * 4 * SizeOf(Longword), 0); //   for i := 0 to High(m) do begin k := m[i]; Inc(s[0,offset[0]]); Inc(s[1,offset[1]]); Inc(s[2,offset[2]]); Inc(s[3,offset[3]]); end; //     for i := 1 to 255 do begin Inc(s[0,i], s[0,i-1]); Inc(s[1,i], s[1,i-1]); Inc(s[2,i], s[2,i-1]); Inc(s[3,i], s[3,i-1]); end; //         Sort_step(m, m_temp, s[0], 0); Sort_step(m_temp, m, s[1], 8); Sort_step(m, m_temp, s[2], 16); Sort_step(m_temp, m, s[3], 24); SetLength(m_temp, 0); end; //================================================== ... SetLength(m, n); for i := 0 to n - 1 do m[i] := Random(65536 * 65536); ... RSort(m); ... 

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

рдирд┐рд╖реНрдкрд╛рджрди рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рджреЛ рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВ:

  1. рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП (рдЖрда рдмрд╛рдЗрдирд░реА рдЕрдВрдХ - 1 рдмрд╛рдЗрдЯ (рдЗрд╖реНрдЯрддрдо рдореВрд▓реНрдп)), рдЧрд┐рдирддреА рдХреЗ рджреНрд╡рд╛рд░рд╛, рдПрдХ рдирдП рд╕рд░рдгреА рдореЗрдВ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред
  2. рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ (рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реЗ рдЙрдЪреНрдЪрддрдо), рдпрд╣ рдкрд╣рд▓реЗ рдХреА рдЧрдгрдирд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред

рд╕реБрдзрд╛рд░:

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

рдЗрд╕рдХреА рд╕рд╛рджрдЧреА рдХреЗ рдХрд╛рд░рдг, рдХреЛрдб рд▓рдЧрднрдЧ 32 рдФрд░ 64 рдмрд┐рдЯ рд╕рдВрдХрд▓рдХ рджреЛрдиреЛрдВ рдХреА рдЧрддрд┐ рдореЗрдВ рд╕рдорд╛рди рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ 16 рдФрд░ 64 рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

64-рдмрд┐рдЯ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо (рдФрд╕рддрди рджрд╕ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ) рдкрд░ рддреНрд╡рд░рд┐рдд рдЫрдБрдЯрд╛рдИ рдХреЗ рд╕рд╛рде рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдирдореВрдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рддреБрд▓рдирд╛ред



рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕реБрдЭрд╛рд╡ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рд╣реИрдВред

рдЖрдкрдХрд╛ рдзрдиреНрдпрд╡рд╛рдж

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


All Articles