{"id":21325645,"url":"https://github.com/andreysolovyev381/avito_screening","last_synced_at":"2025-03-15T23:43:31.691Z","repository":{"id":191468227,"uuid":"684664192","full_name":"andreysolovyev381/avito_screening","owner":"andreysolovyev381","description":"A screening task from Avito. See readme.md (in Russian) for the details.","archived":false,"fork":false,"pushed_at":"2023-08-30T17:24:30.000Z","size":55,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-22T12:29:57.981Z","etag":null,"topics":["avito","avito-parser","cpp","cpp20","sharding"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andreysolovyev381.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-08-29T15:49:29.000Z","updated_at":"2023-12-03T17:18:21.000Z","dependencies_parsed_at":"2025-01-22T12:28:44.308Z","dependency_job_id":"55379955-0c07-4c00-9cfd-ccad34fb6922","html_url":"https://github.com/andreysolovyev381/avito_screening","commit_stats":null,"previous_names":["andreysolovyev1976/avito_screening","andreysolovyev381/avito_screening"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreysolovyev381%2Favito_screening","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreysolovyev381%2Favito_screening/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreysolovyev381%2Favito_screening/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreysolovyev381%2Favito_screening/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andreysolovyev381","download_url":"https://codeload.github.com/andreysolovyev381/avito_screening/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243806040,"owners_count":20350775,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["avito","avito-parser","cpp","cpp20","sharding"],"created_at":"2024-11-21T21:06:51.566Z","updated_at":"2025-03-15T23:43:31.661Z","avatar_url":"https://github.com/andreysolovyev381.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"### Резюме \nПривет! \n\nВо-первых, я поздравляю команду Авито с супер-заданием. Вам удалось найти объем работ и сформулировать требования к нему так, что про конкретного разработчика становится видно все. На ум приходит байка про Петра I - \"...чтобы дурь каждого видна была\".\n\nВо-вторых, вы наверное знаете, что ваша задача является публичной, вот [статья на Хабре](https://habr.com/en/articles/575108/ \"статья на Хабре\"), поэтому замечательный файл \"pg\" весом более 300 Mb выступил главным объектом тестирования.\n\nВ-третьих, мои результаты плачевные, несмотря на то, что я \"упоролся\" с вашей задачей. А именно: \n1) мое однопоточное решение близко не дотягивает до секунды на обработку файла \"pg\";\n2) я не могу предложить многопоточное решение, которое было бы более эффективным, чем однопоточное;\n3) поскольку я нашел себя в таком затруднительном положении, я обратился к старшим товарищам, а именно к Илье Шишкову, который очень любезно выделил время посмотреть на мои идеи. Илья предложил еще одну ветку по подсчету, которая работает быстрее однопоточного решения.\n\n### Детали\n#### Сборка-Запуск\n1) С++20;\n2) Можно запустить сразу тесты, в этот репо вложен один тестовый файл, выполняющий end to end тестирование, где в качестве входного файла используется \"pg\" - см следующий пункт;\n3) Замечательный файл \"pg\" не заливается на гитхаб ввиду своего веса, его нужно руками положить в test_data/inputs каталог проекта чтобы запускать код через тесты. Коллега, который опубликовал вышеупомянутую статью, также выложил [ссылку на этот файл](https://disk.yandex.ru/d/mOY5CrveIAOtnQ), по которой его можно скачать;\n4) Нужно выбрать define-ы в файле code_branch_selector.h, без явного указания опции код работать не будет, по умолчанию выбрано однопоточное решение (ST):\n   * ST //однопоточное решение, бор на массиве;\n   * MT_CONCURRENT_MAP //многопоточное решение на concurrent map;\n   * MT_TRIE //многопоточное решение на боре, если выбрана эта опция, то обязательно указать одну из двух последующих;\n     * TRIE_ON_VECTOR //шардированный многопоточный бор на массивах;\n     * TRIE_ON_ARENA //шардированный многопоточный бор, аллоцируемый на арене;\n   * MT_SHISHKOV //многопоточная сортировка подсчетом, вариант решения, предложенный Ильей Шишковым.\n\n#### Комментарии по идеям реализации\n* Однопоточное решение - бор на массиве (app/data_structures/trie.hpp). Своя имплементации хеш-таблицы с открытой адресацией (app/data_structures/hash_table.hpp) проиграла замер;\n* Многопоточное решение на конкурентной мапе - тривиально, app/multi_threading/ts_map.hpp;\n* Многопоточное решение с использованием шардированного бора - идея состоит в том, чтобы шардировать бор по первому уровню переходов из корня. Каждый шард получает свой обработчик из пары очередь-выделенный поток, чтобы исключить гонку. Шардируем простой хеш-таблицей с идеальной хеш-функцией (app/data_structures/sharded_trie.hpp). Многопоточная очередь, обертка задачи в очередь - немного доработанный публичный код К.Владимирова. Это решение имеет две опции для шарда - вектор (app/data_structures/trie_vec.hpp) и арена (app/data_structures/trie_mem.hpp). Не могу не повториться - вся эта красота у меня не полетела, как говорят умные люди: \"Усложнять - просто, попробуй упрости\". **Работает за \u003e300 секунд на \"pg\"**; \n* Многопоточное решение с сортировкой подсчетом (идея И.Шишкова) - для каждого блока буфера сразу посчитаем частотность слов после приведения к алфавиту из условия. Слить полученные результаты.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreysolovyev381%2Favito_screening","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandreysolovyev381%2Favito_screening","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreysolovyev381%2Favito_screening/lists"}