рдЕрдЬрдЧрд░ рдЙрдкрд╕рд░реНрдЧ рдкреЗрдбрд╝

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

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

рдкрд╛рдпрдерди 2.6-3.3 рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпреВрдирд┐рдХреЛрдб, рдПрд▓рдЬреАрдкреАрдПрд▓ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред



рдбреЗрдЯреНрд░реА рд▓рд┐рдмрдбрд╛рдЯреНрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░ рд╕рд╛рдЗрдерди рд░реИрдкрд░ рд╣реИред рд▓рд┐рдмрдбрд╛рдЯреНрд░реА рдЙрдкрд╕рд░реНрдЧ рд╡реГрдХреНрд╖ рдХреЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдиреЛрдбреНрд╕ рдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЛ рд╡рд┐рд╢реЗрд╖ 2 рд╕рд░рдгрд┐рдпреЛрдВ + рдкреНрд░рддреНрдпрдп рд╕рдВрдкреАрдбрд╝рди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╢рд╛рдЦрд╛рдПрдВ рдЬреЛ рд╢рд╛рдЦрд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ "рдкреВрдВрдЫ" рдХреЗ рдПрдХ рдФрд░ рдЕрд▓рдЧ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдпрд╣ рдЯреНрд░рд╛рдЗ (HAT-trie рдФрд░ рдЗрддрдиреЗ рдкрд░ рддреЗрдЬ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдХрд╛ рдПрдХ "рдХрд▓рд╛ рдХрд╛ рд░рд╛рдЬреНрдп" рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдХрд▓реНрдк рдХрд╛рдлреА рддреЗрдЬ / рдХреБрд╢рд▓ рд╣реИ рдФрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рддреИрдпрд╛рд░-рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде (рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдХрд┐рд╕реА рднреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдорд╛рд░ рд╕рдХрддрд╛ рд╣реИ)ред

рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП рддреНрд░рд┐-рдЖрдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдореМрдЬреВрджрд╛ рд╡рд┐рдХрд▓реНрдк рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рдереЗред рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдкрд╛рдпрдереЛрдирд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕реНрдореГрддрд┐ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╡реЗ рддреБрд░рдВрдд рдмрд╣ рдЧрдПред рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП рддреНрд░рд┐-рдЖрдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:



рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдФрд░ рд╣реЛ, рд▓реЗрдХрд┐рди, рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ "рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛, рдпрд╣ рд╕рднреА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!" рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдЦреЛрдЬ рдкрд╛рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕реА рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдФрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреА рдХрдореА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдЗрдереЙрди рдФрд░ рдкрд╛рдпрдерди рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реЛрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП trie рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред

рд╕реНрдерд╛рдкрдирд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп рд╣реЛрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ):

pip install datrie

рдирд┐рд░реНрдорд╛рдг:

 import string import datrie trie = datrie.Trie(string.ascii_lowercase) 


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

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

рдлрд┐рд░ trie рдХреЗ рд╕рд╛рде рдЖрдк рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 >>> trie[u'foo'] = 5 >>> trie[u'foobar'] = 10 >>> trie[u'bar'] = 'bar value' >>> trie.setdefault(u'foobar', 15) 10 >>> u'foo' in trie True >>> trie[u'foo'] 5 

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

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

рдПрдХ рддрддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди, рдореЗрдВ рдЬрд╛рдБрдЪ рдХрд░рдирд╛, рдПрдХ рдорд╛рдирдХ рд╢рдмреНрджрдХреЛрд╢ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдФрд╕рдд 2-3 рдЧреБрдирд╛ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдПрдХ рддрддреНрд╡ рдХреЗ рдХрд╛рдо рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдирд╛ (рдпрд╛рдиреА рдЬрд▓реНрджреА рд╕реЗ, рдореЗрд░реЗ рдмреАрдЪ рдореЗрдВ рдпрд╣ рдкреВрд░реНрд╡реЛрдХреНрдд рддреНрд░рд┐ рдХреЗ рд▓рд┐рдП 1 рд╕реЗ 3 рдорд┐рд▓рд┐рдпрди рд╕рдВрдЪрд╛рд▓рди рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд╕реЗ рд╣реИ)ред рдПрдХ рдЕрдкрд╡рд╛рдж рддреАрдиреЛрдВ рдореЗрдВ рдПрдХ рдирдП рдореВрд▓реНрдп рдХрд╛ рд╕рдореНрдорд┐рд▓рди рд╣реИ, рдпрд╣ рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рд░реВрд╕реА рдФрд░ рдЕрдВрдЧреНрд░реЗрдЬреА рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рддреНрд░рд┐ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд▓рдЧрднрдЧ 50 рд╣рдЬрд╛рд░ рдСрдкрд░реЗрд╢рди)ред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдРрд╕реЗ рдбреЗрдЯрд╛ рдкрд░ рддреАрдиреЛрдВ рд░реИрдо рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЬрдЧрд╣ рд▓реЗрддреЗ рд╣реИрдВ: 3-5M (рджреБрднрд╛рд╖рд┐рдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ) рдмрдирд╛рдо 20M + рдПрдХ рдирд┐рдпрдорд┐рдд рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ (рдореИрдВрдиреЗ рд╕реНрдореГрддрд┐ рдЕрдирд╛рдбрд╝реА рдХреЛ рдорд╛рдкрд╛ рдФрд░ рдореИрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рдЙрдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛) ред

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

