<!DOCTYPE html>
<html class="h-100" data-bs-theme="light" data-mantine-color-scheme="light" lang="ru" prefix="og: https://ogp.me/ns#">
<head>
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<link crossorigin="true" href="https://cdn.hexlet.io" rel="preconnect">
<link href="https://mc.yandex.ru" rel="preconnect">
<meta content="aa2vrdtq64dub8knuf83lwywit311w" name="facebook-domain-verification">
<link href="/favicon.ico" rel="icon" sizes="any">
<link href="/favicon.svg" rel="icon" type="image/svg+xml">
<link href="/apple-touch-icon.png" rel="apple-touch-icon">
<link href="/manifest.webmanifest" rel="manifest">
<script>
//<![CDATA[
window.gon={};gon.ym_counter="25559621";gon.is_bot=true;gon.applications={};gon.current_user={"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26 19:04:08 UTC","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false};gon.token="L3M6TKXKiayflc8LZPS6-dbHxtlQtxgwFG69YIISLyPAovF7V7QkzCnW65No-0qOFs7rc1iA5pKpjic00BXITQ";gon.locale="ru";gon.language="ru";gon.theme="light";gon.rails_env="production";gon.mobile=false;gon.google={"analytics_key":"UA-1360700-51","optimize_key":"GTM-5QDVFPF"};gon.captcha={"google_v3_site_key":"6LenGbgZAAAAAM7HbrDbn5JlizCSzPcS767c9vaY","yandex_site_key":"ysc1_Vyob5ZPPUdPBsu0ykt8bVFdzsfpoVjQChLGl2b4g19647a89","verification_failed":null};gon.social_signin=false;gon.typoreporter_google_form_id="1FAIpQLSeibfGq-KvWQ2Fyru-zkFFRVTLBuzXAHAoEyN1p49FtDmNoNA";
//]]>
</script>
<meta charset="utf-8">
<title>Оценка Big O | PHP: Массивы</title>
<meta name="description" content="Оценка Big O / PHP: Массивы: Знакомимся с оценкой сложности алгоритмов">
<link rel="canonical" href="https://ru.hexlet.io/courses/php-arrays/lessons/big-o/theory_unit">
<meta name="robots" content="noarchive">
<meta property="og:title" content="Оценка Big O">
<meta property="og:title" content="PHP: Массивы">
<meta property="og:description" content="Оценка Big O / PHP: Массивы: Знакомимся с оценкой сложности алгоритмов">
<meta property="og:url" content="https://ru.hexlet.io/courses/php-arrays/lessons/big-o/theory_unit">
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="RkmOawzibnTo0y4DJhXtKIpYfD6Niw1l1tvBHBWqzHepmEVc_pzDFF6QCpsqGh1fSlFRlIW888drO1tIR60rGQ" />
<script src="/vite/assets/inertia-DfXos102.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/preload-helper-BJ4cLWpC.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ahoy-DrlRQ-1D.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/analytics-cb8xch9l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Surface-DL2bpZA-.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/extends-C-EagtpE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/inheritsLoose-BBd-DCVI.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/objectWithoutPropertiesLoose-DRHXDhjp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/index.esm-DAqKOkZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Button-CGPUux8l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/CloseButton-D1euiPao.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Group-BX48WcuU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Loader-BQEY8g6v.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Modal-Cy3HByv7.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/OptionalPortal-1Hza5P2w.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Stack-CtjJzfw4.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Textarea-Ck64llAy.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/DirectionProvider-Dc9zdUke.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/events-DJQOhap0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-reduced-motion-D2owz4wa.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-disclosure-zKtK5W1r.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-hotkeys-Cnc_Rwkb.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/random-id-DOQyszCZ.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/exports-C_MrNx_T.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<link rel="stylesheet" href="/vite/assets/application-BqhCP46M.js" />
<script src="/vite/assets/application-Df9RExpe.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/autocomplete-VMNbxKGl.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/createPopper-C3aM9r1M.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/js.cookie-D1-O8zkX.js" as="script" crossorigin="anonymous"><link rel="stylesheet" href="/vite/assets/application-C8HjmMaq.css" media="screen" />
<script>
window.ym = function(){(ym.a=ym.a||[]).push(arguments)};
window.addEventListener('load', function() {
setTimeout(function() {
ym.l = 1*new Date();
ym(window.gon.ym_counter, "init", {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true
});
// Загружаем скрипт
var k = document.createElement('script');
k.async = 1;
k.src = 'https://mc.yandex.ru/metrika/tag.js';
document.head.appendChild(k);
ym(window.gon.ym_counter, 'getClientID', function(clientID) {
window.ymClientId = clientID;
});
}, 1500);
});
</script>
<!-- Google Tag Manager - deferred -->
<script>
// dataLayer stub сразу — пуши работают до загрузки скрипта
window.dataLayer = window.dataLayer || [];
// Сам скрипт — отложенно после load
window.addEventListener('load', function() {
setTimeout(function() {
dataLayer.push({'gtm.start': new Date().getTime(), event: 'gtm.js'});
var j = document.createElement('script');
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=GTM-WK88TH';
document.head.appendChild(j);
}, 1500);
});
</script>
<!-- End Google Tag Manager -->
</head>
<body>
<noscript>
<div>
<img alt="" src="https://mc.yandex.ru/watch/25559621" style="position:absolute; left:-9999px;">
</div>
</noscript>
<header class="sticky-top bg-body">
<nav class="navbar navbar-expand-lg">
<div class="container-xxl">
<a class="navbar-brand" href="/"><img alt="Логотип Хекслета" height="24" src="https://ru.hexlet.io/vite/assets/logo_ru_light-BpiEA1LT.svg" width="96">
</a><button aria-controls="collapsable" aria-expanded="false" aria-label="Меню" class="navbar-toggler border-0 mb-0 mt-1" data-bs-target="#collapsable" data-bs-toggle="collapse">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsable">
<ul class="navbar-nav mb-lg-0 mt-lg-1">
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
Все курсы
<span class="bi bi-chevron-down align-middle ms-1"></span>
</button>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item d-flex py-2" href="/courses"><div class="fw-bold me-auto">Все что есть</div>
<div class="text-muted">117</div>
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные категории</b>
</li>
<li>
<a class="dropdown-item py-2" href="/courses_devops">Курсы по DevOps
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_data_analytics">Курсы по аналитике данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_programming">Курсы по программированию
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_testing">Курсы по тестированию
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные курсы</b>
</li>
<li>
<a class="dropdown-item py-2" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/go">Go-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/java">Java-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/python">Python-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/qa-auto-engineer-java">Автоматизатор тестирования на Java
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/data-analytics">Аналитик данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/frontend">Фронтенд-разработчик
</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
О Хекслете
<span class="bi bi-chevron-down align-middle"></span>
</button>
<ul class="dropdown-menu bg-body">
<li>
<a class="dropdown-item py-2" href="/pages/about">О нас
</a></li>
<li>
<a class="dropdown-item py-2" href="/blog">Блог
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/hse-research" role="button">Результаты (Исследование)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://career.hexlet.io" role="button">Хекслет Карьера
</span></li>
<li>
<a class="dropdown-item py-2" href="/testimonials">Отзывы студентов
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://t.me/hexlet_help_bot" role="button">Поддержка (В ТГ)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/referal-program/?promo_creative=priglasite-druzei&promo_name=referal-program&promo_position=promo_position&promo_start=010724&promo_type=link" role="button">Реферальная программа
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/certificate" role="button">Подарочные сертификаты
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://hh.ru/employer/4307094" role="button">Вакансии
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://b2b.hexlet.io" data-target="_blank" role="button">Компаниям
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexly.ru/" data-target="_blank" role="button">Колледж
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexlyschool.ru/" data-target="_blank" role="button">Частная школа
</span></li>
</ul>
</li>
<li><a class="nav-link" href="/subscription/new">Подписка</a></li>
</ul>
<ul class="navbar-nav flex-lg-row align-items-lg-center gap-2 ms-auto">
<li>
<a class="nav-link" aria-label="Переключить тему" href="/theme/switch?new_theme=dark"><span aria-hidden="true" class="bi bi-moon"></span>
</a></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="/u/new" role="button"><span>Регистрация</span>
</span></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="https://ru.hexlet.io/session/new" role="button"><span>Вход</span>
</span></li>
</ul>
</div>
</div>
</nav>
</header>
<div class="x-container-xxxl">
</div>
<main class="mb-6 min-vh-100 h-100">
<link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzk5MiwicHVyIjoiYmxvYl9pZCJ9fQ==--e9d0f30948ea766a7e6bc3e3d56c192344d45fb8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programming-cuate%20(1).png"/><link rel="preload" as="image" href="/vite/assets/development-BVihs_d5.png"/><div id="app" data-page="{"component":"web/courses/lessons/theory_unit","props":{"errors":{},"locale":"ru","language":"ru","httpsHost":"https://ru.hexlet.io","host":"ru.hexlet.io","colorScheme":"light","auth":{"user":{"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26T19:04:08.317Z","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false}},"cloudflareTurnstileSiteKey":"0x4AAAAAAA15KmeFXzd2H0Xo","vkIdClientId":"51586979","yandexIdClientId":"88d071f1d3384eb4bd1deb37910235c7","formAuthToken":"xHKOsof42SW3P2A4mjn5r9ciJUThbN4SOhvJOKmyzZ4ro0WFdYZ0RQF8RKCWNgnYFysI7ulbILCH-1Ns-7Uq8A","topics":[{"id":44079,"title":"Здравствуйте.\nПосмотрите пожалуйста мое ревью: https://ru.hexlet.io/code_reviews/278714\nМой код, по сравнению с вашим, немного \"пахнет\" и плохо читается ?","plain_title":"Здравствуйте. Посмотрите пожалуйста мое ревью: https://ru.hexlet.io/code_reviews/278714 Мой код, по сравнению с вашим, немного \"пахнет\" и плохо читается ? ","creator":{"public_name":"Артем","id":168956,"is_tutor":false},"comments":[{"creator":{"public_name":"Maksim Litvinov","id":198906,"is_tutor":true},"id":95431,"body":"Привет. Не вижу принципиальной разницы. Ваш код практически идентичен учительскому","topic_id":44079}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Оценка Big O","entity_url":null,"active":true}},{"id":39806,"title":"Всем привет, подскажите в каком направлении думать?что-то не доходит\nhttps://ru.hexlet.io/code_reviews/233912","plain_title":"Всем привет, подскажите в каком направлении думать?что-то не доходит https://ru.hexlet.io/code_reviews/233912 ","creator":{"public_name":"Anar","id":233072,"is_tutor":false},"comments":[{"creator":{"public_name":"Roman Kozlov","id":231814,"is_tutor":false},"id":87196,"body":"Анар, приветствую! \nТесты ожидают, что функция `getIntersectionOfSortedArray` будет возвращать значение (возврат выполняется через оператор `return`). В директории **tests** есть файл **ArraysTest.php**, изучите его внимательно. \nПодумайте также, как правильно сформировать условие для остановки цикла (как его ещё нужно дополнить).","topic_id":39806},{"creator":{"public_name":"Roman Kozlov","id":231814,"is_tutor":false},"id":87399,"body":"Сейчас вы обращаетесь к элементу, которого не существует в одном из исходных массивов. Используйте [отладочную печать](https://ru.hexlet.io/courses/php-basics/lessons/debug/theory_unit), чтобы отследить этот момент. \nВнимательно изучите файл с тестами **ArraysTest.php**, он находится в директории **tests**. \nПодумайте вот о чём. Каким должно быть условие выхода из цикла, чтобы программа отрабатывала корректно (не было обращения к элементам, которых не существует в исходных массивах)? \nХорошим решением будет использовать цикл `while` в этой задаче :)\n ","topic_id":39806},{"creator":{"public_name":"Anar","id":233072,"is_tutor":false},"id":88160,"body":"**Roman Kozlov**, понял)спасибо, заглючило","topic_id":39806},{"creator":{"public_name":"Roman Kozlov","id":231814,"is_tutor":false},"id":88141,"body":"Функция `getIntersectionOfSortedArray` принимает на вход два массива по условию задачи (про константы речь не заводится). \nСейчас ваше решение проходит тесты. Попробуйте сделать сброс упражнения и запустить тесты заново :) ","topic_id":39806},{"creator":{"public_name":"Roman Kozlov","id":231814,"is_tutor":false},"id":87287,"body":"Посмотрите внимательно алгоритм в описании задачи. Достаточно будет использовать всего 3 условия. Подумайте какие из условий необходимо убрать :)","topic_id":39806},{"creator":{"public_name":"Anar","id":233072,"is_tutor":false},"id":87211,"body":"**Roman Kozlov**, добавил доп условие ограничения переменной $z\nhttps://ru.hexlet.io/code_reviews/233912\n,где-то, что-то не замечаю","topic_id":39806},{"creator":{"public_name":"Anar","id":233072,"is_tutor":false},"id":88065,"body":"**Roman Kozlov**, добрый день, не могу понять как проверить константу\nhttps://ru.hexlet.io/code_reviews/233912\n$actual5 = getIntersectionOfSortedArray(C);\n$this->assertEquals([10, 24], $actual5);\n\nто есть если аргументом функции будет константа, вывести [20], [24] ?\nчет я заблудился","topic_id":39806},{"creator":{"public_name":"Anar","id":233072,"is_tutor":false},"id":87298,"body":"**Roman Kozlov**, https://ru.hexlet.io/code_reviews/233912\nспасибо за наводку), только не понимаю, где у меня появляется неопределенная константа(","topic_id":39806}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Оценка Big O","entity_url":null,"active":true}},{"id":26947,"title":"Добрый день! Не первый день бьюсь с кодом но все равно выдает ошибку проверки\n1) App\\Tests\\ArraysTest::testGetIntersectionOfSortedArrays\nUndefined offset: 3\n\n/usr/src/app/src/Arrays.php:21\n/usr/src/app/tests/ArraysTest.php:21\n\nПодскажите в какую сторону копать.\n\n`// removed`","plain_title":"Добрый день! Не первый день бьюсь с кодом но все равно выдает ошибку проверки 1) App\\Tests\\ArraysTest::testGetIntersectionOfSortedArrays Undefined offset: 3 /usr/src/app/src/Arrays.php:21 /usr/src/app/tests/ArraysTest.php:21 Подскажите в какую сторону копать. // removed ","creator":{"public_name":"","id":48760,"is_tutor":false},"comments":[{"creator":{"public_name":"","id":48760,"is_tutor":false},"id":57775,"body":"это я понял. не могу понять где вызывает лишнее значение, если условия цикла стоят while ($i < sizeof($arr1) && $j < sizeof($arr2))","topic_id":26947},{"creator":{"public_name":"Константин Кузьмин","id":177503,"is_tutor":false},"id":57732,"body":"Добрый день, что будет, если у индексированного массива, размером 5, попросить 10е значение?","topic_id":26947},{"creator":{"public_name":"Александр О.","id":61806,"is_tutor":false},"id":58032,"body":"> решил по своему и потом отправив на ревью, удивился как оказывается все было просто.\n\nОтлично! :)","topic_id":26947},{"creator":{"public_name":"","id":48760,"is_tutor":false},"id":57796,"body":"Это ясно. Не могу понять почему это происходит, если условия выполнения цикла прописаны.","topic_id":26947},{"creator":{"public_name":"","id":48760,"is_tutor":false},"id":57931,"body":"всем спасибо. решил по своему и потом отправив на ревью, удивился как оказывается все было просто.","topic_id":26947},{"creator":{"public_name":"Александр О.","id":61806,"is_tutor":false},"id":57843,"body":"> Возможно вам стоит взять листочек бумаги, и пробежать по циклу ручками, чтобы понять.\n\nПоддерживаю совет Константина :) Ведь здесь нет никакой магии, вы можете буквально вручную воспроизвести поведение цикла, отследив состояние используемых переменных и ход выполнения процесса.","topic_id":26947},{"creator":{"public_name":"Константин Кузьмин","id":177503,"is_tutor":false},"id":57785,"body":"В 21 строке, j уже равно 3, а максимальный индекс массива arr2 равно 2 при этом тесте usr/src/app/tests/ArraysTest.php:21","topic_id":26947},{"creator":{"public_name":"Константин Кузьмин","id":177503,"is_tutor":false},"id":57823,"body":"Возможно вам стоит взять листочек бумаги, и пробежать по циклу ручками, чтобы понять.\nЗначение переменной $j увеличивается внутри цикла тут\n\n`// removed`\n\nи дальше проверяется в этом условии еще до выхода из цикла\n\n`// removed`","topic_id":26947}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Оценка Big O","entity_url":null,"active":true}},{"id":42146,"title":"Добрый день!\nСравниваю решение учителя со своим и пытаюсь понять, у какого решения какие плюсы и минусы. Понять не получается. Подскажите, пожалуйста, стоит ли на что-то внимание обратить?\n\nhttps://ru.hexlet.io/code_reviews/259774","plain_title":"Добрый день! Сравниваю решение учителя со своим и пытаюсь понять, у какого решения какие плюсы и минусы. Понять не получается. Подскажите, пожалуйста, стоит ли на что-то внимание обратить? https://ru.hexlet.io/code_reviews/259774 ","creator":{"public_name":"Андрей Спасский","id":271396,"is_tutor":false},"comments":[{"creator":{"public_name":"Stanislav Dzisiak","id":212236,"is_tutor":true},"id":91864,"body":"Приветствую, Андрей!\n\nКак отметил Николай, в решении учителя проходов будет меньше. Но надо отметить, что зачастую ценой оптимизации является усложнение самой логики кода и как следствие ухудшение его понимания. Об этом кстати, рассказывается в уроке. И данное упражнение как раз демонстрирует такую ситуацию.","topic_id":42146},{"creator":{"public_name":"Nikolai Gagarinov","id":104929,"is_tutor":true},"id":91750,"body":"Привет, ну в теории в решении учителя количество проходов по коллекции будет меньше. Попробуйте увеличить в 100000 раз массивы и сравнить скорость. (но я могу ошибаться)","topic_id":42146}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Оценка Big O","entity_url":null,"active":true}},{"id":48155,"title":"Ребята вот [ссылка ](https://ru.hexlet.io/code_reviews/324483)но моё ревью!\nПрошу задать вектор, куда двигаться.\nЯ папку с тестами изучил.\nВ ручном режиме по коду прошел.\nКак по мне все верно и должно работать!\nНо во время выполнения скалдывается ощущение что я нахожусь в бесконечном цикле.\nИ никаких ошибок не получаю кроме ```make: *** [Makefile:2: test] Terminated```","plain_title":"Ребята вот ссылка (https://ru.hexlet.io/code_reviews/324483)но моё ревью! Прошу задать вектор, куда двигаться. Я папку с тестами изучил. В ручном режиме по коду прошел. Как по мне все верно и должно работать! Но во время выполнения скалдывается ощущение что я нахожусь в бесконечном цикле. И никаких ошибок не получаю кроме make: *** [Makefile:2: test] Terminated ","creator":{"public_name":"Юрий Бачевский","id":63379,"is_tutor":false},"comments":[{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":103542,"body":"Приветствую, Юрий!\n\nВижу вы справились с задачей. Отлично! Если вам помог ответ Максима, то можно нажать на кнопку \"Отметить как решение\" и таким образом поблагодарить его за помощь. Кроме того, это помогает другим студентам в поисках ответов на похожие вопросы.","topic_id":48155},{"creator":{"public_name":"Юрий Бачевский","id":63379,"is_tutor":false},"id":103554,"body":"**Роман Ашиков**, списибо что напомнили.\nЯ тоже думал об этом, что после решения надо будет отметить сообщение Максима, но увлекса и забыл.","topic_id":48155},{"creator":{"public_name":"Maksim Litvinov","id":198906,"is_tutor":true},"id":103507,"body":"Добрый день. Так и есть, возникает бесконечный цикл. Попробуйте отказаться от вложенных циклов, они здесь не нужны. Суть задания как раз в этом и есть-избежать вложенных циклов и тем самым уменьшить сложность алгоритма. А два условия можно объединить логическим оператором","topic_id":48155}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Оценка Big O","entity_url":null,"active":true}},{"id":49643,"title":"Здравствуйте. Задание решено, тесты не падают. Но как мне кажется, моё решение не совпадает с заданием. Тем не менее тесты не падают. Что я упускаю? [Код-ревью тут.](https://ru.hexlet.io/code_reviews/342892)\n\nТак же не до конца понял как проводится оценка сложности алгоритма, буду благодарен за объяснение. Спасибо!","plain_title":"Здравствуйте. Задание решено, тесты не падают. Но как мне кажется, моё решение не совпадает с заданием. Тем не менее тесты не падают. Что я упускаю? Код-ревью тут. (https://ru.hexlet.io/code_reviews/342892) Так же не до конца понял как проводится оценка сложности алгоритма, буду благодарен за объяснение. Спасибо! ","creator":{"public_name":"Dmytro","id":210979,"is_tutor":false},"comments":[{"creator":{"public_name":"Nikolai Gagarinov","id":104929,"is_tutor":true},"id":106507,"body":"Добрый день.\n\nВ вашем решении вложенные циклы и используется do/while, который сложен для восприятия.\nПроанализируйте решение учителя, запустите локально, проверив как оно работает.\nБазовое понимание по сложности алгоритмов можно получить в книге \"Грокаем алгоритмы\" (есть в списке рекомендуемых книг Хекслета) и в курсе https://ru.hexlet.io/courses/php-algorithms правда он в песочнице.","topic_id":49643}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Оценка Big O","entity_url":null,"active":true}},{"id":46488,"title":"Помогите пожалуйста разобраться, - [Ревью](https://ru.hexlet.io/code_reviews/304715)\nРепл и Шторм выдают все нужные результаты, все кейсы проходят но не на хекслете, и ошибка в том, что я как будто выхожу за границу массив, причем не понятно как.\n```\nUndefined offset: 3\n\n/usr/src/app/src/Arrays.php:21\n/usr/src/app/tests/ArraysTest.php:22\n```\nна 22 строке - _$actual4 = getIntersectionOfSortedArray([10, 11, 24], [-2, 3, 4]);_\n\nна 21 - _} elseif ($curr > $arr2[$indexForSecondArray]) {_\n\nто есть, если взятое число из первого массива больше чем из второго, то увеличиваем индекс числа второго массива. А если предел массива... - возможно нужна еще проверка на концы массивов типа array_key_exists?","plain_title":"Помогите пожалуйста разобраться, - Ревью (https://ru.hexlet.io/code_reviews/304715) Репл и Шторм выдают все нужные результаты, все кейсы проходят, но ошибка в том, что я как будто выходу за границу массив, причем не понятно как. ``` Undefined offset: 3 /usr/src/app/src/Arrays.php:21 /usr/src/app/tests/ArraysTest.php:22 ``` на 22 строке - $actual4 = getIntersectionOfSortedArray([10, 11, 24], [-2, 3, 4]); на 21 - } elseif ($curr > $arr2[$indexForSecondArray]) { то есть, если взятое число из первого массива больше чем из второго, то увеличиваем индекс числа второго массива. А если предел массива - возможно нужна еще проверка на концы массивов типа arraykeyexists? ","creator":{"public_name":"Alexander Karakin","id":98341,"is_tutor":false},"comments":[{"creator":{"public_name":"Maksim Litvinov","id":198906,"is_tutor":true},"id":100290,"body":"Добрый день. Нужен ли вам здесь третий счётчик i? В условии цикла вы проверяете его, что он меньше длинны массива. А тем временем счетчик второго массива выходит за границу второго массива.\n\nВыход за границу массива в php вызывает ошибку notice, которая не рассматривается интерпретатором, как серьезная ошибка. Поэтому код в других средах работает. Но среда на Хекслете настроена так, что notice рассматривается как ошибка и вызывает исключение","topic_id":46488},{"creator":{"public_name":"Alexander Karakin","id":98341,"is_tutor":false},"id":100310,"body":"Действительно, ставил отладочную печать и каждый элемент с первого массива сравнивался с каждым из второго, если в массиве много данных то это совсем не оптимально получиться. Попробую разобрать учителя пример.\n\nПодскажите, перечитал циклы и не понял - а в чем разница while и if? с do-while еще хотя бы понятно, там гарантированно выполняется одна итерация и только в конце проверяется условие.","topic_id":46488},{"creator":{"public_name":"Maksim Litvinov","id":198906,"is_tutor":true},"id":100313,"body":"Если условие истинно, действия в if выполнятся только один раз. В цикле while действия будут выполняться, пока условие истинно. Условие будет проверяться каждый раз перед новым заходом. Если оно истинно, выполняется очередной заход. Как только оно станет ложным, цикл прерывается.\n\nhttps://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/while","topic_id":46488},{"creator":{"public_name":"Maksim Litvinov","id":198906,"is_tutor":true},"id":100309,"body":"Все работает, но у вас получились вложенные циклы, а значит квадратичная сложность. Теперь вам доступно решение учителя. Попробуйте разобрать его, понять, как оно работает. Реализуйте его по памяти, чтобы закрепить материал","topic_id":46488},{"creator":{"public_name":"Alexander Karakin","id":98341,"is_tutor":false},"id":100308,"body":"[Ревью](https://ru.hexlet.io/code_reviews/304715) - вот так решил, скажите, насколько сильно суть отличается?\nНе подумал что можно было бы использовать другой цикл","topic_id":46488},{"creator":{"public_name":"Alexander Karakin","id":98341,"is_tutor":false},"id":100385,"body":"**Роман Ашиков**, \nДа, спасибо вам большое, просто что то уже тормозить в тот момент начинал и пришел в недоумение =)\n\n","topic_id":46488},{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":100348,"body":"Приветствую, Александр!\n\nПомог ли вам ответ Максима разобраться? Он ответил правильно о том, что действия внутри `if` выполнится только один раз, а в цикле мы можем повторять действия столько раз сколько нужно.","topic_id":46488}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Оценка Big O","entity_url":null,"active":true}},{"id":39198,"title":"Вот как то странно выходит, моя идея совпала с реализацией учителя, но в итоге у меня вышел какой то монстр, в отличае от кода учителя. [Ревью](https://ru.hexlet.io/code_reviews/226240). \n\nНо у меня код без доп проверок и условий работать в некоторых тестах отказывался =( ","plain_title":"Вот как то странно выходит, моя идея совпала с реализацией учителя, но в итоге у меня вышел какой то монстр, в отличае от кода учителя. Ревью (https://ru.hexlet.io/code_reviews/226240). Но у меня код без доп проверок и условий работать в некоторых тестах отказывался =( ","creator":{"public_name":"Vitalii Bairak","id":182989,"is_tutor":false},"comments":[{"creator":{"public_name":"Roman Kozlov","id":231814,"is_tutor":false},"id":85840,"body":"Виталий, приветствую! \nВам удалось справиться с задачей, это уже хорошо! \nТеперь внимательно проанализируйте решение учителя и попробуйте внести правки в свой код. Ещё хороший вариант — вернуться к задаче позже и попробовать её решить уже по памяти, тогда материал точно закрепится :)\n","topic_id":39198}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Оценка Big O","entity_url":null,"active":true}},{"id":18567,"title":"Добрый вечер!\nподскажите, по условию даются два сортированных массива и тогда выдавать совпадения, а если на входе будут не сортированные массивы, код должен работать? ","plain_title":"Добрый вечер! подскажите, по условию даются два сортированных массива и тогда выдавать совпадения, а если на входе будут не сортированные массивы, код должен работать? ","creator":{"public_name":"Sergali Bakeer","id":164450,"is_tutor":false},"comments":[{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":39174,"body":"> код должен работать?\n\nЕсли бы это было возможно, то зачем ставить условие сортировонности? ;)\n\n```\nnull does not match expected type \"array\".\n\n/usr/src/app/tests/ArraysTest.php:22\n```\n\nКак вы понимаете сообщение об ошибке? Вы смотрели на 22 строчку теста?","topic_id":18567},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":39201,"body":"> или я что то не правильно понимаю? .\n\nА вы уверены что именно в том тесте доходит до этого return? Вы пробовали убедиться в этом через отладочную печать? И распечатывали сам $result?\n\n> ноль\n\nВсе же нул (null), такое часто бывает когда внутри не было return.\n\n","topic_id":18567},{"creator":{"public_name":"Sergali Bakeer","id":164450,"is_tutor":false},"id":39200,"body":"понимаю ошибку как: ноль не соответствует ожидаемому типу \"Массив\".\nу меня на 21/22 строчке идет: \n`return $result;`\n\nи в выводе идет массив:\n\n```\nArray\n(\n [0] => 10\n [1] => 24\n)\n```\nили я что то не правильно понимаю? ...","topic_id":18567},{"creator":{"public_name":"Sergali Bakeer","id":164450,"is_tutor":false},"id":39165,"body":"пожалуйста, наведите меня на путь ...\nошибка:\n\n```\nThere was 1 failure:\n\n1) App\\Tests\\ArraysTest::testGetIntersectionOfSortedArrays\nnull does not match expected type \"array\".\n\n/usr/src/app/tests/ArraysTest.php:22\n```\n\n\n\n\nмой код:\n\n`// removed`\n\n\n\nможет я не туда иду совсем?\n","topic_id":18567},{"creator":{"public_name":"Sergali Bakeer","id":164450,"is_tutor":false},"id":39260,"body":"представляете???\nя посмотрел код еще раз, оказывается я вызываю функцию внутри функции ... убрал одно слово и все заработало :(\nя тупой","topic_id":18567}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Оценка Big O","entity_url":null,"active":true}},{"id":51503,"title":"Здравствуйте, подскажите как работает elseif. В решении учителя оно было использовано, мне не понятно почему в решении учителя не происходит выход за границы массива?У меня была такая ошибка пока не поставила ограничивающее условие $i2<count($mass2)&&$i1<count($mass1)&&$mass1[$i1]>$mass2[$i2]\nРевью кода [enter link description here](https://ru.hexlet.io/code_reviews/365963)","plain_title":"Здравствуйте, подскажите как работает elseif. В решении учителя оно было использовано, мне не понятно почему в решении учителя не происходит выход за границы массива?У меня была ошибка пока не поставила ограничивающее условие $i2$mass2[$i2] Ревью кода enter link description here (https://ru.hexlet.io/code_reviews/365963) ","creator":{"public_name":"","id":336640,"is_tutor":false},"comments":[{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":110121,"body":"Приветствую!\n\nНюанс с `elseif` заключается в том, что если выполняется этот блок, то остальные за ним не выполняются. Также, если выше сработало условие `if`, то `elseif` выполнен не будет. А вот если разбить условия на две независимых \"цепочки\" `if` как сделано в код ревью, то в случае когда сработает самый первый `if` и индексы будут увеличены, интерпретатор перейдёт к второму блоку `if ($mass1[$i1] > $mass2[$i2]) {` и вот тут то и возникнет ошибка `Undefined offset`.\n\nРекомендую вам внимательно разобрать примеры из статьи в документации — https://www.php.net/manual/ru/control-structures.elseif.php Можно по запускать код и поэкспериментировать на repl.it. Так вы сможете лучше понять как работают ветки условий.","topic_id":51503}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Оценка Big O","entity_url":null,"active":true}}],"lesson":{"exercise":{"id":690,"slug":"php_arrays_big_o_exercise","name":null,"state":"active","kind":"exercise","language":"php","locale":"ru","has_web_view":false,"has_test_view":false,"reviewable":true,"readme":"### src\\Arrays.php\n\nРеализуйте функцию `getIntersectionOfSortedArray`, которая принимает на вход два отсортированных массива и находит их пересечение:\n\n```php\n<?php\n\ngetIntersectionOfSortedArray([10, 11, 24], [10, 13, 14, 18, 24, 30]); // [10, 24]\n\ngetIntersectionOfSortedArray([10, 11, 24], [-2, 3, 4]); // []\n\ngetIntersectionOfSortedArray([], [2]); // []\n```\n\n### Алгоритм\n\nПоиск пересечения двух неотсортированных массивов — это операция, в рамках которой выполняется вложенный цикл с полной проверкой каждого элемента первого массива на вхождение во второй массив.\n\nСложность данного алгоритма равна `O(n * m)`, где `n` и `m` — размерности массивов. Если массивы отсортированы, то можно реализовать алгоритм со сложностью `O(n + m)`, что значительно лучше.\n\nСуть алгоритма довольно проста. В коде вводятся два указателя (индекса) на каждый из массивов. Начальное значение каждого указателя `0`. Затем идёт проверка элементов, находящихся под этими индексами в обоих массивах. Если они совпадают, то значение заносится в результирующий массив, а оба индекса инкриминируются. Если значение в первом массиве больше, чем во втором, то инкриминируется указатель второго массива, иначе — первого.\n","prepared_readme":"### src\\Arrays.php\n\nРеализуйте функцию `getIntersectionOfSortedArray`, которая принимает на вход два отсортированных массива и находит их пересечение:\n\n```php\n<?php\n\ngetIntersectionOfSortedArray([10, 11, 24], [10, 13, 14, 18, 24, 30]); // [10, 24]\n\ngetIntersectionOfSortedArray([10, 11, 24], [-2, 3, 4]); // []\n\ngetIntersectionOfSortedArray([], [2]); // []\n```\n\n### Алгоритм\n\nПоиск пересечения двух неотсортированных массивов — это операция, в рамках которой выполняется вложенный цикл с полной проверкой каждого элемента первого массива на вхождение во второй массив.\n\nСложность данного алгоритма равна `O(n * m)`, где `n` и `m` — размерности массивов. Если массивы отсортированы, то можно реализовать алгоритм со сложностью `O(n + m)`, что значительно лучше.\n\nСуть алгоритма довольно проста. В коде вводятся два указателя (индекса) на каждый из массивов. Начальное значение каждого указателя `0`. Затем идёт проверка элементов, находящихся под этими индексами в обоих массивах. Если они совпадают, то значение заносится в результирующий массив, а оба индекса инкриминируются. Если значение в первом массиве больше, чем во втором, то инкриминируется указатель второго массива, иначе — первого.\n","has_solution":true,"entity_name":"Оценка Big O"},"units":[{"id":2176,"name":"theory","url":"/courses/php-arrays/lessons/big-o/theory_unit"},{"id":4065,"name":"quiz","url":"/courses/php-arrays/lessons/big-o/quiz_unit"},{"id":2189,"name":"exercise","url":"/courses/php-arrays/lessons/big-o/exercise_unit"}],"links":[{"id":424814,"name":"Big-O Cheat Sheet","url":"https://bigocheatsheet.com/"}],"ordered_units":[{"id":2176,"name":"theory","url":"/courses/php-arrays/lessons/big-o/theory_unit"},{"id":4065,"name":"quiz","url":"/courses/php-arrays/lessons/big-o/quiz_unit"},{"id":2189,"name":"exercise","url":"/courses/php-arrays/lessons/big-o/exercise_unit"}],"id":1060,"slug":"big-o","state":"approved","name":"Оценка Big O","course_order":800,"goal":"Знакомимся с оценкой сложности алгоритмов","self_study":null,"theory_video_provider":null,"theory_video_uid":null,"theory":"Когда мы говорим об алгоритмах, нельзя не упомянуть их **сложность**. Она обозначается как _Big O_ и указывает, насколько эффективен тот или иной алгоритм.\n\nКак вы помните, есть [много алгоритмов сортировок](https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8#%D0%9E%D0%B1%D0%B7%D0%BE%D1%80_%D0%BD%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5_%D0%BF%D0%BE%D0%BF%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%BE%D0%B2_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8). Они выполняют одну и ту же задачу, но при этом у них разная **сложность** — то есть количество выполняемых операций алгоритмом для достижения своей цели. Разные способы сортировки требуют очень разного количества проходов по массиву. Конкретное количество операций зависит от входных данных — например, для уже отсортированного массива количество операций будет минимальным (но они все равно будут, потому что алгоритм должен убедиться в том, что массив отсортирован).\n\n\n\n_Big O_ показывает, насколько увеличится количество операций при увеличении объема данных. Рассмотрим пару примеров:\n\n* Доступ к элементу массива по индексу. Сложность этой операции не зависит от размеров массива. Это постоянная сложность **O(1)**\n* Печати на экран всех элементов массива с помощью обычного перебора. В худшем случае количество выполняемых операций будет равно $n$ — количеству элементов. Это линейная сложность **O(n)**\n\nЧто такое «худший случай»? Количество операций будет разным даже при работе с массивами одного размера — все зависит от состояния начального массива.\n\nПроведем аналогию с кубиком Рубика. Чтобы его собрать, нужно провести какое-то количество действий. Их число зависит от положения, в котором находятся его грани перед сборкой. В некоторых случаях действий понадобится мало, в других — много. Худшим случаем называется ситуация, при которой нам понадобится максимальное количество действий.\n\nАлгоритмическая сложность всегда оценивается по худшему случаю для выбранного алгоритма.\n\nДля еще одного примера вспомним вложенные циклы и поиск пересечений в неотсортированных массивах.\n\nДля каждого элемента из одного массива мы проверяем каждый элемент другого массива. При этом мы используем либо цикл, либо функцию `in_array()` со сложностью O(n) — в худшем случае мы просмотрим весь массив.\n\nЕсли размеры обоих массивов одинаковы и равны n то поиск пересечений имеет квадратичную сложность **O(n\\^2**).\n\nОдни алгоритмы эффективные, другие — не очень. Скорость работы неэффективных алгоритмов заметно падает даже при небольшом количестве элементов. Эффективные алгоритмы работают быстрее, и при этом они нередко потребляют больше памяти или запускаются параллельно. Часто в программировании эффективность — это компромисс. Выигрывая в одном месте, мы проиграем где-то в другом.\n\n\n\nВо многом, _Big O_ — это теоретическая оценка, на практике все может быть по-другому. Реальное время выполнения зависит от множества факторов, в том числе архитектуры процессора, операционной системы, языка программирования и типа доступа к памяти.\n\nВопрос эффективности кода довольно опасен. Например, в университетах программирование обычно изучают, начиная с алгоритмов. Из-за этого студентам может казаться, что эффективность — это главное, ведь код должен работать быстро. Такой подход приносит больше вреда, чем пользы. Дело в том, что эффективный код всегда сложнее неэффективного. Этот сложный код больше подвержен ошибкам, его труднее писать и модифицировать.\n\nНа практике настоящая эффективность нужна только в редких случаях. Обычно тормозит не код, а запросы к базе данных, сеть или что-то другое. Если конкретный участок кода выполняется медленно, это не всегда критично. Вполне возможно, что этот код работает с небольшим объемом памяти, вызывается все один раз и ни на что не влияет. К реальному замедлению может приводить совершенно другой фрагмент кода, который вызывается тысячи раз.\n\n> _Программисты тратят очень много времени, беспокоясь о некритичных местах кода и пытаясь оптимизировать их. Это всегда негативно сказывается на последующей отладке и поддержке. Поспешная оптимизация — это корень всех зол. В 97% случаев код лучше вообще не оптимизировать — так мы сэкономим время и сможем сосредоточиться на важных 3%. — Дональд Кнут_\n\nПеред тем, как пытаться что-то оптимизировать, обязательно прочитайте [небольшую онлайн-книгу](http://optimization.guide/), которая хорошо объясняет суть всех оптимизаций.\n"},"lessonMember":null,"courseMember":null,"course":{"start_lesson":{"exercise":null,"units":[{"id":2175,"name":"theory","url":"/courses/php-arrays/lessons/about/theory_unit"}],"links":[{"id":424785,"name":"Массивы","url":"https://php.net/manual/ru/language.types.array.php"}],"ordered_units":[{"id":2175,"name":"theory","url":"/courses/php-arrays/lessons/about/theory_unit"}],"id":1059,"slug":"about","state":"approved","name":"Введение","course_order":1,"goal":"Знакомимся с целями и задачами курса","self_study":null,"theory_video_provider":null,"theory_video_uid":null,"theory":"Массивы — первый и главный составной тип данных, с которым мы познакомимся. Работа с коллекциями относится к базовым навыкам программиста вне зависимости от его специализации. Вот лишь некоторые примеры работы с коллекциями:\n\n* Постраничный вывод на сайте\n* Подсчет общей суммы в заказе на основании каждой из позиций\n* Вывод списка друзей, сообщений, фильмов и тому подобное\n\nНередко задачи c коллекциями имеют **алгоритмический характер**, они требуют составления разумного алгоритма — не обязательно оптимального по скорости или памяти. Например, к таким задачам относится сортировка. Она уже реализована как функция стандартной библиотеки, но умение написать ее самостоятельно — это важный индикатор вашего развитого алгоритмического мышления. Другой реальный пример связан с поиском пересечений — например, между списками друзей разных пользователей. Такая функциональность реализована во многих социальных сетях.\n\nДля решения этой задачи еще желательно понимать математическую основу — теорию множеств. Это не сложная тема, которая требуется в программировании буквально на каждом углу, даже при работе с базами данных SQL. Знание алгоритмов и структур позволяет создавать по-настоящему хорошие решения, понимать плюсы и минусы тех или иных подходов, дает способность быстро ориентироваться на местности.\n\nВозможно, вы слышали, что изучение программирования стоит начинать с алгоритмов и книг [Кнута](https://ru.wikipedia.org/wiki/Кнут,_Дональд_Эрвин) на эту тему. По большей части это верный подход, но читать Кнута от корки до корки — занятие не для слабонервных, да и вряд ли у вас есть на это время. Поэтому в этом курсе мы постараемся компактно дать базовые знания, которых будет достаточно для понимания происходящего. Этот фундамент уже поможет перейти к реальной веб-разработке. В этом курсе мы хотим объяснить, что алгоритмы и структуры данных — это важная тема и для хардкорных программистов, и для системных программистов, и для веб-разработчиков.\n\nВ этом курсе вы научитесь не только базовым операциям над массивами. Также мы коснемся основных структур данных, познакомимся с алгоритмической сложностью и выясним, как реализовывать некоторые типичные алгоритмы, о которых нередко спрашивают на собеседованиях.\n"},"id":159,"slug":"php-arrays","challenges_count":15,"name":"PHP: Массивы","allow_indexing":true,"state":"approved","course_state":"finished","pricing_type":"paid","description":"На этом курсе вы изучите массивы в PHP. Вы узнаете больше о синтаксисе, вложенных массивах и ссылках. В итоге вы научитесь обходить массивы, извлекать из них значения с помощью деструктуризации и использовать spread-оператор. Массивы пригодятся для решения множества алгоритмических задач. Знания из этого курса помогают программистам грамотно объединять данные в коллекции.","kind":"additional","updated_at":"2026-01-20T11:50:10.959Z","language":"php","duration_cache":90960,"skills":["Определять массивы в коде и манипулировать ими","Формировать и обрабатывать массивы в циклах","Применять базовые алгоритмы и оценивать их сложность","Использовать spread-оператор и деструктуризацию"],"keywords":["синтаксис","вложенные массивы","алгоритмическая сложность","сортировка","теория множеств","стек"],"lessons_count":21,"cover":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6ODE0MiwicHVyIjoiYmxvYl9pZCJ9fQ==--df356c09bb0b5e31bffa8da59286dc58d9af366e/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGciLCJyZXNpemVfdG9fZmlsbCI6WzYwMCw0MDBdfSwicHVyIjoidmFyaWF0aW9uIn19--39ba06fa99226096df9fc6bb31f84e1d29ea98e9/image.png"},"recommendedLandings":[{"stack":{"id":2,"slug":"php","title":"PHP-разработчик","audience":"for_beginners","start_type":"weekly","pricing_model":"purchase","priority":"high","kind":"profession","state":"published","stack_state":"finished","order":60,"duration_in_months":10},"id":1,"slug":"php","title":"РНР-разработчик","subtitle":"Изучите PHP и Laravel для разработки и проектирования REST API","subtitle_for_lists":"Изучите PHP и Laravel для разработки и проектирования REST API","locale":"ru","current":true,"duration_in_months_text":"10 месяцев","stack_slug":"php","price_text":"от 5 650 ₽","duration_text":"10 месяцев","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzk5MiwicHVyIjoiYmxvYl9pZCJ9fQ==--e9d0f30948ea766a7e6bc3e3d56c192344d45fb8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programming-cuate%20(1).png"}],"lessonMemberUnit":null,"accessToLearnUnitExists":false,"accessToCourseExists":false},"url":"/courses/php-arrays/lessons/big-o/theory_unit","version":"8f286f6358a90a7bef2263b3a6edf5a90a94fa42","encryptHistory":false,"clearHistory":false}"><style data-mantine-styles="true">:root, :host{--mantine-font-family: Arial, sans-serif;--mantine-font-family-headings: Arial, sans-serif;--mantine-heading-font-weight: normal;--mantine-radius-default: 0rem;--mantine-primary-color-filled: var(--mantine-color-indigo-filled);--mantine-primary-color-filled-hover: var(--mantine-color-indigo-filled-hover);--mantine-primary-color-light: var(--mantine-color-indigo-light);--mantine-primary-color-light-hover: var(--mantine-color-indigo-light-hover);--mantine-primary-color-light-color: var(--mantine-color-indigo-light-color);--mantine-spacing-xxl: calc(4rem * var(--mantine-scale));--mantine-font-size-xs: 12px;--mantine-font-size-sm: 14px;--mantine-font-size-md: 16px;--mantine-font-size-lg: clamp(16.0000px, calc(15.2727px + 0.2273vw), 18.0000px);--mantine-font-size-xl: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-display-3: clamp(32.0000px, calc(26.1818px + 1.8182vw), 48.0000px);--mantine-font-size-display-2: clamp(36.0000px, calc(25.8182px + 3.1818vw), 64.0000px);--mantine-font-size-display-1: clamp(40.0000px, calc(25.4545px + 4.5455vw), 80.0000px);--mantine-font-size-h1: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-font-size-h2: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-font-size-h3: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-font-size-h4: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-font-size-h5: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-h6: 1rem;--mantine-primary-color-0: var(--mantine-color-indigo-0);--mantine-primary-color-1: var(--mantine-color-indigo-1);--mantine-primary-color-2: var(--mantine-color-indigo-2);--mantine-primary-color-3: var(--mantine-color-indigo-3);--mantine-primary-color-4: var(--mantine-color-indigo-4);--mantine-primary-color-5: var(--mantine-color-indigo-5);--mantine-primary-color-6: var(--mantine-color-indigo-6);--mantine-primary-color-7: var(--mantine-color-indigo-7);--mantine-primary-color-8: var(--mantine-color-indigo-8);--mantine-primary-color-9: var(--mantine-color-indigo-9);--mantine-color-red-0: #ffeaea;--mantine-color-red-1: #fed4d4;--mantine-color-red-2: #f4a7a8;--mantine-color-red-3: #ec7878;--mantine-color-red-4: #e55050;--mantine-color-red-5: #e03131;--mantine-color-red-6: #e02829;--mantine-color-red-7: #c71a1c;--mantine-color-red-8: #b21218;--mantine-color-red-9: #9c0411;--mantine-color-violet-0: #fce9ff;--mantine-color-violet-1: #f1cfff;--mantine-color-violet-2: #e09bff;--mantine-color-violet-3: #d16fff;--mantine-color-violet-4: #be37fe;--mantine-color-violet-5: #b51afe;--mantine-color-violet-6: #b009ff;--mantine-color-violet-7: #9b00e4;--mantine-color-violet-8: #8a00cc;--mantine-color-violet-9: #7800b3;--mantine-color-indigo-0: #edecff;--mantine-color-indigo-1: #d6d5fe;--mantine-color-indigo-2: #aaa9f4;--mantine-color-indigo-3: #7b79eb;--mantine-color-indigo-4: #5451e4;--mantine-color-indigo-5: #3b37e0;--mantine-color-indigo-6: #2d2adf;--mantine-color-indigo-7: #1f1ec7;--mantine-color-indigo-8: #1819b2;--mantine-color-indigo-9: #0c149e;--mantine-color-cyan-0: #dffdff;--mantine-color-cyan-1: #caf5ff;--mantine-color-cyan-2: #99e8ff;--mantine-color-cyan-3: #64daff;--mantine-color-cyan-4: #3ccffe;--mantine-color-cyan-5: #24c8fe;--mantine-color-cyan-6: #00c2ff;--mantine-color-cyan-7: #00ade4;--mantine-color-cyan-8: #009acd;--mantine-color-cyan-9: #0085b5;--mantine-color-green-0: #e9fdec;--mantine-color-green-1: #d7f6dc;--mantine-color-green-2: #b0eab9;--mantine-color-green-3: #86df94;--mantine-color-green-4: #62d574;--mantine-color-green-5: #4ccf5f;--mantine-color-green-6: #3fcc54;--mantine-color-green-7: #2fb344;--mantine-color-green-8: #25a03b;--mantine-color-green-9: #138a2e;--mantine-color-yellow-0: #fff7e2;--mantine-color-yellow-1: #ffeecd;--mantine-color-yellow-2: #ffdc9c;--mantine-color-yellow-3: #ffc966;--mantine-color-yellow-4: #feb93a;--mantine-color-yellow-5: #feae1e;--mantine-color-yellow-6: #ffa90f;--mantine-color-yellow-8: #ca8200;--mantine-color-yellow-9: #af7000;--mantine-h1-font-size: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-h1-font-weight: normal;--mantine-h2-font-size: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-h2-font-weight: normal;--mantine-h3-font-size: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-h3-font-weight: normal;--mantine-h4-font-size: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-h4-font-weight: normal;--mantine-h5-font-size: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-h5-font-weight: normal;--mantine-h6-font-size: 1rem;--mantine-h6-font-weight: normal;}
:root[data-mantine-color-scheme="dark"], :host([data-mantine-color-scheme="dark"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-dark-filled: var(--mantine-color-dark-5);--mantine-color-dark-filled-hover: var(--mantine-color-dark-6);--mantine-color-dark-light: rgba(105, 105, 105, 0.15);--mantine-color-dark-light-hover: rgba(105, 105, 105, 0.2);--mantine-color-dark-light-color: var(--mantine-color-dark-0);--mantine-color-dark-outline: var(--mantine-color-dark-1);--mantine-color-dark-outline-hover: rgba(184, 184, 184, 0.05);--mantine-color-gray-filled: var(--mantine-color-gray-5);--mantine-color-gray-filled-hover: var(--mantine-color-gray-6);--mantine-color-gray-light: rgba(222, 226, 230, 0.15);--mantine-color-gray-light-hover: rgba(222, 226, 230, 0.2);--mantine-color-gray-light-color: var(--mantine-color-gray-0);--mantine-color-gray-outline: var(--mantine-color-gray-1);--mantine-color-gray-outline-hover: rgba(241, 243, 245, 0.05);--mantine-color-red-filled: var(--mantine-color-red-5);--mantine-color-red-filled-hover: var(--mantine-color-red-6);--mantine-color-red-light: rgba(236, 120, 120, 0.15);--mantine-color-red-light-hover: rgba(236, 120, 120, 0.2);--mantine-color-red-light-color: var(--mantine-color-red-0);--mantine-color-red-outline: var(--mantine-color-red-1);--mantine-color-red-outline-hover: rgba(254, 212, 212, 0.05);--mantine-color-pink-filled: var(--mantine-color-pink-5);--mantine-color-pink-filled-hover: var(--mantine-color-pink-6);--mantine-color-pink-light: rgba(250, 162, 193, 0.15);--mantine-color-pink-light-hover: rgba(250, 162, 193, 0.2);--mantine-color-pink-light-color: var(--mantine-color-pink-0);--mantine-color-pink-outline: var(--mantine-color-pink-1);--mantine-color-pink-outline-hover: rgba(255, 222, 235, 0.05);--mantine-color-grape-filled: var(--mantine-color-grape-5);--mantine-color-grape-filled-hover: var(--mantine-color-grape-6);--mantine-color-grape-light: rgba(229, 153, 247, 0.15);--mantine-color-grape-light-hover: rgba(229, 153, 247, 0.2);--mantine-color-grape-light-color: var(--mantine-color-grape-0);--mantine-color-grape-outline: var(--mantine-color-grape-1);--mantine-color-grape-outline-hover: rgba(243, 217, 250, 0.05);--mantine-color-violet-filled: var(--mantine-color-violet-5);--mantine-color-violet-filled-hover: var(--mantine-color-violet-6);--mantine-color-violet-light: rgba(209, 111, 255, 0.15);--mantine-color-violet-light-hover: rgba(209, 111, 255, 0.2);--mantine-color-violet-light-color: var(--mantine-color-violet-0);--mantine-color-violet-outline: var(--mantine-color-violet-1);--mantine-color-violet-outline-hover: rgba(241, 207, 255, 0.05);--mantine-color-indigo-filled: var(--mantine-color-indigo-5);--mantine-color-indigo-filled-hover: var(--mantine-color-indigo-6);--mantine-color-indigo-light: rgba(123, 121, 235, 0.15);--mantine-color-indigo-light-hover: rgba(123, 121, 235, 0.2);--mantine-color-indigo-light-color: var(--mantine-color-indigo-0);--mantine-color-indigo-outline: var(--mantine-color-indigo-1);--mantine-color-indigo-outline-hover: rgba(214, 213, 254, 0.05);--mantine-color-blue-filled: var(--mantine-color-blue-5);--mantine-color-blue-filled-hover: var(--mantine-color-blue-6);--mantine-color-blue-light: rgba(116, 192, 252, 0.15);--mantine-color-blue-light-hover: rgba(116, 192, 252, 0.2);--mantine-color-blue-light-color: var(--mantine-color-blue-0);--mantine-color-blue-outline: var(--mantine-color-blue-1);--mantine-color-blue-outline-hover: rgba(208, 235, 255, 0.05);--mantine-color-cyan-filled: var(--mantine-color-cyan-5);--mantine-color-cyan-filled-hover: var(--mantine-color-cyan-6);--mantine-color-cyan-light: rgba(100, 218, 255, 0.15);--mantine-color-cyan-light-hover: rgba(100, 218, 255, 0.2);--mantine-color-cyan-light-color: var(--mantine-color-cyan-0);--mantine-color-cyan-outline: var(--mantine-color-cyan-1);--mantine-color-cyan-outline-hover: rgba(202, 245, 255, 0.05);--mantine-color-teal-filled: var(--mantine-color-teal-5);--mantine-color-teal-filled-hover: var(--mantine-color-teal-6);--mantine-color-teal-light: rgba(99, 230, 190, 0.15);--mantine-color-teal-light-hover: rgba(99, 230, 190, 0.2);--mantine-color-teal-light-color: var(--mantine-color-teal-0);--mantine-color-teal-outline: var(--mantine-color-teal-1);--mantine-color-teal-outline-hover: rgba(195, 250, 232, 0.05);--mantine-color-green-filled: var(--mantine-color-green-5);--mantine-color-green-filled-hover: var(--mantine-color-green-6);--mantine-color-green-light: rgba(134, 223, 148, 0.15);--mantine-color-green-light-hover: rgba(134, 223, 148, 0.2);--mantine-color-green-light-color: var(--mantine-color-green-0);--mantine-color-green-outline: var(--mantine-color-green-1);--mantine-color-green-outline-hover: rgba(215, 246, 220, 0.05);--mantine-color-lime-filled: var(--mantine-color-lime-5);--mantine-color-lime-filled-hover: var(--mantine-color-lime-6);--mantine-color-lime-light: rgba(192, 235, 117, 0.15);--mantine-color-lime-light-hover: rgba(192, 235, 117, 0.2);--mantine-color-lime-light-color: var(--mantine-color-lime-0);--mantine-color-lime-outline: var(--mantine-color-lime-1);--mantine-color-lime-outline-hover: rgba(233, 250, 200, 0.05);--mantine-color-yellow-filled: var(--mantine-color-yellow-5);--mantine-color-yellow-filled-hover: var(--mantine-color-yellow-6);--mantine-color-yellow-light: rgba(255, 201, 102, 0.15);--mantine-color-yellow-light-hover: rgba(255, 201, 102, 0.2);--mantine-color-yellow-light-color: var(--mantine-color-yellow-0);--mantine-color-yellow-outline: var(--mantine-color-yellow-1);--mantine-color-yellow-outline-hover: rgba(255, 238, 205, 0.05);--mantine-color-orange-filled: var(--mantine-color-orange-5);--mantine-color-orange-filled-hover: var(--mantine-color-orange-6);--mantine-color-orange-light: rgba(255, 192, 120, 0.15);--mantine-color-orange-light-hover: rgba(255, 192, 120, 0.2);--mantine-color-orange-light-color: var(--mantine-color-orange-0);--mantine-color-orange-outline: var(--mantine-color-orange-1);--mantine-color-orange-outline-hover: rgba(255, 232, 204, 0.05);--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-9) 0%, var(--mantine-color-cyan-7) 100%);--app-color-surface: #2e2e2e;}
:root[data-mantine-color-scheme="light"], :host([data-mantine-color-scheme="light"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-red-light: rgba(224, 40, 41, 0.1);--mantine-color-red-light-hover: rgba(224, 40, 41, 0.12);--mantine-color-red-outline-hover: rgba(224, 40, 41, 0.05);--mantine-color-violet-light: rgba(176, 9, 255, 0.1);--mantine-color-violet-light-hover: rgba(176, 9, 255, 0.12);--mantine-color-violet-outline-hover: rgba(176, 9, 255, 0.05);--mantine-color-indigo-light: rgba(45, 42, 223, 0.1);--mantine-color-indigo-light-hover: rgba(45, 42, 223, 0.12);--mantine-color-indigo-outline-hover: rgba(45, 42, 223, 0.05);--mantine-color-cyan-light: rgba(0, 194, 255, 0.1);--mantine-color-cyan-light-hover: rgba(0, 194, 255, 0.12);--mantine-color-cyan-outline-hover: rgba(0, 194, 255, 0.05);--mantine-color-green-light: rgba(63, 204, 84, 0.1);--mantine-color-green-light-hover: rgba(63, 204, 84, 0.12);--mantine-color-green-outline-hover: rgba(63, 204, 84, 0.05);--mantine-color-yellow-light: rgba(255, 169, 15, 0.1);--mantine-color-yellow-light-hover: rgba(255, 169, 15, 0.12);--mantine-color-yellow-outline-hover: rgba(255, 169, 15, 0.05);--app-color-surface: #f1f3f5;--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-5) 100%);}</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><div style="position:absolute;top:0rem" class=""></div><div style="max-width:var(--container-size-xl);height:100%;min-height:0rem" class=""><style data-mantine-styles="inline">.__m__-_R_5ub_{--grid-gutter:0rem;}</style><div style="height:100%;min-height:0rem" class="m_410352e9 mantine-Grid-root __m__-_R_5ub_"><div class="m_dee7bd2f mantine-Grid-inner" style="height:100%"><style data-mantine-styles="inline">.__m__-_R_rdub_{--col-flex-grow:auto;--col-flex-basis:91.66666666666667%;--col-max-width:91.66666666666667%;}@media(min-width: 48em){.__m__-_R_rdub_{--col-flex-grow:auto;--col-flex-basis:83.33333333333334%;--col-max-width:83.33333333333334%;}}</style><div style="min-width:0rem;height:100%;min-height:0rem;display:flex" class="m_96bdd299 mantine-Grid-col __m__-_R_rdub_"><style data-mantine-styles="inline">.__m__-_R_6qrdub_{margin-top:0rem;padding-inline:var(--mantine-spacing-xs);width:100%;}@media(min-width: 48em){.__m__-_R_6qrdub_{margin-top:var(--mantine-spacing-xl);width:80%;}}@media(min-width: 62em){.__m__-_R_6qrdub_{padding-inline:var(--mantine-spacing-xl);}}</style><div style="margin-inline:auto;max-width:var(--mantine-breakpoint-xl)" class="__m__-_R_6qrdub_"><div style="color:var(--mantine-color-dimmed)" class="m_4451eb3a mantine-Center-root" data-inline="true"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:calc(0.125rem * var(--mantine-scale));color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-lock "><path d="M5 13a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-6"></path><path d="M11 16a1 1 0 1 0 2 0a1 1 0 0 0 -2 0"></path><path d="M8 11v-4a4 4 0 1 1 8 0v4"></path></svg></div><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">PHP: Массивы</p></div><h1 style="--title-fw:var(--mantine-h1-font-weight);--title-lh:var(--mantine-h1-line-height);--title-fz:var(--mantine-h1-font-size);margin-bottom:var(--mantine-spacing-xl)" class="m_8a5d1357 mantine-Title-root" data-order="1">Теория: Оценка Big O</h1><script type="application/ld+json">{"@context":"https://schema.org","@type":"LearningResource","name":"Оценка Big O","inLanguage":"ru","isPartOf":{"@type":"LearningResource","name":"PHP: Массивы"},"isAccessibleForFree":"False","hasPart":{"@type":"WebPageElement","isAccessibleForFree":"False","cssSelector":".paywalled"}}</script><div class=""><div style="--alert-color:var(--mantine-color-indigo-light-color);margin-bottom:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-lg)" class="m_66836ed3 mantine-Alert-root" id="mantine-_R_remqrdub_" role="alert" aria-describedby="mantine-_R_remqrdub_-body" aria-labelledby="mantine-_R_remqrdub_-title"><div class="m_a5d60502 mantine-Alert-wrapper"><div class="m_667f2a6a mantine-Alert-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-rocket "><path d="M4 13a8 8 0 0 1 7 7a6 6 0 0 0 3 -5a9 9 0 0 0 6 -8a3 3 0 0 0 -3 -3a9 9 0 0 0 -8 6a6 6 0 0 0 -5 3"></path><path d="M7 14a6 6 0 0 0 -3 6a6 6 0 0 0 6 -3"></path><path d="M14 9a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path></svg></div><div class="m_667c2793 mantine-Alert-body"><div class="m_6a03f287 mantine-Alert-title"><span id="mantine-_R_remqrdub_-title" class="m_698f4f23 mantine-Alert-label">Полный доступ к материалам</span></div><div id="mantine-_R_remqrdub_-body" class="m_7fa78076 mantine-Alert-message"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Зарегистрируйтесь и получите доступ к этому и десяткам других курсов</p><a style="--button-height:var(--button-height-xs);--button-padding-x:var(--button-padding-x-xs);--button-fz:var(--mantine-font-size-xs);--button-bg:linear-gradient(45deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-filled) 100%);--button-hover:linear-gradient(45deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-filled) 100%);--button-color:var(--mantine-color-white);--button-bd:none" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="gradient" data-size="xs" href="/u/new"><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Зарегистрироваться</span></span></a></div></div></div></div></div><div class="paywalled m_d08caa0 mantine-Typography-root"><p>Когда мы говорим об алгоритмах, нельзя не упомянуть их <strong>сложность</strong>. Она обозначается как <em>Big O</em> и указывает, насколько эффективен тот или иной алгоритм.</p>
<p>Как вы помните, есть <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8#%D0%9E%D0%B1%D0%B7%D0%BE%D1%80_%D0%BD%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5_%D0%BF%D0%BE%D0%BF%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%BE%D0%B2_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8" rel="noopener noreferrer" target="_blank">много алгоритмов сортировок</a>. Они выполняют одну и ту же задачу, но при этом у них разная <strong>сложность</strong> — то есть количество выполняемых операций алгоритмом для достижения своей цели. Разные способы сортировки требуют очень разного количества проходов по массиву. Конкретное количество операций зависит от входных данных — например, для уже отсортированного массива количество операций будет минимальным (но они все равно будут, потому что алгоритм должен убедиться в том, что массив отсортирован).</p>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="/rails/active_storage/blobs/proxy/eyJfcmFpbHMiOnsiZGF0YSI6ODE1MiwicHVyIjoiYmxvYl9pZCJ9fQ==--a63588703c81ac2aeacd422a0a2a056e855c0ec2/sorting-big-o.png" alt="sorting-big-o" loading="lazy"/></p>
<p><em>Big O</em> показывает, насколько увеличится количество операций при увеличении объема данных. Рассмотрим пару примеров:</p>
<ul>
<li>Доступ к элементу массива по индексу. Сложность этой операции не зависит от размеров массива. Это постоянная сложность <strong>O(1)</strong></li>
<li>Печати на экран всех элементов массива с помощью обычного перебора. В худшем случае количество выполняемых операций будет равно $n$ — количеству элементов. Это линейная сложность <strong>O(n)</strong></li>
</ul>
<p>Что такое «худший случай»? Количество операций будет разным даже при работе с массивами одного размера — все зависит от состояния начального массива.</p>
<p>Проведем аналогию с кубиком Рубика. Чтобы его собрать, нужно провести какое-то количество действий. Их число зависит от положения, в котором находятся его грани перед сборкой. В некоторых случаях действий понадобится мало, в других — много. Худшим случаем называется ситуация, при которой нам понадобится максимальное количество действий.</p>
<p>Алгоритмическая сложность всегда оценивается по худшему случаю для выбранного алгоритма.</p>
<p>Для еще одного примера вспомним вложенные циклы и поиск пересечений в неотсортированных массивах.</p>
<p>Для каждого элемента из одного массива мы проверяем каждый элемент другого массива. При этом мы используем либо цикл, либо функцию <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">in_array()</code> со сложностью O(n) — в худшем случае мы просмотрим весь массив.</p>
<p>Если размеры обоих массивов одинаковы и равны n то поиск пересечений имеет квадратичную сложность <strong>O(n^2</strong>).</p>
<p>Одни алгоритмы эффективные, другие — не очень. Скорость работы неэффективных алгоритмов заметно падает даже при небольшом количестве элементов. Эффективные алгоритмы работают быстрее, и при этом они нередко потребляют больше памяти или запускаются параллельно. Часто в программировании эффективность — это компромисс. Выигрывая в одном месте, мы проиграем где-то в другом.</p>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="/rails/active_storage/blobs/proxy/eyJfcmFpbHMiOnsiZGF0YSI6ODE1MywicHVyIjoiYmxvYl9pZCJ9fQ==--db116f4c40b8ec737be02724fdf22b320dc87730/big-o.png" alt="big-o" loading="lazy"/></p>
<p>Во многом, <em>Big O</em> — это теоретическая оценка, на практике все может быть по-другому. Реальное время выполнения зависит от множества факторов, в том числе архитектуры процессора, операционной системы, языка программирования и типа доступа к памяти.</p>
<p>Вопрос эффективности кода довольно опасен. Например, в университетах программирование обычно изучают, начиная с алгоритмов. Из-за этого студентам может казаться, что эффективность — это главное, ведь код должен работать быстро. Такой подход приносит больше вреда, чем пользы. Дело в том, что эффективный код всегда сложнее неэффективного. Этот сложный код больше подвержен ошибкам, его труднее писать и модифицировать.</p>
<p>На практике настоящая эффективность нужна только в редких случаях. Обычно тормозит не код, а запросы к базе данных, сеть или что-то другое. Если конкретный участок кода выполняется медленно, это не всегда критично. Вполне возможно, что этот код работает с небольшим объемом памяти, вызывается все один раз и ни на что не влияет. К реальному замедлению может приводить совершенно другой фрагмент кода, который вызывается тысячи раз.</p>
<blockquote>
<p><em>Программисты тратят очень много времени, беспокоясь о некритичных местах кода и пытаясь оптимизировать их. Это всегда негативно сказывается на последующей отладке и поддержке. Поспешная оптимизация — это корень всех зол. В 97% случаев код лучше вообще не оптимизировать — так мы сэкономим время и сможем сосредоточиться на важных 3%. — Дональд Кнут</em></p>
</blockquote>
<p>Перед тем, как пытаться что-то оптимизировать, обязательно прочитайте <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="http://optimization.guide/" rel="noopener noreferrer" target="_blank">небольшую онлайн-книгу</a>, которая хорошо объясняет суть всех оптимизаций.</p></div><div style="margin-block:var(--mantine-spacing-xl)" class=""><h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size);margin-bottom:var(--mantine-spacing-md)" class="m_8a5d1357 mantine-Title-root" data-order="2">Рекомендуемые программы</h2><style data-mantine-styles="inline">.__m__-_R_2mremqrdub_{--carousel-slide-gap:var(--mantine-spacing-xs);--carousel-slide-size:70%;}@media(min-width: 36em){.__m__-_R_2mremqrdub_{--carousel-slide-gap:var(--mantine-spacing-xl);--carousel-slide-size:50%;}}</style><div style="--carousel-control-size:calc(2.5rem * var(--mantine-scale));--carousel-controls-offset:var(--mantine-spacing-sm);margin-bottom:var(--mantine-spacing-lg);padding-block:var(--mantine-spacing-sm);background:var(--app-color-surface)" class="m_17884d0f mantine-Carousel-root responsiveClassName" data-orientation="horizontal" data-include-gap-in-size="true"><div class="m_39bc3463 mantine-Carousel-controls" data-orientation="horizontal"><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="previous" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="next" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(-90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button></div><div class="m_a2dae653 mantine-Carousel-viewport" data-type="media"><div class="m_fcd81474 mantine-Carousel-container __m__-_R_2mremqrdub_" data-orientation="horizontal"><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/php?promo_name=programs_list&promo_position=course&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">10 месяцев</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">С нуля</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">РНР-разработчик</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите PHP и Laravel для разработки и проектирования REST API</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzk5MiwicHVyIjoiYmxvYl9pZCJ9fQ==--e9d0f30948ea766a7e6bc3e3d56c192344d45fb8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programming-cuate%20(1).png" alt="РНР-разработчик" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 5 650 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses?promo_name=programs_list&promo_position=course&promo_creative=catalog_card&promo_type=card"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size);margin-bottom:var(--mantine-spacing-md);font-size:var(--mantine-font-size-h3)" class="m_8a5d1357 mantine-Title-root" data-order="2" data-responsive="true">Каталог</h2><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Полный список доступных курсов по разным направлениям</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="/vite/assets/development-BVihs_d5.png" alt="Orientation"/></div></div></div></a></div></div></div></div></div></div></div></div></div><style data-mantine-styles="inline">.__m__-_R_1bdub_{--col-flex-grow:auto;--col-flex-basis:8.333333333333334%;--col-max-width:8.333333333333334%;}@media(min-width: 48em){.__m__-_R_1bdub_{--col-flex-grow:auto;--col-flex-basis:16.666666666666668%;--col-max-width:16.666666666666668%;}}</style><div style="min-width:0rem;height:100%;min-height:0rem" class="m_96bdd299 mantine-Grid-col __m__-_R_1bdub_"><div style="margin-inline:var(--mantine-spacing-xs)" class="mantine-visible-from-sm"><a style="--button-color:var(--mantine-color-white);margin-bottom:var(--mantine-spacing-lg);text-decoration:none" class="mantine-focus-auto m_849cf0da mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses/php-arrays/lessons/big-o/finish_unit?unit=theory" data-disabled="true" data-block="true" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label"><span style="margin-inline-end:var(--mantine-spacing-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Дальше</span>→</span></span></a><a style="padding-inline:0rem" class="mantine-focus-auto m_f0824112 mantine-NavLink-root m_87cf2631 mantine-UnstyledButton-root"><span class="m_690090b5 mantine-NavLink-section" data-position="left"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-list-numbers "><path d="M11 6h9"></path><path d="M11 12h9"></path><path d="M12 18h8"></path><path d="M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4"></path><path d="M6 10v-6l-2 2"></path></svg></div></span><div class="m_f07af9d2 mantine-NavLink-body"><span class="m_1f6ac4c4 mantine-NavLink-label">Навигация по теме</span><span class="m_57492dcc mantine-NavLink-description">Теория</span></div><span class="m_690090b5 mantine-NavLink-section" data-position="right"></span></a><div style="margin-block:var(--mantine-spacing-lg)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" role="separator"></div><div style="margin-block:var(--mantine-spacing-lg)" class=""><div style="justify-content:space-between;margin-bottom:calc(0.1875rem * var(--mantine-scale));color:var(--mantine-color-dimmed);font-size:var(--mantine-font-size-xs)" class="m_8bffd616 mantine-Flex-root __m__-_R_qimrbdub_"><p style="font-size:var(--mantine-font-size-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Завершено</p><p style="font-size:var(--mantine-font-size-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">0 / 21</p></div><div style="--progress-size:var(--progress-size-sm)" class="m_db6d6462 mantine-Progress-root" data-size="sm"><div style="--progress-section-size:0%;--progress-section-color:var(--mantine-color-gray-filled)" class="m_2242eb65 mantine-Progress-section" role="progressbar" aria-valuemax="100" aria-valuemin="0" aria-valuenow="0" aria-valuetext="0%"></div></div></div><button style="padding-inline:0rem" class="mantine-focus-auto m_f0824112 mantine-NavLink-root m_87cf2631 mantine-UnstyledButton-root" type="button"><span class="m_690090b5 mantine-NavLink-section" data-position="left"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-message "><path d="M8 9h8"></path><path d="M8 13h6"></path><path d="M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12"></path></svg></div></span><div class="m_f07af9d2 mantine-NavLink-body"><span class="m_1f6ac4c4 mantine-NavLink-label">Обсуждения (архив)</span><span class="m_57492dcc mantine-NavLink-description"></span></div></button><div style="--toc-bg:var(--mantine-color-blue-light);--toc-color:var(--mantine-color-blue-light-color);--toc-size:var(--mantine-font-size-sm);--toc-radius:var(--mantine-radius-sm);margin-top:var(--mantine-spacing-xl)" class="m_bcaa9990 mantine-TableOfContents-root" data-variant="light" data-size="sm"></div></div><div class="mantine-hidden-from-sm"><div style="--stack-gap:0rem;--stack-align:stretch;--stack-justify:flex-start" class="m_6d731127 mantine-Stack-root"><a style="--button-color:var(--mantine-color-white);margin-bottom:var(--mantine-spacing-xs);padding:0rem;text-decoration:none" class="mantine-focus-auto m_849cf0da mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses/php-arrays/lessons/big-o/finish_unit?unit=theory" data-disabled="true" data-block="true" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">→</span></span></a><button style="--ai-size:var(--ai-size-sm);--ai-bg:transparent;--ai-hover:var(--mantine-color-indigo-light-hover);--ai-color:var(--mantine-color-indigo-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding-block:var(--mantine-spacing-lg);color:inherit;width:100%" class="mantine-focus-auto m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" data-size="sm" data-disabled="true" type="button" disabled=""><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-list-numbers "><path d="M11 6h9"></path><path d="M11 12h9"></path><path d="M12 18h8"></path><path d="M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4"></path><path d="M6 10v-6l-2 2"></path></svg></span></button><button style="--ai-size:var(--ai-size-sm);--ai-bg:transparent;--ai-hover:var(--mantine-color-indigo-light-hover);--ai-color:var(--mantine-color-indigo-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding-block:var(--mantine-spacing-lg);color:inherit;width:100%" class="mantine-focus-auto mantine-active m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" data-size="sm" type="button"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-message "><path d="M8 9h8"></path><path d="M8 13h6"></path><path d="M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12"></path></svg></span></button></div></div></div></div></div></div></div>
</main>
<footer class="bg-dark fw-light text-light px-3 py-5">
<div class="row small">
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 mb-3">Хекслет</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/about">О нас</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/testimonials">Отзывы</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://b2b.hexlet.io" role="button">Корпоративное обучение</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/blog">Блог</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/qna">Вопросы и ответы</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/glossary">Глоссарий</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://help.hexlet.io" data-target="_blank" role="button">Справка</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" target="_blank" rel="noopener noreferrer" href="/map">Карта сайта</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 fw-normal mb-3">Направления</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_devops">DevOps
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_data_analytics">Аналитика
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_backend_development">Бэкенд
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_programming">Программирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_testing">Тестирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_front_end_dev">Фронтенд
</a></li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Профессии</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/go">Go-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/java">Java-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python">Python-разработчик </a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/data-analytics">Аналитик данных</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/qa-engineer">Инженер по ручному тестированию</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php">РНР-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/frontend">Фронтенд-разработчик</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Навыки</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python-django-developer">Django</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/docker">Docker</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php-laravel-developer">Laravel</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/postman">Postman</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-react-developer">React</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-rest-api">REST API в Node.js</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/spring-boot">Spring Boot</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/typescript">Typescript</a>
</li>
</ul>
</div>
</div>
<hr>
<div class="row">
<div class="col-12 col-sm-4 col-md-2">
<div class="fs-4">
<ul class="list-unstyled d-flex">
<li class="me-3">
<a aria-label="Telegram" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://t.me/hexlet_ru"><span class="bi bi-telegram"></span>
</a></li>
<li>
<a aria-label="Youtube" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://www.youtube.com/user/HexletUniversity"><span class="bi bi-youtube"></span>
</a></li>
</ul>
</div>
<div class="mb-2 d-flex flex-column">
<a class="link-light text-decoration-none" rel="nofollow" href="mailto:support@hexlet.io">support@hexlet.io</a>
<a class="link-light text-decoration-none py-2" target="_blank" href="https://t.me/hexlet_help_bot">t.me/hexlet_help_bot</a>
</div>
<ul class="list-unstyled d-flex">
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://hexlet.io/locale/switch?new_locale=en" data-target="_self" role="button"><span class="my-auto">EN</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 opacity-100 external-link" rel="nofollow" data-href="https://ru.hexlet.io/locale/switch?new_locale=ru" data-target="_self" role="button"><span class="my-auto">RU</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://kz.hexlet.io/locale/switch?new_locale=kz" data-target="_self" role="button"><span class="my-auto">KZ</span>
</span></li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<ul class="list-unstyled fs-4">
<li class="mb-3">
<a class="link-light text-decoration-none" href="tel:8%20800%20100%2022%2047">8 800 100 22 47</a>
<span class="d-block opacity-50 small">бесплатно по РФ</span>
</li>
<li>
<a class="link-light text-decoration-none" href="tel:%2B7%20495%20085%2021%2062">+7 495 085 21 62</a>
<span class="d-block opacity-50 small">бесплатно по Москве</span>
</li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<div class="small mb-3">Образовательные услуги оказываются на основании Л035-01298-77/01989008 от 14.03.2025</div>
<ul class="list-unstyled small">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/legal">Правовая информация</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/offer">Оферта</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/license">Лицензия</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/contacts">Контакты</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-12 col-md-4 small">
<div class="mb-2">
<div>ООО «<a href="/" class="text-decoration-none link-light">Хекслет Рус</a>»</div>
<div>108813 г. Москва, вн.тер.г. поселение Московский,</div>
<div>г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3</div>
<div>ОГРН 1217300010476</div>
<div>ИНН 7325174845</div>
</div>
<hr>
<div>АНО ДПО «<a href="/" class="text-decoration-none link-light">Учебный центр «Хекслет</a>»</div>
<div>119331 г. Москва, вн. тер. г. муниципальный округ</div>
<div>Ломоносовский, пр-кт Вернадского, д. 29</div>
<div>ОГРН 1247700712390</div>
<div>ИНН 7736364948</div>
</div>
</div>
</footer>
<div id="root-assistant-offcanvas"></div>
<script src="/vite/assets/assistant-Bukl1lYy.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/MarkdownBlock-DbyKWoR_.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/shiki-V011pkdv.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-XR8Qr8kR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dist-GCHh59xr.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useIsomorphicEffect-HJ6VK0D3.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-KSp6QbZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/classnames-l6ipYlLR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/debounce-jMQ_Cf4f.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v67327c56f0bb4ef8b305cae61679db8f1769101564043" integrity="sha512-rdcWY47ByXd76cbCFzznIcEaCN71jqkWBBqlwhF1SY7KubdLKZiEGeP7AyieKZlGP9hbY/MhGrwXzJC/HulNyg==" data-cf-beacon='{"version":"2024.11.0","token":"d11015b65d11429ea6b4a2ef37dd7e0b","server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>