{"id":334028,"date":"2022-06-03T15:01:01","date_gmt":"2022-06-03T15:01:01","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=334028"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=334028","title":{"rendered":"<span>\u041f\u043e\u0434\u0441\u0447\u0451\u0442 \u0441\u043b\u043e\u0432<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u0425\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u041e\u043d\u0430 \u0438\u043c\u0435\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0443 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u0435\u043d\u044f\u044e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u044b\u0435 \u043c\u0435\u0441\u044f\u0446\u044b \u043a\u043e\u0432\u0438\u0434\u043d\u043e\u0439 \u044d\u0440\u044b \u0442\u0430\u043a \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043d\u0430 \u043c\u043e\u0435\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432\u0441\u0435\u043c \u0443\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0438\u043b\u0438 \u0437\u0430\u0440\u043f\u043b\u0430\u0442\u0443 \u0438 \u044f, \u043d\u0435\u0434\u043e\u043b\u0433\u043e \u0434\u0443\u043c\u0430\u044f, \u043f\u043e\u0448\u0451\u043b \u043d\u0430 \u0440\u044b\u043d\u043e\u043a \u0442\u0440\u0443\u0434\u0430. \u041d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435 \u0432 \u043e\u0434\u043d\u0443 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0443\u044e \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0443\u044e IT-\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443. \u0417\u0430\u0434\u0430\u0447\u043a\u0443 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0435\u0448\u0438\u0442\u044c: \u0440\u0435\u0448\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e, \u043d\u0435 &#171;\u0443\u0431\u0438\u0432&#187; \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c &#171;\u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u0443\u0436\u0430\u0441 \u0431\u044b\u043b&#187;.<\/p>\n<p>\u0423\u0436\u0435 \u0437\u0430 \u0440\u0430\u043c\u043a\u0430\u043c\u0438 &#171;\u0432\u0441\u0442\u0443\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u044f&#187; \u0440\u0430\u0434\u0438 \u0441\u043f\u043e\u0440\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438. \u0421\u043f\u0443\u0441\u0442\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0433\u043e\u0434 \u043f\u043e\u0441\u043b\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043f\u0440\u0438\u0448\u043b\u0438 \u043d\u043e\u0432\u044b\u0435 \u0438\u0434\u0435\u0438 \u0438 \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043e \u0447\u0451\u043c \u0438 \u043f\u043e\u0439\u0434\u0451\u0442 \u0440\u0435\u0447\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<h3>\u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438<\/h3>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438:<\/p>\n<blockquote>\n<p>\u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0441\u0447\u0438\u0442\u0430\u043b\u043a\u0443 \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f.<br \/>\u0421\u043b\u043e\u0432\u043e\u043c \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0445 \u0431\u0443\u043a\u0432, <code>[a-zA-Z]+<\/code>. \u0412\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u043a\u0440\u043e\u043c\u0435 <code>[a-zA-Z]<\/code>, \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438. \u0421\u043b\u043e\u0432\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043a \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443. \u0412\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0447\u0430\u0441\u0442\u043e\u0442\u0443, \u0437\u0430\u0442\u0435\u043c \u0441\u0430\u043c\u043e \u0441\u043b\u043e\u0432\u043e, \u043f\u0440\u0438\u0447\u0451\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e \u0447\u0430\u0441\u0442\u043e\u0442\u0435 \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e, \u0430 \u0441\u043b\u043e\u0432\u0430, \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u043e\u0442\u0443, \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0443. \u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<\/blockquote>\n<pre><code class=\"bash\"> $ cat in.txt I agree with you I say what you do about the world It's poison And it's sick And you want to get out of it  $ freq in.txt out.txt  $ cat out.txt 3 it 3 you 2 and 2 i 2 s 1 about 1 agree 1 do 1 get 1 of 1 out 1 poison 1 say 1 sick 1 the 1 to 1 want 1 what 1 with 1 world<\/code><\/pre>\n<blockquote>\n<p>\u0420\u0435\u0448\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0432 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a.<\/p>\n<\/blockquote>\n<p>\u041a\u0430\u043a \u043f\u043e\u0442\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c (\u0438 \u044d\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442), \u0441\u0447\u0438\u0442\u0430\u043b\u043a\u0443 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430: <a href=\"https:\/\/disk.yandex.ru\/d\/mOY5CrveIAOtnQ\" rel=\"noopener noreferrer nofollow\">pg.txt<\/a> (\u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u2014 \u0430\u0440\u0445\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439  \u0444\u0430\u0439\u043b). \u0424\u0430\u0439\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u0440\u043f\u0443\u0441 \u0438\u0437 \u0441\u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c, \u043d\u0435\u043c\u0435\u0446\u043a\u043e\u043c \u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445.<\/p>\n<pre><code class=\"bash\"> $ md5sum *.txt 850944413ba9fd1dbf2b9694abaa930d *lf.txt d1362c6c9de664c34c3066ec1d01078f *crlf.txt<\/code><\/pre>\n<blockquote>\n<p>\u0441\u043e\u043e\u0442\u0432 \u0434\u0432\u0435 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0445 md5<\/p>\n<\/blockquote>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u043d\u0430 &#171;\u0441\u0440\u0435\u0434\u043d\u0435\u043c&#187; \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b x86-64. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n<h3>\u0413\u0434\u0435 \u0432\u0441\u0451 \u043d\u0430\u0439\u0442\u0438<\/h3>\n<p>\u041a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0432\u0435\u0442\u043a\u0435 master <a href=\"https:\/\/github.com\/tomilov\/freq\/tree\/master\" rel=\"noopener noreferrer nofollow\"><strong>\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/strong><\/a>.<\/p>\n<h3>\u041e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0437\u0430\u043c\u0435\u0440\u043e\u0432 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0434\u043b\u044f <a href=\"https:\/\/ark.intel.com\/content\/www\/ru\/ru\/ark\/products\/75273\/intel-xeon-processor-e5-2667-v2-25m-cache-3-30-ghz.html\" rel=\"noopener noreferrer nofollow\">Intel(R) Xeon(R) CPU E5-2667 v2 @ 3.30GHz<\/a>. \u042d\u0442\u043e Ivy Bridge. \u041f\u0430\u043c\u044f\u0442\u044c &#8212; DDR3 1866MHz ECC REG, 4 channels.<\/p>\n<p>\u041c\u043e\u0439 \u0432\u044b\u0431\u043e\u0440 \u044f\u0437\u044b\u043a\u0430 \u2014 C++. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u2014 GCC\/clang \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438\u0437 Visual Studio 2019 \u0438 MinGW-w64 (\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 Windows).<\/p>\n<p>\u041d\u0430 Windows \u044f \u0432 \u0438\u0442\u043e\u0433\u0435 \u0437\u0430\u0431\u0438\u043b, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0437\u0430\u043c\u0435\u0440\u043e\u0432 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043d\u0451\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0438 \u0436\u0435\u043b\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435\u0433\u043e, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u044d\u043d\u0435\u0440\u0433\u043e\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f Performance.<\/p>\n<p>\u041d\u0430 GCC \u0442\u043e\u0436\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u043b\u0441\u044f \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u043e\u0433\u043b\u043e \u0447\u0442\u043e-\u0442\u043e \u0440\u0430\u0437\u043e\u0439\u0442\u0438\u0441\u044c. \u0412 \u0445\u043e\u0434\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u0430\u0436\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b <a href=\"https:\/\/gcc.gnu.org\/bugzilla\/show_bug.cgi?id=105808\" rel=\"noopener noreferrer nofollow\">\u0431\u0430\u0433<\/a> \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430.<\/p>\n<h3>\u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430<\/h3>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432: 336 183 276.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ du -b pg.txt 336183276       pg.txt  $ LC_ALL=\"C\" wc -m pg.txt 336183276 pg.txt<\/code><\/pre>\n<p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0444\u0430\u043b\u0430, \u0442.\u043a. \u0444\u0430\u0439\u043b \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0442\u0435\u043a\u0441\u0442 \u0432 \u043e\u0434\u043d\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0439 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435.<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0432: 58 801 281.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">  $ LC_ALL=\"C\" awk -F '[^A-Za-z]+' '  {      for (i = 1; i &lt;= NF; ++i)          if ($i)              ++j  }  END {      print j  }  ' pg.txt  58801281<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0427\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u043b\u043e\u0432: 213 637.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ LC_ALL=\"C\" awk -F '[^A-Za-z]+' ' {     for (i = 1; i &lt;= NF; ++i)         if ($i)             ++w[tolower($i)] } END {     print length(w) } ' pg.txt 213637<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u043e\u0432 \u0442\u043e\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438. \u0414\u043b\u044f \u043a\u043e\u0440\u043f\u0443\u0441\u0430 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c.<\/p>\n<p>\u0412\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u0447\u0430\u0441\u0442\u043e\u0442 \u0441\u043b\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430, \u0442\u0430\u043a \u043a\u0430\u043a <code>58801281 >> 213637<\/code>. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0443\u043f\u043e\u0440 \u043f\u0440\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u043f\u043e\u0441\u0447\u0451\u0442 \u0447\u0430\u0441\u0442\u043e\u0442 \u0441\u043b\u043e\u0432.<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d \u0441\u043b\u043e\u0432.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ LC_ALL=\"C\" awk -F '[^A-Za-z]+' ' {     for (i = 1; i &lt;= NF; ++i)         if ($i)             ++l[length($i)] } END {     for (j in l)         print j, l[j] } ' pg.txt | sort -k1g | column -t 1   3018380 2   10389242 3   13784482 4   10605768 5   6407052 6   4713535 7   3845034 8   2404953 9   1742863 10  1020733 11  455583 12  249480 13  108981 14  38231 15  12161 16  3546 17  881 18  219 19  73 20  20 21  15 22  8 23  2 24  7 25  1 27  2 28  2 29  5 32  3 34  1 35  1 37  3 42  1 44  2 48  1 51  1 53  1 58  1 61  2 64  1 66  2 68  1 70  1<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u0441\u043b\u043e\u0432\u0430 &#8212; 70, \u0441\u0440\u0435\u0434\u043d\u044f\u044f &#8212; 4.25, \u043c\u0435\u0434\u0438\u0430\u043d\u043d\u0430\u044f &#8212; 4<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ LC_ALL=C awk -F '[^A-Za-z]+' ' {     for (i = 1; i &lt;= NF; ++i)         if ($i)             print length($i) } ' pg.txt | sort -n | jq -s ' {     count: length,     mininum: min,     average: (add \/ length),     maximum: max,     median: .[length \/ 2  floor],     p90: .[length * 0.90 | floor],     p95: .[length * 0.95 | floor],     p99: .[length * 0.99 | floor],     p999: .[length * 0.999 | floor] } ' {   \"count\": 58801281,   \"mininum\": 1,   \"average\": 4.25427611007318,   \"maximum\": 70,   \"median\": 4,   \"p90\": 8,   \"p95\": 9,   \"p99\": 11,   \"p999\": 13 }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>99.9979% \u0441\u043b\u043e\u0432 \u0438\u043c\u0435\u044e\u0442 \u0434\u043b\u0438\u043d\u0443, \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u044e\u0449\u0443\u044e 16 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (\u0431\u0430\u0439\u0442).<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ LC_ALL=C awk -F '[^A-Za-z]+' ' {     for (i = 1; i &lt;= NF; ++i)         if ($i)             print length($i) } ' pg.txt | sort -n | awk ' \/17\/ { if (!i) i = NR } END { print i \/ NR } ' 0.999979<\/code><\/pre>\n<p>\u0417\u043d\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u0430 \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0439. \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u043e \u044f \u043d\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430.<\/p>\n<\/div>\n<\/details>\n<h3>\u0420\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c md5 hash \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0443\u0441\u0442\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0430\u044f, \u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430\u044f \u0438 \u043e\u0442\u0432\u0435\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0433\u043b\u0430\u0437\u0430\u043c\u0438 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441 \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0439, \u043d\u043e \u0435\u0449\u0451 \u043f\u043e\u043a\u0430 \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0439, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 (\u0434\u043b\u044f \u043c\u0435\u043d\u044f) \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0447\u0438\u0442\u0430\u043b\u043a\u0443 &#171;\u043d\u0430 bash&#187; (\u0447\u0442\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>sed<\/code>, <code>awk<\/code>, <code>sort<\/code>, <code>uniq<\/code> \u0438 \u0442.\u043f.). \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u043d\u0430 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">LC_ALL=\"C\" awk -F '[^A-Za-z]+' ' {     for (i = 1; i &lt;= NF; ++i)         if ($i)             ++w[tolower($i)] } END {     for (i in w)         print w[i], i } ' | sort -k1gr,2<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0435\u0449\u0430\u044e \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432 \u0444\u0430\u0439\u043b <a href=\"https:\/\/github.com\/tomilov\/freq\/blob\/master\/freq.sh\" rel=\"noopener noreferrer nofollow\">freq.sh<\/a> \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u043d\u0430 \u0432\u0445\u043e\u0434 <code>pg.txt<\/code>, \u0430 (\u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0439) \u0432\u044b\u0432\u043e\u0434 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0432 <code>ref.txt<\/code>.<\/p>\n<pre><code class=\"bash\"> $ time bash freq.sh &lt;pg.txt | tee ref.txt | md5sum - real    0m24.834s user    0m24.759s sys     0m0.090s 850944413ba9fd1dbf2b9694abaa930d  -<\/code><\/pre>\n<p>\u041a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0445\u044d\u0448 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432\u0435\u0440\u043d\u044b\u0439, \u0430 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0435\u0440\u043d\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 (\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 md5 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u044b). \u0412\u0440\u0435\u043c\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 <code>awk<\/code>. \u0413\u043e\u0434 \u043d\u0430\u0437\u0430\u0434 \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u043e \u0437\u0430 120 \u0441\u0435\u043a\u0443\u043d\u0434 \u0432 \u0442\u043e\u043c \u0436\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438.<\/p>\n<h3>\u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430<\/h3>\n<details class=\"spoiler\">\n<summary>\u0422\u043e\u043f \u0441\u043b\u043e\u0432 \u043f\u043e \u0447\u0430\u0441\u0442\u043e\u0442\u0435.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ head -16 ref.txt | column -t 3343241  the 1852717  and 1715705  of 1560152  to 1324244  a 956926   in 933954   i 781286   he 713514   that 690876   was 665710   it 608451   you 580460   his 498427   with 442288   for 433687   had<\/code><\/pre>\n<p>&#171;The&#187; \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f 3343241 \u0440\u0430\u0437. \u0414\u043b\u044f \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>uint32_t<\/code> (\u0438\u043b\u0438 <code>uint24<\/code>, \u043e \u0447\u0451\u043c \u043d\u0438\u0436\u0435).<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d \u0441\u043b\u043e\u0432.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ LC_ALL=\"C\" awk -F '[^A-Za-z]+' ' {     for (i = 1; i &lt;= NF; ++i)         if ($i)             w[tolower($i)] } END {     for (i in w)         ++l[length(i)]     for (j in l)         print j, l[j] } ' pg.txt | sort -k1g | column -t 1   26 2   442 3   2958 4   10757 5   21406 6   31287 7   36105 8   33983 9   28101 10  20362 11  12875 12  7684 13  4045 14  1955 15  921 16  384 17  181 18  60 19  33 20  13 21  12 22  7 23  2 24  7 25  1 27  2 28  2 29  5 32  3 34  1 35  1 37  2 42  1 44  2 48  1 51  1 53  1 58  1 61  2 64  1 66  2 68  1 70  1<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0421\u0440\u0435\u0434\u043d\u044f\u044f \u0434\u043b\u0438\u043d\u0430 \u0441\u043b\u043e\u0432\u0430 &#8212; 7.814<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ LC_ALL=C awk -F '[^A-Za-z]+' ' {     for (i = 1; i &lt;= NF; ++i)         if ($i)             w[tolower($i)] } END {     for (i in w)         print length(w) } ' pg.txt | sort -n | tee \/tmp\/1 | jq -s ' {     count: length,     sum: add,     mininum: min,     average: (add \/ length),     maximum: max,     median: .[length \/ 2 | floor],     p90: .[length * 0.90 | floor],     p95: .[length * 0.95 | floor],     p99: .[length * 0.99 | floor],     p999: .[length * 0.999 | floor] } ' {   \"count\": 213637,   \"sum\": 1669418,   \"mininum\": 1,   \"average\": 7.814273744716505,   \"maximum\": 70,   \"median\": 8,   \"p90\": 11,   \"p95\": 12,   \"p99\": 14,   \"p999\": 17 }<\/code><\/pre>\n<p><code>count<\/code> &#8212; \u044d\u0442\u043e (\u043e\u043f\u044f\u0442\u044c \u0436\u0435) \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0432, <code>sum<\/code> &#8212; \u0441\u0443\u043c\u043c\u0430 \u0438\u0445 \u0434\u043b\u0438\u043d. \u0412\u0435\u0441\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 <code>count + sum = 1883055<\/code> \u0431\u0430\u0439\u0442, \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u043b\u043e\u0432\u0430 <code>'\\0'<\/code>.<\/p>\n<\/div>\n<\/details>\n<h3>\u041c\u0435\u0442\u043e\u0434\u0438\u043a\u0430 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439<\/h3>\n<p>\u0417\u0434\u0435\u0441\u044c \u0441\u0442\u043e\u0438\u0442 \u0441\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0443 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0412\u0430\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0440\u0435\u0434\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439.<\/p>\n<p>\u0414\u0436\u0438\u0442\u0442\u0435\u0440 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u0435\u043d, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u0435\u0441\u0442\u0438 \u0435\u0433\u043e \u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0443. \u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u0434\u0436\u0438\u0442\u0442\u0435\u0440\u0430 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u041e\u0421, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u044f\u0434\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043a, \u0432\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<\/p>\n<pre><code class=\"bash\">sudo find \/sys\/devices\/system\/cpu -name scaling_governor \\     -exec sh -c 'echo performance >{}' ';' sudo sh -c 'echo off >\/sys\/devices\/system\/cpu\/smt\/control' sudo tuna --cpus=1-7 --isolate<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u044f\u0434\u0435\u0440 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0441\u043a\u0430\u0447\u0435\u0442 \u0438 \u0437\u0430\u043b\u043e\u0447\u0435\u043d\u0430 \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e (\u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e &#171;\u0434\u043b\u044f \u0432\u0441\u0435\u0445&#187;, \u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u044f\u0434\u0435\u0440 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u0435 \u043e\u0431\u044b\u0447\u043d\u043e). \u0411\u0435\u0437 \u044d\u0442\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u044f\u0434\u0440\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u0443\u0441\u0442\u044f \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u0423 \u043c\u0435\u043d\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u044f\u0434\u0435\u0440 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ grep MHz \/proc\/cpuinfo cpu MHz         : 3043.824 cpu MHz         : 3722.037 cpu MHz         : 3721.075 cpu MHz         : 3674.557 cpu MHz         : 3592.679 cpu MHz         : 3550.398 cpu MHz         : 3513.916 cpu MHz         : 3612.262 cpu MHz         : 3468.005 cpu MHz         : 3764.145 cpu MHz         : 3586.930 cpu MHz         : 3576.853 cpu MHz         : 3564.029 cpu MHz         : 3587.192 cpu MHz         : 3244.385 cpu MHz         : 2761.846<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 HyperThreading (\u044d\u0442\u043e \u0438\u043d\u0442\u0435\u043b\u043b\u043e\u0432\u0441\u043a\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 SMT). \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u044f\u0434\u0435\u0440 &#171;\u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442&#187; (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437 \u0432\u044b\u0432\u043e\u0434\u0430 <code>htop<\/code>) \u2014 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u044f\u0434\u0440\u0430 \u0441 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 0-7. \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u044d\u0442\u043e \u0434\u0430\u0451\u0442 30% \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p>\u0422\u0440\u0435\u0442\u044c\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a Linux \u043d\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0438 (\u0447\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u041e\u0421) \u043d\u0430 \u044f\u0434\u0440\u0430 1-7. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u0441\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0432\u044b\u0442\u0435\u0441\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u044f\u0434\u0440\u043e 0. \u0422\u0430\u043a\u0436\u0435 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440, \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c Wi-Fi \u0438\/\u0438\u043b\u0438 Ethernet \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0430 \u0432\u0441\u0435\u0445 \u044f\u0434\u0440\u0430\u0445 \u0437\u0430 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u0437 \u043d\u0438\u0445 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u043d\u0430 \u044f\u0434\u0440\u0435 0:<\/p>\n<pre><code class=\"bash\">sudo perf stat -e 'sched:sched_switch' -a -A --timeout 10000<\/code><\/pre>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 \u044f\u0434\u0440\u0430\u0445 1-7. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0431\u0435\u0440\u0451\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 (\u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438: \u0438\u043c\u0435\u043d\u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435).<\/p>\n<pre><code class=\"bash\">for i in {1..20} do     time taskset --cpu-list 1-7 .\/freq pg.txt out.txt done<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0440\u043e\u0432 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435:<\/p>\n<pre><code class=\"bash\">sudo sh -c 'echo on >\/sys\/devices\/system\/cpu\/smt\/control' sudo tuna --cpus=0-15 --include sudo find \/sys\/devices\/system\/cpu -name scaling_governor \\     -exec sh -c 'echo powersave >{}' ';'<\/code><\/pre>\n<p>\u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c: <a href=\"https:\/\/rigtorp.se\/low-latency-guide\/\" rel=\"noopener noreferrer nofollow\">Low latency guide<\/a>. \u0414\u0440\u0443\u0433\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0442\u0430\u043c \u0442\u0430\u043a\u0436\u0435 \u043a\u0440\u0430\u0439\u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b.<\/p>\n<h3>\u041d\u0430\u0438\u0432\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/h3>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;algorithm> #include &lt;fstream> #include &lt;functional> #include &lt;streambuf> #include &lt;string_view> #include &lt;tuple> #include &lt;type_traits> #include &lt;unordered_map> #include &lt;vector>  #include &lt;cstdlib> #include &lt;cctype>  int main(int argc, char * argv[]) {     if (argc &lt; 3) {         return EXIT_FAILURE;     }      std::ifstream i(argv[1]);     if (!i.is_open()) {         return EXIT_FAILURE;     }      i.seekg(0, std::ios::end);        auto size = size_t(i.tellg());     i.seekg(0, std::ios::beg);      std::string input;     input.resize(size);     i.read(input.data(), size);      auto toLower = [](char c) {         return std::tolower(std::make_unsigned_t&lt;char>(c));     };     std::transform(std::cbegin(input), std::cend(input),             std::begin(input), toLower);      std::unordered_map&lt;std::string_view, size_t> wordCounts;      auto isAlpha = [](char c) {         return std::isalpha(std::make_unsigned_t&lt;char>(c));     };     auto end = std::end(input);     auto beg = std::find_if(std::begin(input), end, isAlpha);     while (beg != end) {         auto it = std::find_if(beg, end, std::not_fn(isAlpha));         ++wordCounts[{beg, it}];         beg = std::find_if(it, end, isAlpha);     }      std::vector&lt;const decltype(wordCounts)::value_type *> output;     output.reserve(wordCounts.size());     for (const auto &amp; wordCount : wordCounts) {         output.push_back(&amp;wordCount);     }      auto isLess = [](auto lhs, auto rhs) -> bool     {         return std::tie(rhs->second, lhs->first) &lt;              std::tie(lhs->second, rhs->first);     };     std::sort(std::begin(output), std::end(output), isLess);      std::ofstream o(argv[2]);     if (!o.is_open()) {         return EXIT_FAILURE;     }     for (auto wordCount : output) {         o &lt;&lt; wordCount->second &lt;&lt; ' ' &lt;&lt; wordCount->first &lt;&lt; '\\n';     }          return EXIT_SUCCESS; }<\/code><\/pre>\n<p>\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f &#171;\u043c\u0435\u043d\u044c\u0448\u0435&#187; \u0432 <code>isLess<\/code> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439 \u043b\u0435\u043a\u0441\u0438\u043a\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438 \u0438 \u0441 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u043c \u0441\u043c\u044b\u0441\u043b\u043e\u043c. \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0441\u0442\u044c\u044e \u0442\u0438\u043f\u0430 \u0432 <code>isAlpha<\/code> \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f, \u0442.\u043a. \u0437\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043b\u0438 \u0442\u0438\u043f <code>char<\/code> &#8212; \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 (\u0441\u0435\u043a\u0446\u0438\u044f Notes <a href=\"https:\/\/en.cppreference.com\/w\/cpp\/string\/byte\/isalpha\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>). \u0415\u0441\u043b\u0438 \u0438\u0445 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0442\u043e \u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043d\u0435\u043a\u0440\u043e\u0441\u043f\u043b\u0430\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u043c.<\/p>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e \u0438 \u0443\u0431\u0435\u0436\u0434\u0430\u044e\u0441\u044c, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u0435\u0440\u043d\u044b\u0439:<\/p>\n<pre><code class=\"bash\">clang++ -std=c++20 -march=native -Ofast naive.cpp -o naive &amp;&amp;     time LC_ALL=\"C\" .\/naive pg.txt out.txt &amp;&amp;     md5sum out.txt ref.txt real    0m5.399s user    0m5.248s sys     0m0.151s 850944413ba9fd1dbf2b9694abaa930d  out.txt 850944413ba9fd1dbf2b9694abaa930d  ref.txt<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c <code>freq.sh<\/code>: 5.4 \u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<p>\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c? \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446. \u0422\u0430 \u0436\u0435 <code>std::unordered_map<\/code> \u0438\u0437 <code>libc++<\/code> (\u0432\u044b\u0448\u0435 \u0431\u044b\u043b\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u043b\u044f <code>libstdc++<\/code>) \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0443\u0436\u0435 \u0437\u0430 3.9 \u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/tomilov\/freq\/blob\/master\/unordered_map.cpp\" rel=\"noopener noreferrer nofollow\">unordered_map.cpp<\/a><\/p>\n<\/li>\n<li>\n<p><code>folly::F14ValueMap<\/code> &#8212; \u0437\u0430 4.1 (<a href=\"https:\/\/github.com\/tomilov\/freq\/blob\/master\/folly.cpp\" rel=\"noopener noreferrer nofollow\">folly.cpp<\/a>)<\/p>\n<\/li>\n<li>\n<p><code>google::sparse_hash_map<\/code> &#8212; \u0437\u0430 3.6 \u0441\u0435\u043a\u0443\u043d\u0434\u044b (<a href=\"https:\/\/github.com\/tomilov\/freq\/blob\/master\/sparse_hash_map.cpp\" rel=\"noopener noreferrer nofollow\">sparse_hash_map.cpp<\/a>)<\/p>\n<\/li>\n<li>\n<p><code>absl::flat_hash_map<\/code> &#8212; \u0437\u0430 2.6 (<a href=\"https:\/\/github.com\/tomilov\/freq\/blob\/master\/absl.cpp\" rel=\"noopener noreferrer nofollow\">absl.cpp<\/a>)<\/p>\n<\/li>\n<li>\n<p><code>google::dense_hash_map<\/code> &#8212; \u0437\u0430 2.4 (<a href=\"https:\/\/github.com\/tomilov\/freq\/blob\/master\/dense_hash_map.cpp\" rel=\"noopener noreferrer nofollow\">dense_hash_map.cpp<\/a>)<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0432\u0432\u043e\u0434, \u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 (\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043a \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443) \u0438 \u0432\u044b\u0432\u043e\u0434: \u0441 <code>~0.5<\/code> \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0434\u043e <code>~0.1<\/code> \u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<p>\u041e\u0431\u0449\u0438\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432: <a href=\"https:\/\/github.com\/tomilov\/freq\/blob\/master\/common.hpp\" rel=\"noopener noreferrer nofollow\">common.hpp<\/a>.<\/p>\n<p>\u041b\u0443\u0447\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f &#8212; 2.4 \u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<h3>\u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434: \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 trie<\/h3>\n<p><a href=\"https:\/\/github.com\/tomilov\/freq\/blob\/master\/trie.cpp\" rel=\"noopener noreferrer nofollow\">trie.cpp<\/a><\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c &#171;\u043d\u0430\u0438\u0432\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f&#187; \u0434\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0434\u0430\u043b\u0435\u043a\u043e. \u041d\u0443\u0436\u043d\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u0438 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0434\u0435\u0435\u0439 \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e. \u041c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u0441\u043b\u043e\u0432, \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0437\u043b\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043b\u043e\u0432\u043e, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043f\u0443\u0442\u0438, \u043e\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0449\u0435\u043c\u0443\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0443\u0437\u043b\u0435, \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u043e\u0441\u044c \u0432 \u0442\u0435\u043a\u0441\u0442\u0435. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043e, \u0432\u0441\u0435 \u043b\u0438\u0441\u0442\u044c\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0438 \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0443\u0437\u043b\u0430\u0445, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0434\u043d\u043e \u0441\u043b\u043e\u0432\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041a\u043b\u0430\u0441\u0441 <code>Timer<\/code> (\u0434\u043b\u044f \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438) \u0438 \u043a\u043b\u0430\u0441\u0441\u044b <code>InputStream<\/code> \u0438 <code>OutputStream<\/code> (\u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0432\u0432\u043e\u0434\/\u0432\u044b\u0432\u043e\u0434 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0431\u043b\u043e\u043a\u0430\u043c\u0438) \u043d\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0434\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u0440\u0435\u0448\u0435\u043d\u0438\u044f:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include \"helpers.hpp\" #include \"io.hpp\" #include \"timer.hpp\"  #include &lt;fmt\/color.h> #include &lt;fmt\/format.h>  #include &lt;algorithm> #include &lt;chrono> #include &lt;iterator> #include &lt;memory> #include &lt;string_view> #include &lt;utility> #include &lt;vector>  #include &lt;cassert> #include &lt;cstdint> #include &lt;cstdio> #include &lt;cstdlib>  namespace {  constexpr std::size_t kAlphabetSize = 'z' - 'a' + 1;  alignas(__m128i) char input[1 &lt;&lt; 29]; auto inputEnd = input;  struct TrieNode {     uint32_t count = 0;     uint32_t children[kAlphabetSize] = {}; };  }  \/\/ namespace  int main(int argc, char * argv[]) {     Timer timer{fmt::format(fg(fmt::color::dark_green), \"total\")};      if (argc != 3) {         fmt::print(stderr, \"usage: {} in.txt out.txt\\n\", argv[0]);         return EXIT_FAILURE;     }      using namespace std::string_view_literals;      auto inputFile =         (argv[1] == \"-\"sv) ? wrapFile(stdin) : openFile(argv[1], \"rb\");     if (!inputFile) {         fmt::print(stderr, \"failed to open '{}' file to read\\n\", argv[1]);         return EXIT_FAILURE;     }      auto outputFile =         (argv[2] == \"-\"sv) ? wrapFile(stdout) : openFile(argv[2], \"wb\");     if (!outputFile) {         fmt::print(stderr, \"failed to open '{}' file to write\\n\", argv[2]);         return EXIT_FAILURE;     }      timer.report(\"open files\");      std::size_t readSize =         readInput(std::begin(input), std::size(input), inputFile);     if (readSize == 0) {         return EXIT_SUCCESS;     }     inputEnd += readSize;     timer.report(\"read input\");      toLower(input, inputEnd);     timer.report(\"make input lowercase\");      std::vector&lt;TrieNode> trie(1);     {         uint32_t index = 0;         for (auto i = input; i != inputEnd; ++i) {             if (*i != '\\0') {                 uint32_t &amp; child = trie[index].children[*i - 'a'];                 if (child == 0) {                     child = uint32_t(trie.size());                     index = child;                     trie.emplace_back();                 } else {                     index = child;                 }             } else if (index != 0) {                 ++trie[index].count;                 index = 0;             }         }     }     fmt::print(stderr, \"trie size = {}\\n\", trie.size());      timer.report(fmt::format(fg(fmt::color::dark_blue), \"count words\"));      std::vector&lt;std::pair&lt;uint32_t, uint32_t>> rank;     std::vector&lt;char> words;      std::vector&lt;char> word;     auto traverseTrie = [&amp;](const auto &amp; traverseTrie,                             const auto &amp; children) -> void {         size_t c = 0;         for (uint32_t child : children) {             if (child != 0) {                 const TrieNode &amp; node = trie[child];                 word.push_back('a' + c);                 if (node.count != 0) {                     rank.emplace_back(node.count, uint32_t(words.size()));                     words.insert(std::cend(words), std::cbegin(word),                                  std::cend(word));                     words.push_back('\\0');                 }                 traverseTrie(traverseTrie, node.children);                 word.pop_back();             }             ++c;         }     };     traverseTrie(traverseTrie, trie.front().children);     assert(word.empty());     fmt::print(stderr, \"word count = {}, length = {}\\n\", rank.size(),                words.size());      timer.report(\"recover words from trie\");      std::stable_sort(std::begin(rank), std::end(rank),                      [](auto &amp;&amp; l, auto &amp;&amp; r) { return r.first &lt; l.first; });      timer.report(fmt::format(fg(fmt::color::dark_orange), \"sort words\"));      OutputStream&lt;> outputStream{outputFile};     for (const auto &amp; [count, word] : rank) {         if (!outputStream.print(count)) {             fmt::print(stderr, \"output failure\");             return EXIT_FAILURE;         }         if (!outputStream.putChar(' ')) {             fmt::print(stderr, \"output failure\");             return EXIT_FAILURE;         }         if (!outputStream.print(std::next(words.data(), word))) {             fmt::print(stderr, \"output failure\");             return EXIT_FAILURE;         }         if (!outputStream.putChar('\\n')) {             fmt::print(stderr, \"output failure\");             return EXIT_FAILURE;         }     }     timer.report(\"write output\");      return EXIT_SUCCESS; }<\/code><\/pre>\n<p>\u0412 \u043a\u043e\u0434\u0435 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u0438\u0434\u0438\u043e\u043c\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043b\u044f\u043c\u0431\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 traverseTrie, \u0432\u0437\u044f\u0442\u0430\u044f \u0441 <a href=\"https:\/\/stackoverflow.com\/questions\/2067988\/\" rel=\"noopener noreferrer nofollow\">SO<\/a>.<\/p>\n<p>\u0411\u043e\u043d\u0443\u0441\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0#%D0%A2%D0%B8%D0%BF%D1%8B\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438 \u043f\u0440\u044f\u043c\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443<\/a> \u043c\u044b \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u043e\u0432\u0430, \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u043a\u0441\u0438\u043a\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438. \u0414\u0430\u043b\u0435\u0435, \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u043f\u0430\u0440\u044b (\u0441\u043b\u043e\u0432\u043e, \u0447\u0430\u0441\u0442\u043e\u0442\u0430) \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e &#171;\u0434\u043e\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c&#187; \u043f\u043e \u0447\u0430\u0441\u0442\u043e\u0442\u0435, \u043d\u0435 \u043d\u0430\u0440\u0443\u0448\u0430\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043b\u043e\u0432, \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u043e\u0442\u0443, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430.<\/p>\n<\/div>\n<\/details>\n<p>1.48 \u0441\u0435\u043a\u0443\u043d\u0434\u044b. \u0423\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u043b\u0438\u0436\u0435 \u043a \u0441\u0435\u043a\u0443\u043d\u0434\u0435, \u0447\u0435\u043c \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0441 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 trie \u043d\u0435 \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u043e\u0449\u0443\u0442\u0438\u043c\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c \u043a\u0430\u043a \u043d\u0430 \u043d\u0438\u0437\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041c\u043d\u043e\u0433\u0438\u043c \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b <a href=\"http:\/\/ithare.com\/infographics-operation-costs-in-cpu-clock-cycles\/\" rel=\"noopener noreferrer nofollow\">\u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/a>, \u0433\u0434\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441 \u043d\u0430\u0448\u0438\u043c \u043a\u043e\u0434\u043e\u043c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0412\u0430\u0436\u043d\u044b \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u0430\u043c\u044f\u0442\u0438: RAM \u0438 \u0434\u0438\u0441\u043a\u0443. \u041c\u043e\u0436\u043d\u043e \u043e\u0436\u0438\u0434\u0430\u0442\u044c, \u0447\u0442\u043e &#171;\u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0435&#187; \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0434\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 SSE\/AVX \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0442\u0435\u0445 \u0436\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432 \u0434\u0430\u043d\u043d\u044b\u0445. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0447\u0430\u0441\u0442\u043e\u0433\u043e \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u043f\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443 \u0431\u0435\u0437 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043c\u0438\u043a\u0440\u043e\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0434\u043b\u044f \u043a\u043e\u0434\u0430 \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0435\u0442\u043a\u0438. \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0432 \u043e\u0431\u0449\u0435\u043c \u0438\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u0430\u043d\u043d\u044b\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043a\u044d\u0448\u0435 L1d, \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f  \u043a\u044d\u0448-\u043f\u0440\u043e\u043c\u0430\u0445\u0438 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u044d\u0448\u0435\u0439 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 RAM. \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0440\u0443\u043f\u043d\u044b\u043c\u0438 \u0431\u043b\u043e\u043a\u0430\u043c\u0438.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u043b\u0443\u0447\u0448\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e &#8212; \u044d\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u0440\u0435\u0434\u0432\u044b\u0431\u043e\u0440\u043a\u0443 (prefetch) \u0432 \u043a\u044d\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c (\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c) \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u044d\u0448-\u043b\u0438\u043d\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0435 \u0441\u043b\u043e\u0432, \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u0441\u043b\u043e\u0432\u043e \u0434\u043b\u044f \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0435\u043c\u0443 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u043c\u044f\u0442\u044c, \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0443\u044e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043a\u044d\u0448-\u043b\u0438\u043d\u0438\u0438.<\/p>\n<p>\u0414\u043b\u044f \u0441\u0447\u0451\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u0432 \u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u044d\u0448-\u043c\u0438\u0441\u0441\u043e\u0432. \u0420\u0430\u0437\u043c\u0435\u0440 \u043a\u044d\u0448\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 L1 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0435\u0433\u043e \u043b\u0438\u043d\u0438\u0438 \u0432 \u043c\u043e\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435:<\/p>\n<pre><code class=\"bash\"> $ getconf -a | grep -P '[123]_D?CACHE_' LEVEL1_DCACHE_SIZE                 32768 LEVEL1_DCACHE_ASSOC                8 LEVEL1_DCACHE_LINESIZE             64 LEVEL2_CACHE_SIZE                  262144 LEVEL2_CACHE_ASSOC                 8 LEVEL2_CACHE_LINESIZE              64 LEVEL3_CACHE_SIZE                  26214400 LEVEL3_CACHE_ASSOC                 20 LEVEL3_CACHE_LINESIZE              64<\/code><\/pre>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 <code>TrieNode<\/code> &#8212; 108. \u0412 \u043a\u043e\u043d\u0446\u0435 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u044b trie, 501266. \u0426\u0435\u043b\u0438\u043a\u043e\u043c \u043e\u043d \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0434\u0430\u0436\u0435 \u0432 L3 \u043a\u044d\u0448. \u0412 L1d \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f 303 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u041f\u043e\u043a\u0430 \u0438\u0434\u0451\u0442 \u043f\u043e\u0434\u0441\u0447\u0451\u0442, \u0441\u043a\u043e\u0440\u0435\u0439 \u0432\u0441\u0435\u0433\u043e \u0438\u0437 L1d \u043d\u0435 \u0432\u044b\u0442\u0435\u0441\u043d\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u044b\u0435 &#171;\u0433\u043e\u0440\u044f\u0447\u0438\u0435&#187; \u043f\u0443\u0442\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, &#171;the&#187;). \u0412 L2 \u043f\u043e\u0434\u043e\u043b\u0433\u0443 \u043b\u0435\u0436\u0438\u0442 \u0443\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043f\u0443\u0442\u0435\u0439. &#171;\u041d\u0430\u0441\u0435\u043b\u0451\u043d\u043d\u043e\u0441\u0442\u044c&#187; \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: 26, 559, 5320, 27945, 65471 \u0438 \u0442.\u0434. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u0432\u0443\u0445-\u0442\u0440\u0451\u0445\u0431\u0443\u043a\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 L1d+L2, \u0430 \u0434\u043b\u044f \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043f\u0443\u0442\u0435\u0439 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u043d\u0435 \u0432\u044b\u0442\u0435\u0441\u043d\u044f\u0435\u0442\u0441\u044f. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0434\u043b\u044f \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u0434\u043b\u0438\u043d\u044b \u0441\u043b\u043e\u0432\u0430 4.25 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e \u043e\u0434\u0438\u043d-\u0442\u0440\u0438 <code>TrieNode<\/code> \u043d\u0435 \u0438\u0437 L1d. <code>TrieNode<\/code> \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0432 \u0434\u0432\u0443\u0445 \u043a\u044d\u0448-\u043b\u0438\u043d\u0438\u044f\u0445. \u041a\u0430\u043a\u0430\u044f \u0438\u0437 &#171;\u043f\u043e\u043b\u043e\u0432\u0438\u043d&#187; \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u0430 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 <code>TrieNode::children<\/code> \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u0442\u0435\u043c, \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043a\u0430\u043a\u0443\u044e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0431\u0443\u043a\u0432\u0430. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 <code>TrieNode<\/code> \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e\u0431\u044b \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0432 \u043d\u0451\u043c, \u0447\u0442\u043e \u0434\u0430\u0451\u0442 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043b\u0438\u0448\u043d\u0438\u0439 \u043a\u044d\u0448-\u043c\u0438\u0441\u0441. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u043e \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0440\u044f\u0434\u043e\u043c \u0441 <code>children<\/code> \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 <code>TrieNode<\/code> \u0432\u044b\u0440\u0430\u0441\u0442\u0435\u0442 \u043f\u043e\u0447\u0442\u0438 \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430, \u043e\u0442\u0447\u0435\u0433\u043e \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u0443\u0435\u0442 \u043a\u044d\u0448-\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u044b\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u0434\u043e 1.54 \u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043a\u044d\u0448-\u043c\u0438\u0441\u0441\u043e\u0432 \u0434\u0430\u0451\u0442 \u0441\u0442\u0440\u043e\u043a\u0430 <code>if (child == 0)<\/code>. \u0422\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442 <code>perf<\/code>. \u042d\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e. \u0411\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443; \u0435\u0449\u0451 20% \u043d\u0430 <code>++trie[index].count;<\/code>.<\/p>\n<\/div>\n<\/details>\n<h3>libstdc++&#8217;s policy based data structures<\/h3>\n<p><a href=\"https:\/\/github.com\/tomilov\/freq\/blob\/master\/pb_ds.cpp\" rel=\"noopener noreferrer nofollow\">pb_ds.cpp<\/a><\/p>\n<p>\u0421\u0440\u0435\u0434\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 <code>libstdc++<\/code> \u0435\u0441\u0442\u044c <a href=\"https:\/\/gcc.gnu.org\/onlinedocs\/libstdc++\/ext\/pb_ds\/trie_based_containers.html\" rel=\"noopener noreferrer nofollow\">trie-based containers<\/a>. \u041e\u043d\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0438 \u0443\u043c\u0435\u044e\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f: \u0431\u044b\u0442\u044c \u0441\u0447\u0451\u0442\u043d\u044b\u043c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c.<\/p>\n<p>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">#include &lt;ext\/pb_ds\/assoc_container.hpp> #include &lt;ext\/pb_ds\/tag_and_trait.hpp> #include &lt;ext\/pb_ds\/trie_policy.hpp>   template&lt;typename Key, typename Value> using Trie =         __gnu_pbds::trie&lt;Key, Value,         __gnu_pbds::trie_string_access_traits&lt;Key, 'a', 'z'>,         __gnu_pbds::pat_trie_tag,         __gnu_pbds::null_node_update>; <\/code><\/pre>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u043d \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u0440\u0443\u0447\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0432\u044b\u0448\u0435: 6.57 \u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<h3>\u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0427\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c? \u042f \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u044f\u044e\u0441\u044c \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c: \u044f \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b path compression, \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u043a \u043a\u043e\u0440\u043d\u044e \u043f\u0430\u0440\u044b \u0431\u0443\u043a\u0432 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435, \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0435\u0449\u0451 \u0447\u0442\u043e-\u0442\u043e, &#8212; \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0430\u0432\u0430\u043b\u043e \u0432\u044b\u0438\u0433\u0440\u044b\u0448\u0430. \u0414\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0435\u0449\u0451 \u0434\u0430\u043b\u0435\u043a\u043e, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0443\u0436\u043d\u043e \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0443\u0442\u0451\u043c.<\/p>\n<p>\u041a\u0430\u043a \u043c\u043e\u0433\u043b\u043e \u0431\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u043e \u0431\u044b \u043a \u043c\u0435\u043d\u044c\u0448\u0435\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u0432  \u043a \u043f\u0430\u043c\u044f\u0442\u0438, \u0438\u043c\u0435\u043b\u043e \u0431\u044b \u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0445 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439? \u0412 \u0442\u0430\u043a\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0432\u0445\u043e\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u043f\u043e\u0445\u043e\u0434 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0437\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0435\u043c\u0443 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u0442\u0435\u043c \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u042d\u0442\u043e\u0442 \u043f\u043e\u0445\u043e\u0434 &#8212; \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043d\u0435 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c.<\/p>\n<p>\u0417\u043d\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u043b\u043e\u0432\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0441\u0447\u0451\u0442\u0447\u0438\u043a, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 &#8212; \u044d\u0442\u043e \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043d\u043e \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435. \u041d\u0430\u043c \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u043e\u0434\u043d\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e &#8212; \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f. \u041a\u0430\u043a\u0438\u043c \u0431\u044b \u043c\u043e\u0433\u043b\u043e \u0431\u044b\u0442\u044c \u044d\u0442\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435? \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c minimal perfect hash function. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u0442\u0438\u043b\u0438\u0442\u0430 <a href=\"https:\/\/www.gnu.org\/software\/gperf\/\" rel=\"noopener noreferrer nofollow\">gperf<\/a>. \u041e\u043d\u0430 \u0441\u0442\u0440\u043e\u0438\u0442 minimal perfect hash function \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0442\u0440\u043e\u043a. \u041e\u0434\u043d\u0430\u043a\u043e, \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 gperf, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0440\u043e\u0433\u0438\u043c. \u0414\u0430 \u0438, \u043a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0435\u0451 \u0434\u043b\u044f 213637 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0440\u0435\u0430\u043b\u044c\u043d\u043e. \u0415\u0441\u043b\u0438 \u043e\u0441\u043b\u0430\u0431\u0438\u0442\u044c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0442.\u0435. \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b <em>\u0431\u0435\u0437 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043e\u0432<\/em>, \u0442\u043e \u043d\u0430\u0439\u0442\u0438 perfect hash function \u0434\u043b\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u0438\u0437 <code>pg.txt<\/code> \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e.<\/p>\n<h3>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/h3>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b <a href=\"https:\/\/www.laruence.com\/sse\/#text=crc32&amp;expand=2432,2428\" rel=\"noopener noreferrer nofollow\">x86<\/a> \u0438 <a href=\"https:\/\/developer.arm.com\/documentation\/dui0801\/g\/A32-and-T32-Instructions\/CRC32C\" rel=\"noopener noreferrer nofollow\">ARM<\/a> \u0438\u043c\u0435\u044e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0451\u0442\u0430 CRC32C. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 CRC32, \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0435 \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a\u0438, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0445\u044d\u0448 \u0441\u0442\u0440\u043e\u043a\u0438. \u0422\u0430\u043a\u0430\u044f \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 (\u0441\u043c. \u0441\u0435\u043a\u0446\u0438\u044e EDIT <a href=\"https:\/\/stackoverflow.com\/a\/10962213\/1430927\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>), \u043d\u043e \u043f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e\u043d\u0438 \u043d\u0435 \u0432\u0430\u0436\u043d\u044b. \u041f\u043b\u044e\u0441\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0445\u0430\u0440\u0434\u0432\u0430\u0440\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 CRC32-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u043d\u043e <a href=\"https:\/\/www.agner.org\/optimize\/instruction_tables.pdf\" rel=\"noopener noreferrer nofollow\">\u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e<\/a>: reciprocal throughput &#8212; \u043e\u0442 1 \u0434\u043e 3 \u0442\u0430\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u041c\u043e\u0449\u043d\u043e\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0442\u0438\u043f \u043d\u0430 x86, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 213637 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, &#8212; \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 double word \u0438\u043b\u0438 <code>uint32_t<\/code>.<\/p>\n<p>\u041a\u0430\u043a \u0436\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0446\u0435\u043b\u043e\u0435 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0438\u043c\u0435\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e? \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0435 CRC32, \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u0438\u0440\u0443\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 CRC32. \u0422\u043e \u0435\u0441\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f CRC32 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e &#171;\u0441\u043a\u0430\u0440\u043c\u043b\u0438\u0432\u0430\u0442\u044c&#187; \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u0432\u0430 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430: \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 CRC32 \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u043f\u043e\u0440\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438, \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u043c &#171;\u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c&#187;. \u0417\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0441\u0447\u0451\u0442\u0430 CRC32, \u043a\u043e\u0433\u0434\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e. \u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0448\u0430\u0433\u0435 &#171;\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435&#187; \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439. \u0412\u0430\u0440\u044c\u0438\u0440\u0443\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>\u0421\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0411\u043b\u0443\u043c\u0430.<\/p>\n<h3>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439<\/h3>\n<p>\u041f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439. \u0415\u0441\u0442\u044c <code>k = 213637<\/code> \u043c\u044f\u0447\u0435\u0439 \u0438 <code>m = 2^32<\/code> \u043a\u043e\u0440\u0437\u0438\u043d. \u0420\u0430\u0441\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u043c\u044f\u0447\u0438 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u043b\u044e\u0431\u0443\u044e \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u0431\u044b\u043b\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439 \u0438 \u0440\u0430\u0432\u043d\u043e\u0439 <code>1\/m<\/code>. \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e <code>i<\/code>-\u044b\u0439 \u043c\u044f\u0447 \u043f\u043e\u043f\u0430\u0434\u0451\u0442 \u0432 \u0443\u0436\u0435 \u0437\u0430\u043d\u044f\u0442\u0443\u044e \u043a\u043e\u0440\u0437\u0438\u043d\u0443 <code>(i - 1)\/m<\/code>. \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0440\u0437\u0438\u043d \u0441 \u0431\u043e\u043b\u0435\u0435, \u0447\u0435\u043c \u043e\u0434\u043d\u0438\u043c \u043c\u044f\u0447\u043e\u043c \u0442\u0430\u043a\u043e\u0432\u043e:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\frac{0}{m} + \\frac{1}{m} + \\ldots + \\frac{k - 1}{m} = \\frac{(k - 1) * k}{2} \\cdot \\frac{1}{m}\" alt=\"\\frac{0}{m} + \\frac{1}{m} + \\ldots + \\frac{k - 1}{m} = \\frac{(k - 1) * k}{2} \\cdot \\frac{1}{m}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1cf\/aeb\/c46\/1cfaebc4637c1433ff91ff05201084b1.svg\" width=\"355\" height=\"45\"\/><\/p>\n<p>\u0427\u0442\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 5.31 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435.<\/p>\n<p>\u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0439\u0442\u0438 \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0442\u0430\u043a\u0443\u044e, \u0447\u0442\u043e \u0441\u043b\u0443\u0447\u0438\u0442\u0441\u044f 0 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u0434\u043b\u044f \u0445\u044d\u0448\u0430 \u0434\u043b\u0438\u043d\u043e\u0439 32 \u0431\u0438\u0442\u0430 (<code>m = 2^32<\/code> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439) \u0441\u0440\u0435\u0434\u0438 <code>k = 213637<\/code> \u0441\u0442\u0440\u043e\u043a :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\prod_{i = 0}^{k - 1}(1 - \\frac{i}{m})\" alt=\"\\prod_{i = 0}^{k - 1}(1 - \\frac{i}{m})\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/400\/c6d\/2ea\/400c6d2eaac03c4fa6e695acc3538541.svg\" width=\"98\" height=\"61\"\/><\/p>\n<pre><code class=\"python\">from decimal import Decimal from functools import reduce from operator import mul   def prob(k, m): return reduce(mul, map(lambda i: 1 - Decimal(i) \/ m, range(k)))  print(prob(213637, 2 ** 32))  # 0.004925409327321181763062307628<\/code><\/pre>\n<p>\u042d\u0442\u0438 \u0440\u0430\u0441\u0447\u0451\u0442\u044b \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u043a\u0430\u0436\u0434\u0430\u044f \u0434\u0432\u0443\u0445\u0441\u043e\u0442\u0430\u044f (<code>~1\/203<\/code>) \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u0433\u0438\u043f\u043e\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c &#171;\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0439&#187;, \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439, \u0442.\u0435. \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e\u0439.<\/p>\n<p>\u041a\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <code>seed<\/code>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u043c \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c:<\/p>\n<pre><code class=\"cpp\">std::unordered_set&lt;uint32_t> hashes; for (uint32_t seed = 0;         seed &lt; std::numeric_limits&lt;uint32_t>::max();  \/\/ Ctrl+C         ++seed) {     bool bad = false;     for (const auto &amp; word : words) {         auto hash = seed;         for (char c : word) {             hash = _mm_crc32_u8(hash, uint8_t(c));         }         if (!hashes.insert(hash).second) {             bad = true;             break;         }     }     hashes.clear();     if (!bad) {         fmt::print(\"{}\\n\", seed);     } }<\/code><\/pre>\n<p>\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0434\u043b\u044f <code>pg.txt<\/code> \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0435 \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 \u0431\u0430\u0437\u0435 CRC32C \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437 \u0432 5 \u0447\u0430\u0449\u0435. \u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0435 \u0438\u043c\u0435\u044e (\u043a\u0441\u0442\u0430\u0442\u0438, \u0431\u044b\u043b \u0431\u044b \u0440\u0430\u0434 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u043a\u043e\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0447\u0438\u043d \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0442\u0435\u043e\u0440\u0438\u0438 \u0441 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439).<\/p>\n<p><a class=\"anchor\" name=\"sparsest\" id=\"sparsest\"><\/a><\/p>\n<h4>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f: sparsest hash map<\/h4>\n<p><a href=\"https:\/\/github.com\/tomilov\/freq\/blob\/master\/sparsest.cpp\" rel=\"noopener noreferrer nofollow\">sparsest.cpp<\/a><\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b:<\/p>\n<pre><code class=\"cpp\">uint32_t counts[std::size_t(std::numeric_limits&lt;uint32_t>::max()) + 1];<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u0441\u043b\u043e\u0432 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u0411\u0435\u0436\u0438\u043c \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0435 \u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0445\u044d\u0448 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430. \u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>counts<\/code> \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c, \u0440\u0430\u0432\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0445\u044d\u0448\u0430. \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u0431\u044b\u043b\u043e 0, \u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043b\u043e\u0432\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>words<\/code>. <code>words<\/code> \u0438\u043c\u0435\u0435\u0442 \u0442\u043e\u0442 \u0436\u0435 \u0440\u0430\u0437\u043c\u0435\u0440, \u0447\u0442\u043e \u0438 <code>counts<\/code>. \u041f\u043e\u0441\u043b\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u0431\u0435\u0436\u0438\u043c \u043f\u043e <code>counts<\/code> \u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043b\u043e\u0432\u0430 \u0438\u0437 <code>words<\/code>. \u0421\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u044b \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c.<\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u0430\u043d\u044b \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 (4096 \u0431\u0430\u0439\u0442 \u043d\u0430 x86) \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 1.026 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b (\u043b\u0438\u0431\u043e 0). \u0422\u043e \u0435\u0441\u0442\u044c \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0435\u043d\u0438\u0432\u043e, \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u0430\u044f \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u0435\u0441\u043b\u0438 \u043c\u044b &#171;\u0442\u0440\u043e\u0433\u0430\u0435\u043c&#187; \u043f\u0430\u043c\u044f\u0442\u044c &#8212; \u043f\u0438\u0448\u0435\u043c \u0432 \u043d\u0435\u0451 \u0438\u043b\u0438 \u0447\u0438\u0442\u0430\u0435\u043c. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0442\u043e\u043b\u044c \u0440\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u043e\u0439 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u0430\u044f, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u041e\u0421 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0435 16 \u0413\u0411 <code>counts<\/code> \u0438 \u043d\u0430\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0438, \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u043d\u0443\u043b\u0438. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u043d\u0435\u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044b\u0435 \u043f\u0440\u0438 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u043f\u044f\u0442\u044c \u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0434\u0435\u0442\u044b (\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u044b) \u0438 \u0434\u043b\u044f \u043d\u0438\u0445 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c, \u0447\u0442\u043e \u0434\u0430\u0441\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0434\u043b\u0435\u043d\u0438\u0435 (\u0438 \u0440\u043e\u0441\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438). \u0412\u0441\u0435\u0433\u043e \u043f\u0440\u0438 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0435 \u0437\u0430\u0434\u0435\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 4.9% \u0432\u0441\u0435\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f <code>counts<\/code>, \u043d\u043e \u041e\u0421 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 100% \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445.<\/p>\n<p>\u0412 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438. \u0412 Linux \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b <code>\/proc\/PID\/pagemap<\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u0414\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043a \u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043a <code>\/proc\/self\/pagemap<\/code>. \u0424\u0430\u0439\u043b \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 64-\u0431\u0438\u0442\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0434\u043b\u044f \u0442\u0435\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c. \u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0438\u043c\u0435\u044e\u0449\u0435\u0439 \u0430\u0434\u0440\u0435\u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430 <code>p<\/code>, \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 <code>offset<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0432 <code>\/proc\/self\/pagemap<\/code> \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a: <code>offset = std::uintptr_t(p) \/ getpagesize()<\/code> &#8212; \u044d\u0442\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 \u0444\u0430\u0439\u043b\u0435 \u0432 8-\u0431\u0430\u0439\u0442\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0430\u0445. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0437\u043d\u0430\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u0438\u0435 \u0431\u043b\u043e\u043a\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0435 \u0431\u044b\u043b\u0438 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044b, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438\u0445 \u0446\u0435\u043b\u0438\u043a\u043e\u043c: \u0432 \u043d\u0438\u0445 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043d\u0443\u043b\u0438.<\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u0434, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 <code>2^32<\/code> \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u043b\u0430\u0433 <code>-mcmodel=medium<\/code>. \u0422\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 <code>64 - log2(4096) + log2(8) = 55<\/code> \u0431\u0438\u0442 \u0432 \u0444\u0430\u0439\u043b\u0435 <code>\/proc\/self\/pagemap<\/code> \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 64-\u0431\u0438\u0442\u043d\u044b\u0445 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u0432 <code>&lt;stdio.h><\/code>. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c <code>-D_FILE_OFFSET_BITS=64<\/code> \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0447\u0435\u0433\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>fseeko64<\/code>.<\/p>\n<p>\u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0443 \u043c\u0435\u043d\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0412 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u043e 32GB RAM (swap \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d) \u0438 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0435\u0441\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439, \u041e\u0421 \u043d\u0435 \u0434\u0430\u0451\u0442. <code>systemd-run --scope -p MemoryMax=33G --user .\/sparsest<\/code> \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u0438\u043d \u0438\u0437 \u0434\u0432\u0443\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 <code>counts<\/code> \u0438 <code>words<\/code> \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0443\u0440\u0435\u0437\u0430\u0442\u044c: \u0432\u043c\u0435\u0441\u0442\u043e <code>uint32_t<\/code> \u0434\u043b\u044f <code>words<\/code> (\u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u0442\u0438\u043f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043c\u0435\u0449\u0430\u0442\u044c 1883056) \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b 3-\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u0442\u0438\u043f <code>uint24<\/code>:<\/p>\n<pre><code class=\"cpp\">#pragma pack(push, 1) struct uint24 {     unsigned value : 24; }; #pragma pack(pop)<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:<\/p>\n<ul>\n<li>\n<p>6.07 \u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u0435\u0441\u043b\u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0435 16\u0413\u0411 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>counts<\/code>.<\/p>\n<\/li>\n<li>\n<p>2.07 \u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>\/proc\/self\/pagemap<\/code> \u0434\u043b\u044f \u043e\u0442\u0441\u0435\u0432\u0430 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u043f\u0443\u0441\u0442\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435 \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 trie. \u0414\u0432\u0438\u0433\u0430\u0435\u043c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<h3>\u0425\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u043f\u043b\u043e\u0442\u043d\u0435\u0435<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432, \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>\u0411\u0443\u0434\u0435\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0434\u0432\u043e\u0439\u043a\u0438. \u041f\u043e\u0447\u0435\u043c\u0443? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0432\u0437\u044f\u0442\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0434\u0432\u043e\u0439\u043a\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u043e\u0433\u043e \u0418 \u0441 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439 \u0432\u0438\u0434\u0430 <code>0b111...111<\/code>. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u044d\u0442\u0430 \u043d\u0430 \u043f\u043e\u043b\u0442\u043e\u0440\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 (\u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u044b\u0445 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437) \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 (\u0447\u0430\u0441\u0442\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u0434 \u043f\u0440\u0430\u0432\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 <code>x = a \/ b; y = a % b;<\/code> \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0441\u0442\u043e\u044f\u0442 \u0440\u044f\u0434\u043e\u043c: <code>idiv<\/code> \u043d\u0430 x86). \u0417\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438\u0437 \u0440\u044f\u0434\u0430 \u0441\u0442\u0435\u043f\u0435\u043d\u0435\u0439 \u0434\u0432\u043e\u0439\u043a\u0438 &#8212; \u044d\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f \u0441\u0442\u043e\u043b\u044c \u0443\u0437\u043a\u043e\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u043d\u043e \u0438 \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446 \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u0437\u044f\u0442\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u043d\u0443\u0436\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0434\u043b\u0438\u043d\u043e\u0439 <code>n<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043b\u0435\u0436\u0430\u0449\u0435\u0435 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 <code>{0, 1, ..., m - 1}<\/code>, \u043a\u043e\u0433\u0434\u0430 <code>m > n<\/code>. \u041e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 <code>{0, 1, ..., n - 1}<\/code>.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u0437\u044f\u0442\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u0437\u0430\u0438\u043c\u043d\u043e\u0439 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u0432 \u043e\u0434\u043d\u0443 \u044f\u0447\u0435\u0439\u043a\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u043e. \u041e\u0434\u0438\u043d \u043f\u043e\u0434\u0445\u043e\u0434 &#8212; \u044d\u0442\u043e chaining, \u043a\u043e\u0433\u0434\u0430 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043c\u0430\u0441\u0438\u0432\u0430. \u0422\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0435, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u0445\u044d\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044f. \u0414\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 &#8212; open addressing. \u041e\u043d \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u0445\u044d\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443-\u043b\u0438\u0431\u043e <em>\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443<\/em> \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043d\u0435\u0437\u0430\u043d\u044f\u0442\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443.<\/p>\n<p>Open addressing \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u043d\u0430\u0434\u0435\u0436\u0434\u0435 \u043d\u0430\u0439\u0442\u0438 \u043f\u0443\u0441\u0442\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443. \u042d\u0442\u043e \u043b\u0438\u0448\u043d\u0438\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u0436\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 (\u0430\u043d\u0433\u043b. linear probing, \u043f\u0440\u0438 \u0445\u044d\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439-\u043f\u043e-\u043c\u043e\u0434\u0443\u043b\u044e-\u0440\u0430\u0437\u043c\u0435\u0440\u0430-\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442) \u0431\u0443\u0434\u0443\u0442 \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u043a\u0430\u043a-\u0442\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c chaining? \u0412\u0435\u0434\u044c chaining &#8212; \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0434\u043d\u043e\u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b (\u043a\u043e\u0440\u0437\u0438\u043d\u0443), \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0438 \u043d\u0430\u0434\u0435\u044f\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043e\u043d \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0433\u0438\u0431\u0440\u0438\u0434 chaining \u0438 open addressing: \u0432 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043f\u0440\u0438 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044f\u0445 \u043f\u043e \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044e \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e \u0432\u0442\u043e\u0440\u043e\u043c\u0443.<\/p>\n<h3>\u041f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u0437\u0438\u043d<\/h3>\n<p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u0432 \u043e\u0434\u043d\u0443 \u043a\u043e\u0440\u0437\u0438\u043d\u0443, &#8212; <code>213637 \/ 2^b<\/code>, \u0433\u0434\u0435 <code>2^b<\/code> &#8212; \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0440\u0437\u0438\u043d.<br \/> \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043a\u043e\u0440\u0437\u0438\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 <code>a<\/code> \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\frac{\\Gamma(a + 1, \\, 213637 \/ 2^b)}{\\Gamma(a + 1)}\" alt=\"\\frac{\\Gamma(a + 1, \\, 213637 \/ 2^b)}{\\Gamma(a + 1)}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/511\/fd5\/a9f\/511fd5a9f371e2bab79d62f8da9918fa.svg\" width=\"177\" height=\"55\"\/><\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043b\u044f <code>2^b<\/code> \u043a\u043e\u0440\u0437\u0438\u043d \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e \u043d\u0438 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043d\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 <code>a<\/code> \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\left(\\frac{\\Gamma(a + 1, \\, 213637 \/ 2^b)}{\\Gamma(a + 1)}\\right)^{2^b}\" alt=\"\\left(\\frac{\\Gamma(a + 1, \\, 213637 \/ 2^b)}{\\Gamma(a + 1)}\\right)^{2^b}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ab0\/cf5\/858\/ab0cf585842096cee884fe2a9aa950d0.svg\" width=\"223\" height=\"69\"\/><\/p>\n<p>\u041a\u0430\u043a\u043e\u0432\u0430 \u0436\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0438\u0442\u0441\u044f \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043b\u044f <code>2^b<\/code> \u043a\u043e\u0440\u0437\u0438\u043d \u043d\u0435 \u0434\u0430\u0441\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0438 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043f\u0440\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0435 \u043a\u043e\u0440\u0437\u0438\u043d\u044b <code>a<\/code>? \u0411\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <code>a<\/code> \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0434\u0432\u043e\u0439\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u043a\u044d\u0448-\u043b\u0438\u043d\u0438\u044e: 4, 8, 16, 32.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>a\\b<\/p>\n<\/th>\n<th>\n<p>13<\/p>\n<\/th>\n<th>\n<p>14<\/p>\n<\/th>\n<th>\n<p>15<\/p>\n<\/th>\n<th>\n<p>16<\/p>\n<\/th>\n<th>\n<p>17<\/p>\n<\/th>\n<th>\n<p>18<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">4<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">3.36E-7444<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.83E-1463<\/p>\n<\/td>\n<td>\n<p align=\"left\">5.44E-175<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">3.54E-3369<\/p>\n<\/td>\n<td>\n<p align=\"left\">9.52E-184<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00107<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.946<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">7.25E-1304<\/p>\n<\/td>\n<td>\n<p align=\"left\">4.66E-7<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.995<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.00<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">32<\/p>\n<\/td>\n<td>\n<p align=\"left\">8.23E-404<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.959<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.00<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434, \u0434\u0430\u044e\u0449\u0438\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u0443\u044e \u0432\u044b\u0448\u0435<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">from decimal import Decimal, getcontext from scipy.special import gammaincc   def prob(k, b, s):     return Decimal(gammaincc(s + 1, k \/ b)) ** b   K = 213637 A = [4, 8, 16, 32] B = range(13, 19)  print('|a\\\\b', end='|') for b in B:     print(b, end='|') print()  print('|:---:', end='|') for b in B:     print(':---:', end='|') print()  getcontext().prec = 3 for a in A:     print(f'|{a}', end='|')     for b in B:         if a * 2 ** b >= K:             print(prob(K, 2 ** b, a), end='|')         else:             print('-', end='|')     print()<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u0412\u044b\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/h3>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043c\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0435 \u0434\u0430\u044e\u0449\u0443\u044e \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u043d\u0430 \u043d\u0430\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u0432 \u043e\u0434\u043d\u0443 \u043a\u043e\u0440\u0437\u0438\u043d\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u0445\u044d\u0448\u0430 <code>hashLow<\/code>, \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u0445\u044d\u0448\u0430 <code>hashHigh<\/code> \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u044b. \u0415\u0441\u043b\u0438 \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u0445\u044d\u0448\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0435 \u043d\u0430\u0440\u044f\u0434\u0443 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c, \u0442\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0448\u044c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044f \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u0430 \u0445\u044d\u0448\u0430, \u043c\u043e\u0436\u043d\u043e \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0430\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e.<\/p>\n<p>\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0442.\u0435. \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438-\u0441\u043b\u043e\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0434\u043b\u0438\u043d\u0443 70 \u0431\u0430\u0439\u0442, \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0435 \u043a\u043e\u043d\u0442\u0440\u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u043e. \u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0435 \u0440\u0430\u0437\u0434\u0443\u043b\u043e \u0431\u044b \u0435\u0451 \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u043b\u0435\u043a\u043e \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043e\u0434\u043d\u043e\u0439 \u043a\u044d\u0448-\u043b\u0438\u043d\u0438\u0438 (64 \u0431\u0430\u0439\u0442\u0430). \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0434\u0430\u043d\u043d\u044b\u0435 \u044d\u0442\u0438 \u0432 \u0445\u043e\u0434\u0435 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u0441\u043b\u043e\u0432 \u043d\u0435 \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0434\u0438\u043d\u043e\u0436\u0434\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0441\u043b\u043e\u0432\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f 3 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u0445\u044d\u0448\u0430, \u0441\u0447\u0451\u0442\u0447\u0438\u043a, \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0441\u043b\u043e\u0432\u043e. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c &#171;\u0433\u043e\u0440\u044f\u0447\u0438\u043c\u0438&#187; \u0438\u0437 \u043d\u0438\u0445 \u0431\u0443\u0434\u0443\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a. \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 <code>words[hashLow][popcnt(hashHigh != 0)]<\/code>, \u0438\u043c\u0435\u044e\u0449\u0435\u043c \u0442\u0435 \u0436\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438, \u0447\u0442\u043e \u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\u0438.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u0442\u043e\u0438\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0432\u044b\u0431\u043e\u0440\u0430 AoS vs SoA (&#171;array of structures versus structure of arrays&#187;). \u0425\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u0438 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u044b \u0445\u044d\u0448\u0430 \u0432\u043f\u0435\u0440\u0435\u043c\u0435\u0448\u043a\u0443 \u0441\u043e \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430\u043c\u0438? \u0415\u0441\u043b\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u044b \u0445\u044d\u0448\u0430 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 <code>hashesHigh<\/code>, \u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043a\u0430\u043a \u0432\u0435\u043a\u0442\u043e\u0440 \u0432 SSE\/AVX \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441 \u043d\u043e\u0432\u044b\u043c \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u043e\u043c \u0445\u044d\u0448\u0430 \u0437\u0430 \u043e\u0434\u043d\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0435\u0436\u0430\u0442\u044c \u0446\u0438\u043a\u043b\u043e\u043c \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443, \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u044f \u0432\u0441\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0446\u0438\u043a\u043b \u044d\u0442\u043e\u0442 \u0438\u043c\u0435\u043b \u0431\u044b \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u0434\u0430\u0436\u0435 \u0431\u0443\u0434\u0443\u0447\u0438 \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u044b\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043d \u0441\u043a\u043e\u0440\u0435\u0439 \u0432\u0441\u0435\u0433\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0431\u044b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430, \u0447\u0442\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0434\u0430\u043b\u043e \u0431\u044b \u043a\u043e\u0434 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439, \u0447\u0435\u043c \u043f\u0430\u0440\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c, \u043a\u0430\u043a \u0446\u0435\u043b\u044b\u043c.<\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432, \u043a\u0430\u043a\u043e\u0439 \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u0445\u044d\u0448\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c, \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0434\u0451\u043c \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u043d\u0435\u0437\u0430\u043d\u044f\u0442\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0441\u043e \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430\u043c\u0438, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043d\u043e\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u043e \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 <code>words<\/code>.<\/p>\n<p>\u041e\u0446\u0435\u043d\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0435. \u0421\u0447\u0451\u0442\u0447\u0438\u043a &#8212; \u044d\u0442\u043e <code>uint32_t<\/code> (\u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u044d\u0448-\u043b\u0438\u043d\u0438\u0438 \u043f\u0440\u0438\u0436\u043c\u0451\u0442, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u044f\u0442\u044c \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>uint24<\/code>), \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u0445\u044d\u0448\u0430 &#8212; \u044d\u0442\u043e \u043b\u0438\u0431\u043e <code>uint32_t<\/code>, \u043b\u0438\u0431\u043e, \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 16 \u0431\u0438\u0442, <code>uint16_t<\/code> (\u0438\u043b\u0438 \u0434\u0430\u0436\u0435 <code>uint8_t<\/code>, \u043d\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0441\u044f). \u0420\u0435\u0448\u0438\u043c \u043d\u0435\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0432 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u043b\u0430\u0445: <code>(sizeof(hashHigh) + sizeof(counter)) * x = (4 + 4) * x &lt;= 64<\/code>. \u041e\u0442\u043a\u0443\u0434\u0430 <code>x &lt;= 8<\/code>. \u0414\u043b\u044f <code>hashHigh<\/code> \u0442\u0438\u043f\u0430 <code>uint16_t<\/code> \u0440\u0435\u0448\u0435\u043d\u0438\u0435 &#8212; <code>x &lt;= 10<\/code>. SSE\/AVX \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0434\u0432\u043e\u0439\u043a\u0438. \u041e\u0442\u0441\u044e\u0434\u0430 &#8212; \u043a\u043e\u0440\u0437\u0438\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c 8 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0414\u043b\u044f <code>b = 17<\/code> \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u0443\u044e \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043d\u0435 \u0434\u0430\u044e\u0449\u0443\u044e \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439 \u0434\u0430\u0436\u0435 \u0434\u043b\u044f \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0439 \u0432\u0441\u0435\u0433\u043e 8 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u041f\u0440\u0438 \u0442\u0430\u043a\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b (<code>a = 8<\/code>, <code>b = 17<\/code>) \u0434\u043e\u043b\u044f \u0437\u0430\u043d\u044f\u0442\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 (\u0430\u043d\u0433\u043b. occupancy) \u0440\u0430\u0432\u043d\u0430  <code>~0.203<\/code>. \u0412 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c <code>~1.63<\/code> \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.<\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0444\u0430\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 <code>b = 17<\/code> \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c. \u0414\u043b\u044f \u043f\u043e\u043c\u0435\u0442\u043a\u0438 \u043d\u0435\u0437\u0430\u043d\u044f\u0442\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 &#171;tombstone&#187; &#8212; \u0442\u0430\u043a\u043e\u0435 \u043e\u0441\u043e\u0431\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>hashesHigh<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f <code>hashHigh<\/code>. \u0415\u0441\u043b\u0438 <code>hashHigh<\/code> \u0438\u043c\u0435\u0435\u0442 15 \u0437\u043d\u0430\u0447\u0430\u0449\u0438\u0445 \u0431\u0438\u0442, \u0442\u043e \u043f\u0440\u0438 \u0442\u0438\u043f\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>hashesHigh<\/code> <code>uint16_t<\/code> \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 \u0432\u0441\u0435\u0445 \u043d\u0435\u0437\u0430\u043d\u044f\u0442\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u0438\u0446\u0443, \u0447\u0442\u043e\u0431\u044b \u043b\u044e\u0431\u043e\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>hashHigh<\/code>, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u043a\u0430\u043a <code>hash >> 17<\/code>, \u043e\u0442\u043b\u0438\u0447\u0430\u043b\u043e\u0441\u044c \u043e\u0442 \u043d\u0435\u0433\u043e. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 SSE\/AVX \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 (<a href=\"https:\/\/www.laruence.com\/sse\/#expand=2432,2428,3864&amp;text=_movemask_\" rel=\"noopener noreferrer nofollow\">movemask<\/a>), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0440\u0448\u0438\u0445 \u0431\u0438\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0438\u0445 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0414\u0440\u0443\u0433\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 (<a href=\"https:\/\/www.laruence.com\/sse\/#expand=2432,2428,3864,406,3503&amp;text=bsf\" rel=\"noopener noreferrer nofollow\">bsf<\/a>, <a href=\"https:\/\/www.laruence.com\/sse\/#expand=2432,2428,3864,406,3503&amp;text=lzcnt&amp;techs=Other\" rel=\"noopener noreferrer nofollow\">lzcnt<\/a>) \u0434\u0430\u043b\u0435\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u0438\u0442\u0430 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043d\u0435\u0437\u0430\u043d\u044f\u0442\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 <code>hashesHigh<\/code>. \u0412\u0441\u0451 \u044d\u0442\u043e \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0446\u0438\u043a\u043b\u043e\u0432 \u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432.<\/p>\n<p>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 &#8212; \u044d\u0442\u043e 0.892 \u0441\u0435\u043a\u0443\u043d\u0434\u044b. \u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u041a\u043e\u0433\u0434\u0430 \u044f \u0430\u0432\u0442\u043e\u0440\u0443 \u0441\u043e\u043e\u0431\u0449\u0438\u043b, \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0438\u0433 \u0441\u0443\u0431\u0441\u0435\u043a\u0443\u043d\u0434\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u043e\u043d \u043e\u0442\u0432\u0435\u0442\u0438\u043b &#171;\u043d\u0443, \u0442\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0433\u043d\u0430\u043b \u0438 \u0441 \u043c\u0435\u043d\u044f \u0431\u0443\u0434\u0435\u0442 \u0431\u0443\u0442\u044b\u043b\u043a\u0430&#187;.<\/p>\n<p><a href=\"https:\/\/github.com\/tomilov\/freq\/blob\/master\/oaph.cpp\" rel=\"noopener noreferrer nofollow\">oaph.cpp<\/a><\/p>\n<h3>\u0412\u044b\u0432\u043e\u0434\u044b<\/h3>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0435\u0441\u043b\u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0443\u043f\u0443\u0449\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0438.<\/p>\n<p>\u041c\u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e \u0434\u0443\u0448\u0435 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 trie. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0436\u0435 \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c seed-\u043e\u043c, \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043d\u0438\u0445 (\u043d\u0443 \u043f\u043e\u0447\u0442\u0438). \u0425\u043e\u0442\u044f \u0438 \u0434\u043b\u044f \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u0441\u0442\u0430\u0442\u044c\u0435, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0443\u043c \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0437\u0430\u0440\u0430\u043d\u0435\u0435. \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0443\u043c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u0443\u0436\u0435 \u0434\u043b\u044f 436492 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0439\u0442\u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u0443\u044e \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0430 \u0431\u0430\u0437\u0435 CRC32 \u043c\u0435\u043d\u044c\u0448\u0435 <code>2^-32<\/code>.<\/p>\n<pre><code class=\"python\">m = Decimal(2 ** 32) k = 1 value = Decimal(1) while value * m >= 1: value *= 1 - Decimal(k) \/ m k += 1  print(k)  # 436492<\/code><\/pre>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0433\u0434\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0432 (\u0438\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u043e\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u044b), \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0448\u043b\u0438 <code>seed<\/code>, \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0441\u043b\u043e\u0432 \u0432 \u0442\u0435\u043a\u0441\u0442\u0430\u0445, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435. \u0415\u0441\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0438, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044f\u043c\u0438 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u0440\u0437\u0438\u043d, \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b, \u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u0435\u043d. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<h3>On genre<\/h3>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, &#171;\u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0430\u0443\u0447\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u0440\u0438\u0439\u0442\u0438 \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e&#187;. \u0421\u0430\u043c\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044f \u043d\u0430\u0448\u0451\u043b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e, \u0445\u043e\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435. \u041f\u043e\u0432\u0435\u0437\u043b\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u044b\u0439 seed (10675 \u043f\u0440\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 <code>~10^-5<\/code>) \u043d\u0430\u0448\u0451\u043b\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e. \u0412\u0441\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u0431\u044b\u043b\u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u044b \u043f\u043e\u0441\u0442\u0444\u0430\u043a\u0442\u0443\u043c, \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u043c \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<p>\u0418\u0434\u0435\u044f \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0431\u044b\u043b\u0430 \u043c\u043d\u043e\u044e \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/engineering.fb.com\/2019\/04\/25\/developer-tools\/f14\/\" rel=\"noopener noreferrer nofollow\">Open-sourcing F14 for faster, more memory-efficient hash tables<\/a>. \u0418\u0434\u0435\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u0443\u044e \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e &#8212; \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f, \u043a\u0430\u043a \u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439.<\/p>\n<h3>\u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e<\/h3>\n<p>\u041e\u0431\u043e \u0432\u0441\u0435\u0445 \u043d\u0435\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044f\u0445, \u043f\u043e\u043c\u0430\u0440\u043a\u0430\u0445 \u0438 \u0441\u0442\u0438\u043b\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u043f\u0440\u043e\u0448\u0443 \u0441\u043e\u043e\u0431\u0449\u0430\u0442\u044c \u0432 \u043b\u0438\u0447\u043a\u0443.<\/p>\n<p>\u0412 \u043a\u043e\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u0440\u0430\u0434 \u0431\u044b\u043b \u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438. \u0422\u0430\u043a\u0438\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u044e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u043c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435. \u0422\u0430\u043a\u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u0432\u0430\u0448\u0435 \u043c\u043d\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u0438\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0441\u0442\u043e\u0438\u043b\u043e \u0431\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u041a\u043e\u043b\u0435 \u041a. \u0437\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0443\u0440\u0443 \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0443\u0440\u0443. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0430\u0432\u0442\u043e\u0440\u0443 \u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0430 \u0437\u0430\u0434\u0430\u0447\u0443.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/575108\/\"> https:\/\/habr.com\/ru\/post\/575108\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u0425\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u041e\u043d\u0430 \u0438\u043c\u0435\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0443 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u0435\u043d\u044f\u044e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u044b\u0435 \u043c\u0435\u0441\u044f\u0446\u044b \u043a\u043e\u0432\u0438\u0434\u043d\u043e\u0439 \u044d\u0440\u044b \u0442\u0430\u043a \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043d\u0430 \u043c\u043e\u0435\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432\u0441\u0435\u043c \u0443\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0438\u043b\u0438 \u0437\u0430\u0440\u043f\u043b\u0430\u0442\u0443 \u0438 \u044f, \u043d\u0435\u0434\u043e\u043b\u0433\u043e \u0434\u0443\u043c\u0430\u044f, \u043f\u043e\u0448\u0451\u043b \u043d\u0430 \u0440\u044b\u043d\u043e\u043a \u0442\u0440\u0443\u0434\u0430. \u041d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435 \u0432 \u043e\u0434\u043d\u0443 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0443\u044e \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0443\u044e IT-\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443. \u0417\u0430\u0434\u0430\u0447\u043a\u0443 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0435\u0448\u0438\u0442\u044c: \u0440\u0435\u0448\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e, \u043d\u0435 &#171;\u0443\u0431\u0438\u0432&#187; \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c &#171;\u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u0443\u0436\u0430\u0441 \u0431\u044b\u043b&#187;.<\/p>\n<p>\u0423\u0436\u0435 \u0437\u0430 \u0440\u0430\u043c\u043a\u0430\u043c\u0438 &#171;\u0432\u0441\u0442\u0443\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u044f&#187; \u0440\u0430\u0434\u0438 \u0441\u043f\u043e\u0440\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438. \u0421\u043f\u0443\u0441\u0442\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0433\u043e\u0434 \u043f\u043e\u0441\u043b\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043f\u0440\u0438\u0448\u043b\u0438 \u043d\u043e\u0432\u044b\u0435 \u0438\u0434\u0435\u0438 \u0438 \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043e \u0447\u0451\u043c \u0438 \u043f\u043e\u0439\u0434\u0451\u0442 \u0440\u0435\u0447\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<h3>\u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438<\/h3>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438:<\/p>\n<blockquote>\n<p>\u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0441\u0447\u0438\u0442\u0430\u043b\u043a\u0443 \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f.<br \/>\u0421\u043b\u043e\u0432\u043e\u043c \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0445 \u0431\u0443\u043a\u0432, <code>[a-zA-Z]+<\/code>. \u0412\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u043a\u0440\u043e\u043c\u0435 <code>[a-zA-Z]<\/code>, \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438. \u0421\u043b\u043e\u0432\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043a \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443. \u0412\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0447\u0430\u0441\u0442\u043e\u0442\u0443, \u0437\u0430\u0442\u0435\u043c \u0441\u0430\u043c\u043e \u0441\u043b\u043e\u0432\u043e, \u043f\u0440\u0438\u0447\u0451\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e \u0447\u0430\u0441\u0442\u043e\u0442\u0435 \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e, \u0430 \u0441\u043b\u043e\u0432\u0430, \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u043e\u0442\u0443, \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0443. \u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<\/blockquote>\n<pre><code class=\"bash\"> $ cat in.txt I agree with you I say what you do about the world It's poison And it's sick And you want to get out of it  $ freq in.txt out.txt  $ cat out.txt 3 it 3 you 2 and 2 i 2 s 1 about 1 agree 1 do 1 get 1 of 1 out 1 poison 1 say 1 sick 1 the 1 to 1 want 1 what 1 with 1 world<\/code><\/pre>\n<blockquote>\n<p>\u0420\u0435\u0448\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0432 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a.<\/p>\n<\/blockquote>\n<p>\u041a\u0430\u043a \u043f\u043e\u0442\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c (\u0438 \u044d\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442), \u0441\u0447\u0438\u0442\u0430\u043b\u043a\u0443 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430: <a href=\"https:\/\/disk.yandex.ru\/d\/mOY5CrveIAOtnQ\" rel=\"noopener noreferrer nofollow\">pg.txt<\/a> (\u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u2014 \u0430\u0440\u0445\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439  \u0444\u0430\u0439\u043b). \u0424\u0430\u0439\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u0440\u043f\u0443\u0441 \u0438\u0437 \u0441\u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c, \u043d\u0435\u043c\u0435\u0446\u043a\u043e\u043c \u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445.<\/p>\n<pre><code class=\"bash\"> $ md5sum *.txt 850944413ba9fd1dbf2b9694abaa930d *lf.txt d1362c6c9de664c34c3066ec1d01078f *crlf.txt<\/code><\/pre>\n<blockquote>\n<p>\u0441\u043e\u043e\u0442\u0432 \u0434\u0432\u0435 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0445 md5<\/p>\n<\/blockquote>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u043d\u0430 &#171;\u0441\u0440\u0435\u0434\u043d\u0435\u043c&#187; \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b x86-64. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n<h3>\u0413\u0434\u0435 \u0432\u0441\u0451 \u043d\u0430\u0439\u0442\u0438<\/h3>\n<p>\u041a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0432\u0435\u0442\u043a\u0435 master <a href=\"https:\/\/github.com\/tomilov\/freq\/tree\/master\" rel=\"noopener noreferrer nofollow\"><strong>\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/strong><\/a>.<\/p>\n<h3>\u041e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0437\u0430\u043c\u0435\u0440\u043e\u0432 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0434\u043b\u044f <a href=\"https:\/\/ark.intel.com\/content\/www\/ru\/ru\/ark\/products\/75273\/intel-xeon-processor-e5-2667-v2-25m-cache-3-30-ghz.html\" rel=\"noopener noreferrer nofollow\">Intel(R) Xeon(R) CPU E5-2667 v2 @ 3.30GHz<\/a>. \u042d\u0442\u043e Ivy Bridge. \u041f\u0430\u043c\u044f\u0442\u044c &#8212; DDR3 1866MHz ECC REG, 4 channels.<\/p>\n<p>\u041c\u043e\u0439 \u0432\u044b\u0431\u043e\u0440 \u044f\u0437\u044b\u043a\u0430 \u2014 C++. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u2014 GCC\/clang \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438\u0437 Visual Studio 2019 \u0438 MinGW-w64 (\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 Windows).<\/p>\n<p>\u041d\u0430 Windows \u044f \u0432 \u0438\u0442\u043e\u0433\u0435 \u0437\u0430\u0431\u0438\u043b, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0437\u0430\u043c\u0435\u0440\u043e\u0432 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043d\u0451\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0438 \u0436\u0435\u043b\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435\u0433\u043e, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u044d\u043d\u0435\u0440\u0433\u043e\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f Performance.<\/p>\n<p>\u041d\u0430 GCC \u0442\u043e\u0436\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u043b\u0441\u044f \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u043e\u0433\u043b\u043e \u0447\u0442\u043e-\u0442\u043e \u0440\u0430\u0437\u043e\u0439\u0442\u0438\u0441\u044c. \u0412 \u0445\u043e\u0434\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u0430\u0436\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b <a href=\"https:\/\/gcc.gnu.org\/bugzilla\/show_bug.cgi?id=105808\" rel=\"noopener noreferrer nofollow\">\u0431\u0430\u0433<\/a> \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430.<\/p>\n<h3>\u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430<\/h3>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432: 336 183 276.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ du -b pg.txt 336183276       pg.txt  $ LC_ALL=\"C\" wc -m pg.txt 336183276 pg.txt<\/code><\/pre>\n<p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0444\u0430\u043b\u0430, \u0442.\u043a. \u0444\u0430\u0439\u043b \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0442\u0435\u043a\u0441\u0442 \u0432 \u043e\u0434\u043d\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0439 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435.<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0432: 58 801 281.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">  $ LC_ALL=\"C\" awk -F '[^A-Za-z]+' '  {      for (i = 1; i &lt;= NF; ++i)          if ($i)              ++j  }  END {      print j  }  ' pg.txt  58801281<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0427\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u043b\u043e\u0432: 213 637.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ LC_ALL=\"C\" awk -F '[^A-Za-z]+' ' {     for (i = 1; i &lt;= NF; ++i)         if ($i)             ++w[tolower($i)] } END {     print length(w) } ' pg.txt 213637<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u043e\u0432 \u0442\u043e\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438. \u0414\u043b\u044f \u043a\u043e\u0440\u043f\u0443\u0441\u0430 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c.<\/p>\n<p>\u0412\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u0447\u0430\u0441\u0442\u043e\u0442 \u0441\u043b\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430, \u0442\u0430\u043a \u043a\u0430\u043a <code>58801281 >> 213637<\/code>. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0443\u043f\u043e\u0440 \u043f\u0440\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u043f\u043e\u0441\u0447\u0451\u0442 \u0447\u0430\u0441\u0442\u043e\u0442 \u0441\u043b\u043e\u0432.<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d \u0441\u043b\u043e\u0432.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ LC_ALL=\"C\" awk -F '[^A-Za-z]+' ' {     for (i = 1; i &lt;= NF; ++i)         if ($i)             ++l[length($i)] } END {     for (j in l)         print j, l[j] } ' pg.txt | sort -k1g | column -t 1   3018380 2   10389242 3   13784482 4   10605768 5   6407052 6   4713535 7   3845034 8   2404953 9   1742863 10  1020733 11  455583 12  249480 13  108981 14  38231 15  12161 16  3546 17  881 18  219 19  73 20  20 21  15 22  8 23  2 24  7 25  1 27  2 28  2 29  5 32  3 34  1 35  1 37  3 42  1 44  2 48  1 51  1 53  1 58  1 61  2 64  1 66  2 68  1 70  1<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u0441\u043b\u043e\u0432\u0430 &#8212; 70, \u0441\u0440\u0435\u0434\u043d\u044f\u044f &#8212; 4.25, \u043c\u0435\u0434\u0438\u0430\u043d\u043d\u0430\u044f &#8212; 4<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ LC_ALL=C awk -F '[^A-Za-z]+' ' {     for (i = 1; i &lt;= NF; ++i)         if ($i)             print length($i) } ' pg.txt | sort -n | jq -s ' {     count: length,     mininum: min,     average: (add \/ length),     maximum: max,     median: .[length \/ 2  floor],     p90: .[length * 0.90 | floor],     p95: .[length * 0.95 | floor],     p99: .[length * 0.99 | floor],     p999: .[length * 0.999 | floor] } ' {   \"count\": 58801281,   \"mininum\": 1,   \"average\": 4.25427611007318,   \"maximum\": 70,   \"median\": 4,   \"p90\": 8,   \"p95\": 9,   \"p99\": 11,   \"p999\": 13 }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>99.9979% \u0441\u043b\u043e\u0432 \u0438\u043c\u0435\u044e\u0442 \u0434\u043b\u0438\u043d\u0443, \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u044e\u0449\u0443\u044e 16 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (\u0431\u0430\u0439\u0442).<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ LC_ALL=C awk -F '[^A-Za-z]+' ' {     for (i = 1; i &lt;= NF; ++i)         if ($i)             print length($i) } ' pg.txt | sort -n | awk ' \/17\/ { if (!i) i = NR } END { print i \/ NR } ' 0.999979<\/code><\/pre>\n<p>\u0417\u043d\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u0430 \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0439. \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u043e \u044f \u043d\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430.<\/p>\n<\/div>\n<\/details>\n<h3>\u0420\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c md5 hash \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0443\u0441\u0442\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0430\u044f, \u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430\u044f \u0438 \u043e\u0442\u0432\u0435\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0433\u043b\u0430\u0437\u0430\u043c\u0438 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441 \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0439, \u043d\u043e \u0435\u0449\u0451 \u043f\u043e\u043a\u0430 \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0439, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 (\u0434\u043b\u044f \u043c\u0435\u043d\u044f) \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0447\u0438\u0442\u0430\u043b\u043a\u0443 &#171;\u043d\u0430 bash&#187; (\u0447\u0442\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>sed<\/code>, <code>awk<\/code>, <code>sort<\/code>, <code>uniq<\/code> \u0438 \u0442.\u043f.). \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u043d\u0430 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">LC_ALL=\"C\" awk -F '[^A-Za-z]+' ' {     for (i = 1; i &lt;= NF; ++i)         if ($i)             ++w[tolower($i)] } END {     for (i in w)         print w[i], i } ' | sort -k1gr,2<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0435\u0449\u0430\u044e \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432 \u0444\u0430\u0439\u043b <a href=\"https:\/\/github.com\/tomilov\/freq\/blob\/master\/freq.sh\" rel=\"noopener noreferrer nofollow\">freq.sh<\/a> \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u043d\u0430 \u0432\u0445\u043e\u0434 <code>pg.txt<\/code>, \u0430 (\u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0439) \u0432\u044b\u0432\u043e\u0434 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0432 <code>ref.txt<\/code>.<\/p>\n<pre><code class=\"bash\"> $ time bash freq.sh &lt;pg.txt | tee ref.txt | md5sum - real    0m24.834s user    0m24.759s sys     0m0.090s 850944413ba9fd1dbf2b9694abaa930d  -<\/code><\/pre>\n<p>\u041a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0445\u044d\u0448 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432\u0435\u0440\u043d\u044b\u0439, \u0430 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0435\u0440\u043d\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 (\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 md5 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u044b). \u0412\u0440\u0435\u043c\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 <code>awk<\/code>. \u0413\u043e\u0434 \u043d\u0430\u0437\u0430\u0434 \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u043e \u0437\u0430 120 \u0441\u0435\u043a\u0443\u043d\u0434 \u0432 \u0442\u043e\u043c \u0436\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438.<\/p>\n<h3>\u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430<\/h3>\n<details class=\"spoiler\">\n<summary>\u0422\u043e\u043f \u0441\u043b\u043e\u0432 \u043f\u043e \u0447\u0430\u0441\u0442\u043e\u0442\u0435.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ head -16 ref.txt | column -t 3343241  the 1852717  and 1715705  of 1560152  to 1324244  a 956926   in 933954   i 781286   he 713514   that 690876   was 665710   it 608451   you 580460   his 498427   with 442288   for 433687   had<\/code><\/pre>\n<p>&#171;The&#187; \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f 3343241 \u0440\u0430\u0437. \u0414\u043b\u044f \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>uint32_t<\/code> (\u0438\u043b\u0438 <code>uint24<\/code>, \u043e \u0447\u0451\u043c \u043d\u0438\u0436\u0435).<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d \u0441\u043b\u043e\u0432.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ LC_ALL=\"C\" awk -F '[^A-Za-z]+' ' {     for (i = 1; i &lt;= NF; ++i)         if ($i)             w[tolower($i)] } END {     for (i in w)         ++l[length(i)]     for (j in l)         print j, l[j] } ' pg.txt | sort -k1g | column -t 1   26 2   442 3   2958 4   10757 5   21406 6   31287 7   36105 8   33983 9   28101 10  20362 11  12875 12  7684 13  4045 14  1955 15  921 16  384 17  181 18  60 19  33 20  13 21  12 22  7 23  2 24  7 25  1 27  2 28  2 29  5 32  3 34  1 35  1 37  2 42  1 44  2 48  1 51  1 53  1 58  1 61  2 64  1 66  2 68  1 70  1<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0421\u0440\u0435\u0434\u043d\u044f\u044f \u0434\u043b\u0438\u043d\u0430 \u0441\u043b\u043e\u0432\u0430 &#8212; 7.814<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ LC_ALL=C awk -F '[^A-Za-z]+' ' {     for (i = 1; i &lt;= NF; ++i)         if ($i)             w[tolower($i)] } END {     for (i in w)         print length(w) } ' pg.txt | sort -n | tee \/tmp\/1 | jq -s ' {     count: length,     sum: add,     mininum: min,     average: (add \/ length),     maximum: max,     median: .[length \/ 2 | floor],     p90: .[length * 0.90 | floor],     p95: .[length * 0.95 | floor],     p99: .[length * 0.99 | floor],     p999: .[length * 0.999 | floor] } ' {   \"count\": 213637,   \"sum\": 1669418,   \"mininum\": 1,   \"average\": 7.814273744716505,   \"maximum\": 70,   \"median\": 8,   \"p90\": 11,   \"p95\": 12,   \"p99\": 14,   \"p999\": 17 }<\/code><\/pre>\n<p><code>count<\/code> &#8212; \u044d\u0442\u043e (\u043e\u043f\u044f\u0442\u044c \u0436\u0435) \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0432, <code>sum<\/code> &#8212; \u0441\u0443\u043c\u043c\u0430 \u0438\u0445 \u0434\u043b\u0438\u043d. \u0412\u0435\u0441\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 <code>count + sum = 1883055<\/code> \u0431\u0430\u0439\u0442, \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u043b\u043e\u0432\u0430 <code>'\\0'<\/code>.<\/p>\n<\/div>\n<\/details>\n<h3>\u041c\u0435\u0442\u043e\u0434\u0438\u043a\u0430 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439<\/h3>\n<p>\u0417\u0434\u0435\u0441\u044c \u0441\u0442\u043e\u0438\u0442 \u0441\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0443 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0412\u0430\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0440\u0435\u0434\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439.<\/p>\n<p>\u0414\u0436\u0438\u0442\u0442\u0435\u0440 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u0435\u043d, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u0435\u0441\u0442\u0438 \u0435\u0433\u043e \u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0443. \u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u0434\u0436\u0438\u0442\u0442\u0435\u0440\u0430 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u041e\u0421, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u044f\u0434\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043a, \u0432\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<\/p>\n<pre><code class=\"bash\">sudo find \/sys\/devices\/system\/cpu -name scaling_governor \\     -exec sh -c 'echo performance >{}' ';' sudo sh -c 'echo off >\/sys\/devices\/system\/cpu\/smt\/control' sudo tuna --cpus=1-7 --isolate<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u044f\u0434\u0435\u0440 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0441\u043a\u0430\u0447\u0435\u0442 \u0438 \u0437\u0430\u043b\u043e\u0447\u0435\u043d\u0430 \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e (\u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e &#171;\u0434\u043b\u044f \u0432\u0441\u0435\u0445&#187;, \u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u044f\u0434\u0435\u0440 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u0435 \u043e\u0431\u044b\u0447\u043d\u043e). \u0411\u0435\u0437 \u044d\u0442\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u044f\u0434\u0440\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u0443\u0441\u0442\u044f \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u0423 \u043c\u0435\u043d\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u044f\u0434\u0435\u0440 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\"> $ grep MHz \/proc\/cpuinfo cpu MHz         : 3043.824 cpu MHz         : 3722.037 cpu MHz         : 3721.075 cpu MHz         : 3674.557 cpu MHz         : 3592.679 cpu MHz         : 3550.398 cpu MHz         : 3513.916 cpu MHz         : 3612.262 cpu MHz         : 3468.005 cpu MHz         : 3764.145 cpu MHz         : 3586.930 cpu MHz         : 3576.853 cpu MHz         : 3564.029 cpu MHz         : 3587.192 cpu MHz         : 3244.385 cpu MHz         : 2761.846<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 HyperThreading (\u044d\u0442\u043e \u0438\u043d\u0442\u0435\u043b\u043b\u043e\u0432\u0441\u043a\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 SMT). \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u044f\u0434\u0435\u0440 &#171;\u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442&#187; (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437 \u0432\u044b\u0432\u043e\u0434\u0430 <code>htop<\/code>) \u2014 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u044f\u0434\u0440\u0430 \u0441 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 0-7. \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-334028","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/334028","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=334028"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/334028\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=334028"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=334028"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=334028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}