рддрд╛рдХрд┐ рдпрд╣ рдЫрджреНрдо-рд░реАрдб-рдУрдирд▓реА рдмрд╣реБрдд рд╢рд░реНрдордирд╛рдХ рди рд╣реЛ, рдЯреНрд░рд╛рдИ рдХреЛ рдПрдХ рдлрд╛рдЗрд▓ рдореЗрдВ рд╕реЗрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдлрд╛рдЗрд▓ рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 >>> trie.save('my.trie') >>> trie2 = datrie.Trie.load('my.trie') 


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

рдЖрдк рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рддреНрд░рд┐ рдореЗрдВ рдРрд╕реЗ рддрддреНрд╡ рд╣реИрдВ рдЬрд┐рдирдХреА рдХреБрдВрдЬреА рдЗрд╕ рдЙрдкрд╕рд░реНрдЧ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ (рдпрд╣ рдЪреЗрдХ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реЗ рднреА рддреЗрдЬ рд╣реИ):

 >>> trie.has_keys_with_prefix(u'fo') True 


рдЖрдк рдЗрд╕ рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рднреА рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЛ рдвреВрдБрдв рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рддреНрд░рд┐ рдореЗрдВ рд╣реИрдВ (рдпрд╣ рдзреАрдореА рд╣реИ, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ - 500-600 рд╣рдЬрд╛рд░ рдСрдкрд░реЗрд╢рди / рд╕реЗрдХрдВрдб):

 >>> trie.prefixes(u'foobarbaz') [u'foo', u'foobar'] >>> trie.prefix_items(u'foobarbaz') [(u'foo', 5), (u'foobar', 10)] 


рдЖрдк рдЙрди рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдХреБрдВрдЬреА рдЗрд╕ рд▓рд╛рдЗрди рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ:

 >>> trie.keys(u'fo') [u'foo', u'foobar'] >>> trie.items(u'fo') [(u'foo', 5), (u'foobar', 10)] >>> trie.values(u'foob') [10] 


рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рдЕрдм тАЛтАЛрдирд┐рд░реНрдорд╛рдг рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрдЬрд╛рдп рдЦреЛрдЬ рдХреЗ, рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдЕрдм рдЧрддрд┐ рд▓рдЧрднрдЧ 150-300 рд╣рдЬрд╛рд░ рдорд╛рди / рд╕реЗрдХрдВрдб рдереА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рдВрдмрд╛рдИ 7 рдХреЗ рдЙрдкрд╕рд░реНрдЧ рдФрд░ 3 рдорд╛рдиреЛрдВ рдХреА рдФрд╕рдд рдХреЗ рд╕рд╛рде, рдпрд╣ 70 рд╣рдЬрд╛рд░ рдСрдкрд░реЗрд╢рди / рд╕реЗрдХрдВрдб рд╣реИ)ред

Datrie.Trie рдореЗрдВ рдЕрднреА рднреА рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ, рдЙрди рдкрд░ рдорджрдж рдФрд░ рдЧрддрд┐ рдорд╛рдк рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░рд┐рдгрд╛рдо рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ README рдореЗрдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

Pypy рдХреЗ рддрд╣рдд, рд╕рдм рдХреБрдЫ рдбреЗрдмрд┐рдпрди рдкрд░ рд╢реБрд░реВ рд╣реБрдЖ (cpython рдХреЗ рдореБрдХрд╛рдмрд▓реЗ 10 рдЧреБрдирд╛ рдзреАрдорд╛); рдкреЗрдкреА рдХреЗ рдиреАрдЪреЗ рдПрдХ рдЦрд╕рдЦрд╕ тАЛтАЛрдкрд░ рдпрд╣ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдЖ (рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрдЬрдЧрд░ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдПрдХ рдЦрд╕рдЦрд╕, рдФрд░ рд▓рд┐рдирдХреНрд╕ рдкрд░, рдФрд░ рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреЗ рдиреАрдЪреЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП)ред C API - pypy рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣рдореЗрд╢рд╛ рдзреАрдорд╛ рд░рд╣реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ cpyext рдмреИрд╕рд╛рдЦреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рд╛рдЗрдерди рд╕реА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдПрдкреАрдЖрдИ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЖрдк ctypes рдореЗрдВ рдПрдХ рдЖрд╡рд░рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рдпрдорд┐рдд рдЕрдЬрдЧрд░ рдХреЗ рддрд╣рдд рдзреАрдорд╛ рд╣реЛрдЧрд╛ (рдФрд░ рдпрд╣ рддрдереНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ pypy рдХреЗ рддрд╣рдд рддреЗрдЬреА рд╕реЗ) + ctypes рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рддрд░рд┐рдд рдХрд░рдирд╛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред Pypy рдХреЗ рд▓реЛрдЧ рдЕрдм cffi рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рд╡рд╛рджрд╛ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рддреЗрдЬрд╝ рд╣реЛрдЧрд╛ (cpython рдФрд░ pyp рджреЛрдиреЛрдВ рдХреЗ рддрд╣рдд)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╢рд╛рдпрдж рд╕рд╛рдЗрдлрди Cffi рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рджрд┐рди рд╕реАрдЦреЗрдВрдЧреЗ, рд╕реА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдПрдкреАрдЖрдИ рдирд╣реАрдВред рддрдм, рд╢рд╛рдпрдж, рдЦреБрд╢реА рдЖрдПрдЧреА) рдЗрд╕ рдмреАрдЪ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдореБрдЭреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рдореИрдВ рдирд╣реАрдВ, рд╢рд╛рдпрдж; рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕рдм рдХреБрдЫ рд▓рд┐рдирдХреНрд╕ рдФрд░ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рджреМрд░рд╛рди, рдореБрдЭреЗ рдЕрдЬрдЧрд░ рдореЗрдВ рдПрдХ рд░реБрдХрд╛ рд╣реБрдЖ utf_32_le рдХреЛрдбреЗрдХ рдорд┐рд▓рд╛ред рдкреИрдЪ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдЧ рд╣реИ ( bugs.python.org/issue15027 ), рд▓реЗрдХрд┐рди рдкреИрдЪ рдЕрднреА рддрдХ рдкреНрд░рддрд┐рдмрджреНрдз рдирд╣реАрдВ рд╣реИред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдбреЗрдЯреНрд░реА рдореЗрдВ рд╕рднреА рдСрдкрд░реЗрд╢рдиреЛрдВ рдиреЗ 10 рдЧреБрдирд╛ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдПрдХ рдЬрдЧрд╣ рд╡реЗ рдорд╛рдирдХ рдЕрдЬрдЧрд░ utf_32_le рдХреЗ рд╕рд╛рде рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ рдФрд░ рд╕рдм рдХреБрдЫ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд┐рдпрд╛ред рдЗрд╕ рдХреЛрдбреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ "рд╣реЙрдЯ" рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЗрд╕реЗ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдбреЗрдЯреНрд░реА рдореЗрдВ рдХреБрдЫ рдСрдкрд░реЗрд╢рди 2 рдЧреБрдирд╛ рддреЗрдЬреА рд╕реЗ рдХрдорд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЯреНрд░реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рднреА рдЕрдм рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд▓рд┐рдмрдбрд╛рдЯреНрд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рд▓реЗрдХрд┐рди рд▓рд┐рдмрдбрд╛рдЯреНрд░реА рдХреЗ рд▓реЗрдЦрдХ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд╡реНрдпрдХреНрддрд┐ рд╣реИрдВ рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдЦрд░рд╛рдм рдирд╣реАрдВ рд╣реИрдВред

рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдкреИрдЪ, рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ, рд╡рд┐рдЪрд╛рд░, рдмреЗрдВрдЪрдорд╛рд░реНрдХ, рдкреБрд▓ рдЕрдиреБрд░реЛрдз, рдЖрджрд┐ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!

github / bitbucket , рдЬреЛ рднреА рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛред

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


All Articles