пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ
Слишком длинный поисковый запрос.
По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Международная организации ISO представляет свою уникальную разработку под названием OSI, которой необходимо создать базу для разработки сетевых стандартов. Сетевая модель TCP/IP контролирует процесс межсетевого взаимодействия между компьютерными системами. Несмотря на это, модель OSI включает в себя 7 уровней сетевого взаимодействия, а модель TCP/IP - 4. Межсетевой экран Netfilter определяет протоколы Некоторые из них могут быть заданы только косвенно. Протоколы сетевого уровня и межсетевое экранирование Для формирования сквозной транспортной системы необходимо предоставить сетевой уровень (Network Layer). Он определяет маршрут передачи данных, преобразует логические адреса и имена в физические; в модели OSI (Таблица 2.1) данный уровень получает дейтаграммы, определяет маршрут и логическую адресацию, и направляет пакеты в канальный уровень, при этом сетевой уровень прибавляет свой заголовок. Протокол IP (Internet Protocol) Основным протоколом является IP, который имеет две версии: IPv4 и IPv6. Основные характеристики протокола IPv4: Размер адреса узла - 4 байта В заголовке есть поле TTL Нет гарантии при доставке, что будет правильная последовательность Пакетная передача данных. Если превысится максимальный размер для пакета, тогда обеспечивается его фрагментация. Версия состоящее из четырех бит поле, которое содержит в себе номер версии IP протокола (4 или 6). Длина заголовка - состоящее их 4х бит поле, которое определяет размер заголовка пакета. Тип обслуживания поле, которое состоит из 1 байта; на сегодняшний день не используется. Его заменяют на два других: DSCP, которое делит трафик на классы обслуживания, размер его составляет 6 бит. ECN - поле, состоящее из 2 бит, используется в случае, если есть перегрузка при передаче трафика. Смещение фрагмента используется в случае фрагментации пакета, поле которого равно 13 бит. Должно быть кратно 8. "Время жизни" поле, длиной в 1 байт, значение устанавливает создающий IP-пакет узел сети, поле, состоящее из 1 байта Транспорт поле, размером в один байт. Доп. данные заголовка поле, которое имеет произвольную длину в зависимости от содержимого и используется для спец. задач. Данные выравнивания. Данное поле используется для выравнивания заголовка пакета до 4 байт. IP уникальный адрес. Адреса протокола четвёртой версии имеют длину 4 байта, а шестой 16 байт. IP адреса делятся на классы (A, B, C). Рисунок 2.2. Сети, которые получаются в результате взаимодействия данных классов, различаются допустимым количеством возможных адресов сети. Для классов A, B и C адреса распределяются между идентификатором (номером) сети и идентификатором узла сети Протокол ICMP Протокол сетевого уровня ICMP передает транспортную и диагностическую информацию. Даже если атакующий компьютер посылает множество ICMP сообщений, из-за которых система примет его за 1 из машин. Тип поле, которое содержит в себе идентификатор типа ICMP-сообщения. Оно длиною в 1 байт. Код поле, размером в 1 байт. Включает в себя числовой идентификатор, Internet Header + 64 bits of Original Data Datagram включает в себе IP заголовок и 8 байт данных, которые могут быть частью TCP/UDP заголовка или нести информацию об ошибке. Типы ICMP-сообщений, есть во всех версиях ОС Альт, и они подразделяются на две большие категории. Протоколы транспортного уровня и межсетевое экранирование При ПТУ правильная последовательность прихода данных. Основными протоколами этого уровня являются TCP и UDP. Протокол UDP Основные характеристики протокола UDP приведены ниже. Простую структура, в отличие от TCP Сведения придут неповрежденными, потому что проверяется контрольная сумма Нет гарантии надёжной передачи данных и правильного порядка доставки UDP-пакетов Последнее утверждение нельзя рассматривать как отрицательное свойство UDP. Поддержка протокола не контролирует доставку пакетов, значит передача данных быстрее, в отличие от TCP. UDP-пакеты являются пользовательскими дейтаграммами и имеют точный размер заголовка 8 байт. Адрес порта источника - поле, размером 16 бит, с № порта. Адрес порта пункта назначения - поле, размером 16 бит, в котором есть адрес порта назначения. Длина - размером 16 бит. Оно предназначено для хранения всей длины дейтаграммы пользователя и заголовка данных. Контрольная сумма. Данная ячейка обнаруживается всею пользовательскую дейтаграмму. В UDP контрольная сумма состоит из псевдозаголовока, заголовка и данных, поступивших от прикладного уровня. Псевдозаголовок это часть заголовка IP-пакета, в котором дейтаграмма пользователя закодирована в поля, в которых находятся 0. Передающее устройство может вычисляет итоговую сумму за восемь шагов: Появляется псевдозаголовок в дейтаграмме. В поле КС по итогу ставится 0. Нужно посчитать число байтов. Если четное тогда в поле заполнения мы пишем 1 байт (все нули). Конечный результат - вычисление контрольной суммы и его удаление. Складываются все 16-битовых секций и дополняются 1. Дополнение результата. Данное число и есть контрольная сумма Убирается псевдозаголовка и всех дополнений. Передача UDP-сегмента к IP программному обеспечению для инкапсуляции. Приемник вычисляет контрольную сумму в течение 6 шагов: Прописывается псевдозаголовок к пользовательской дейтаграмме UDP. Если надо, то дополняется заполнение. Все биты делятся на 16-битовые секции. Складывается все 16-битовых секций и дополняются 1. Дополнение результата. Когда результат = нулю, убирается псевдозаголовок и дополнения, и получает UDP-дейтаграмму только семь б. Однако, если программа выдает иной рез., пользовательская дейтаграмма удаляется. Чтобы передать данные - инкапсулируется пакет. В хосте пункта назначения биты декодируются и отправляются к звену данных. Последний использует заголовок для проверки данных, заголовок и окончание убираются, если все правильно, а дейтаграмма передается IP. ПО делает свою проверку. Когда будет все правильно, заголовок убирается, и пользовательская дейтаграмма передается с адресами передатчика и приемника. UDP считает контрольную сумму для проверки . Если и в этот раз все верно, тогда опять заголовок убирается, и прикладные данные передаются процессу. Протокол TCP Транспортный адрес заголовка IP-сегмента равен 6 (Таблица 2.2). Протокол TCP совсем другой, в отличие от протокола UDP. UDP добавляет свой собственный адрес к данным, которые являются дейтаграммой, и прибавляет ее IP для передачи. TCP образует виртуальное соединение между хостами, что разрешает передавать и получать данные как поток байтов. Также добавляется заголовок перед передачей пакету СУ. Порт источника и порт приемника поля размером по 16 бит. В нем есть номер порта службы источника. Номер в последовательности поле размером в 32 бита, содержит в себе номер кадра TCP-пакета в последовательности. Номер подтверждения поле длиной в 32 бита, индикатор успешно принятых предыдущих данных. Смещение данных поле длиной в 4 бита (длина заголовка + смещение расположения данных пакета. Биты управления поле длиной 6 бит, содержащее в себе различные флаги управления. Размер окна поле размером 16 бит, содержит в себе размер данных в байтах, их принимает тот, кто отправил данный пакет. Макс.значение размера окна - 40967байт. Контр. сумма поле размером 16 бит, содержит в себе значение всего TCP-сегмента Указатель поле размером 16 бит, которое используется, когда устанавливается флаг URG. Индикатор количества пакетов особой важности. Опции - поле произв. длины, размер которого зависит от данных находящихся в нём. Чтобы повысить пропускную функцию канала, необходим способ "скользящего окна". Необходимы только поля заголовка TCP-сегмента: "Window". Вместе с данным полем можно отправлять максимальное количество байт данных. Классификация межсетевых экранов Межсетевые экраны не позволяют проникнуть несанкционированным путем, даже если будет использоваться незащищенныеместа, которые есть в протоколах ТСР/IP. Нынешние МЭ управляют потоком сетевого трафика между сетями с различными требованиями к безопасности. Есть несколько типов МЭ. Чтобы их сравнить, нужно с точностью указать все уровни модели OSI, которые он может просчитать. МЭ работают на всех уровнях модели OSI. Пакетные фильтры Изначально сделанный тип МЭ и есть пакетный фильтр. ПФ - часть маршрутизаторов, которые могут быть допущены к разным сист.адресам. ПФ читают информацию заголовков пакетов 3-го и 4-го уровней. ПФ применяется в таких разделай сетевой инфраструктуры, как: пограничные маршрутизаторы; ос; персональные МЭ. Пограничные роутеры Главным приоритетом ПФ является скорость. Также пф ограничивать доступ при DoS-атаки. Поэтому данные пф встроены в большинство роутеров. Преимущества пф: Пф доступен для всех, так как остается в целостности ТСР-соединение. Недостатки пакетных фильтров: Пфпропускают данные с высших уровней МЭ имеет доступ не ко всей информации Большинство пф не аутентифицируют пользователя. Для исходящего и входящего трафика происходит фильтрация. МЭ анализирующие состояние сессии Такие МЭ являются пакетными фильтрами, которые считывают сохраняемый пакет 4-го уровня OSI. Плюсы МЭ четвертого уровня: Информацию могут узнать только установленные соединения Пф доступен для всех, остается в целостности ТСР-соединение Прокси-сервер прикладного уровня Если применять МЭ ПУ, тогда нам не потребуется устройство, чтобы выполнить маршрутизацию. Прокси-сервер, анализирующий точный протокол ПУ, называется агентом прокси. Такой МЭ имеют много преимуществ. Плюсы прокси-сервера ПУ: Прокси требует распознавание пользователя МЭ ПУ проанализирует весь сетевой пакет. Прокси ПУ создают детальные логи. Минусы прокси-сервера ПУ: МЭ использует больше времени при работе с пакетами рикладные прокси работают не со всеми сетевыми приложениями и протоколами Выделенные прокси-серверы Эти прокси-серверы считывают трафик определенного прикладного протокола и не анализируют его полностью. Прокси-серверы нужны для сканирования web и e-mail содержимого: отсеивание Java-приложений; отсеивание управлений ActiveX; отсеивание JavaScript; уничтожение вирусов; блокирование команд, определенных для приложений и пользователя, вместе с блокирование нескольких типов содержимого для точных пользователей.
img
Что такое DOM? DOM (Document Object Model) – это объектная модель документа. Это интерфейс между JavaScript и веб-браузером.  С помощью DOM вы можете написать код JavaScript для создания, изменения или удаления элементов HTML, установки стилей, классов и атрибутов, а также для принятия событий и реагирования на них. Дерево DOM формируется из HTML-документа, и с ним уже можно будет взаимодействовать. DOM – это очень сложный API, у которого есть методы и свойства для взаимодействия с деревом DOM. Как работает DOM – за кадром DOM продуманно организован. Родительский элемент называется EventTarget. Приведенная ниже диаграмма поможет вам лучше понять, как это работает: EventTarget – это интерфейс, реализуемый объектами, которые могут принимать события и у которых могут быть обработчики этих событий. Иными словами, любой источник событий реализует три метода, которые связаны с этим интерфейсом. Самыми распространенными генераторами событий являются Element и его дочерние элементы, Document и Window. Другие объекты также могут выступать в качестве источников событий.  Объект Window - это окно браузера. Все глобальные объекты, функции и переменные JavaScript автоматически становятся частью объекта Window. Глобальные переменные – это свойства Window. Глобальные функции – это методы Window. И даже Document (DOM HTML) является свойством Window. window.document.getElementById("header"); // Both are same document.getElementById("header"); В модели дом DOM есть узлы., и все части документа, такие как элементы, атрибуты, текст и т.д., организованы в виде иерархической древовидной структуры, которая состоит из родителей и потомков. Все эти части документа называются узлами (Node). Node на приведенной выше диаграмме представлен как объект JavaScript. В основном мы работаем с document, у которого есть такие распространенные методы, как document.queryselector(), document.getElementBy Id() и т.д. Теперь давайте посмотрим на document.  Как выбирать, создавать и удалять элементы с помощью DOM С помощью DOM мы можем выбирать, удалять и создавать элементы в JavaScript. Как выбирать элементы  Существует несколько способов выбрать HTML-элементы (HTML Elements) в JavaScript. Здесь мы рассмотрим следующие методы:  document.getElementById(); document.getElementByClassName(); document.getElementByTagName(); document.querySelector(); document.querySelectorAll(); Как использовать метод document.getElementById() Метод getElementById() возвращает элемент, идентификатор которого соответствует переданной строке. Идентификаторы элементов HTML должны быть уникальными, поэтому это самый быстрый способ выбрать элемент с идентификатором.  Пример: const ele = document.getElementById("IDName"); console.log(ele); // This will log the whole HTML element Как использовать метод document.getElementByClassName() Метод document.getElementByClassName() возвращает HTMLCollection элементов, которые соответствуют имени переданного класса. Можно искать сразу несколько имен классов, передав их через пробел. Тогда этот метод вернет «живую» HTMLCollection. Что такое «живая» HTMLCollection? Это означает, что как только мы получим HTMLCollection для какого-то имени класса, и если мы добавим элемент с тем же именем класса, то HTMLCollection автоматически обновится.  Пример: const ele = document.getElementByClassName("ClassName"); console.log(ele); // Logs Live HTMLCollection Как использовать метод document.getElementByTagName() Метод document.getElementByTagName() возвращает HTMLCollection элементов, которые соответствуют переданному имени тега. Его можно вызывать для любого элемента HTML. Метод вернет «живую» HTMLCollection. Пример: const paragraph = document.getElementByTagName("p"); const heading = document.getElementByTagName("h1"); console.log(paragraph); // p element HTMLCollection console.log(heading); // h1 element HTMLCollection   Как использовать метод document.querySelector() Метод document.querySelector() возвращает первый элемент, который соответствует переданному селектору. Здесь мы можем передать имя класса, идентификатор и имя тега. Давайте посмотрим на пример ниже: const id = document.querySelector("#idname"); // using id const classname = document.querySelector(".classname"); // using class const tag = document.querySelector("p"); // using tagname Правила выбора: если вы выбираете по имени класса, то используйте (.) в начале. Например, (“.classname”). если вы выбираете по идентификатору, то используйте (#) в начале. Например, (“#id”). если вы выбираете по имени тега, то просто введите тег. Например,  (“p”).  Как использовать метод document.querySelectorAll() Метод document.querySelectorAll() - это расширение метода querySelector. Этот метод возвращает все элементы, которые соответсвуют переданному селектору. Он возвращает «неживую» коллекцию Nodelist.  Пример: const ele = document.querySelectorAll("p"); console.log(ele); // return nodelist collection of p tag   ПРИМЕЧАНИЕ : HTMLCollection – это «живая» коллекция, а коллекция Nodelist – статическая.    Как создавать элементы Вы можете создавать HTML-элементы в JavaScript и динамически добавлять их в HTML. Вы можете создать любой элемент HTML с помощью метода document.createElement(), просто передав имя тега в скобках.    После того, как элемент будет создан, вы сможете добавить к нему имя класса, атрибуты и текст.    Вот пример: const ele = document.createElement("a"); ele.innerText = "Click Me"; ele.classList.add("text-left"); ele.setAttribute("href", "www.google.com"); // update to existing element in HTML document.querySelector(".links").prepend(ele); document.querySelector(".links").append(ele); document.querySelector(".links").befor(ele); document.querySelector(".links").after(ele); // Simalar to below anchor tag // Click Me   В приведенном выше примере мы создали тег привязки (anchor) в JavaScript и добавили атрибуты и имя класса к этому тегу. Там же у нас есть четыре метода для того, чтобы обновить созданный элемент в HTML. prepend(): вставляет данные поверх своего первого дочернего элемента. append(): вставляем данные или содержимое внутрь элемента по последнему индексу. before(): вставляет данные перед выбранным элементом. after(): помещает элемент после указанного элемента. Или можно сказать, что он вставляет данные за пределами элемента (делая это содержимое элементом того же уровня) в набор подходящих элементов. Как удалять элементы Мы знаем, как создавать элементы на JavaScript и помещать их в HTML. Но, что если нам нужно удалить элементы в HTML? Это довольно просто! Нам достаточно воспользоваться методом remove() для нужного элемента.  Вот пример: const ele = document.querySelector("p"); // This will remove ele when clicked on ele.addEventListner('click', function(){ ele.remove(); })   Как управлять CSS из JavaScript Мы знаем, как управлять HTML из JavaScript. А теперь мы узнаем, как управлять CSS из JavaScript. Это может помочь вам динамически менять стиль ваших веб-страниц.  Например, если вы нажимаете на элемент, то его фоновый цвет должен поменяться. Это реально сделать, управляя CSS из JavaScript.    Вот пример синтаксиса: const ele = document.querySelector("desired element"); ele.style.propertyName = value; // E.g - ele.style.color = red;   Когда вы меняете свойства CSS с помощью JavaScript, помните, что всякий раз, когда в CSS печатается «-», в JavaScript там будет стоять заглавная буква. Например, в CSS вы бы написали background-color, а в JavaScript – backgroundColor (с большой буквы C).    Вот пример: const ele = document.querySelector("div"); ele.style.backgroundColor = "red"; Предположим, что вы написали код CSS для своего проекта и хотите добавить классы с помощью JavaScript. Это можно сделать с помощью classList в JavaScript.    Вот еще один пример: const ele = document.querySelector(".link"); ele.classList.add("bg-red"); // add class bg-red to existing class list ele.classList.remove("pb-4");// remove class bg-red from existing class list ele.classList.toggle("bg-green"); // toggle class bg-red to existing class list which means if it already exists then it will be removed, if it doesn't exist it will be added. classList добавляет, удаляет или переключает классы относительно какого-то элемента. Это чем-то похоже на обновление существующих классов.    В отличие от element.className, он удаляет все существующие классы и добавляет указанный класс.  И еще один пример: const ele = document.querySelector(".link"); ele.classList.add("bg-red"); // add class bg-red to existing class list ele.classList.remove("pb-4");// remove class bg-red from existing class list ele.className = "p-10"; // Now this will remove all existing classes and add only "p-10 class to element."   Как использовать обработчики событий Событие (Event) – это изменение состояния объекта. Обработка событий (Event Handling) – процесс реагирования на события.  События происходит всякий раз, когда пользователь щелкает кнопкой мыши, наводит курсор на элемент, нажимает клавишу и т.д. Поэтому, когда происходит событие, и вы хотите выполнить какое-то действие, то вы используете обработчики событий, чтобы это действие произошло.  Мы используем обработчики событий для того, чтобы выполнить определенный код, когда это конкретное событие происходит. В JavaScript есть несколько обработчиков событий, однако процесс их добавления к элементам одинаков.  Вот синтаксис: const ele = document.querySelector("a"); ele.addEventListner("event", function(){ // callback function }); Вот некоторые события, которые вы можете использовать: click mouseover mouseout keypress keydown А вот пример использования события «click» (нажатия на кнопку мыши): const ele = document.querySelector("a"); ele.addEventListner("click", function(){ ele.style.backgroundColor = "pink"; }); Распространение событий: всплывание событий и перехват событий Распространение событий определяет то, в каком порядке элементы будут получать события. Существует два способа обработки порядка распространения событий в DOM: всплывание событий и перехват событий.  Что такое всплывание событий? Когда в каком-то компоненте происходит событие, то он сначала на нем запускается обработчик событий, только потом на его родительском компоненте, а затем уже и на всех остальных компонентах, которых называют предками.  По умолчанию все обработчики событий перемещаются именно в этом порядке - от события центрального компонента к событию компонента, который находится от него дальше всех.    Что такое перехват событий? Этот способ – противоположность предыдущему. Обработчик событий запускается сначала на родительском компоненте, а уже потом на том компоненте, на котором он фактически и должен был сработать.  Проще говоря, это означает, что событие сначала перехватывается самым удаленным элементом, а затем распространяется на внутренние элементы. Также этот способ называют «просачиванием вниз».    Давайте попробуем запустить следующий пример:                Example           
           
    Этот код выдаст нам следующее: Теперь давайте внимательно изучим приведенный выше пример. Я добавил получатель событий к тегу nav и тегу anchor. Когда вы нажимаете на nav, то цвет фона меняется на зеленый. Когда вы нажимаете на тег anchor, то цвет фона меняется на розовый.  Но когда вы нажимаете на тег anchor, то цвет фона меняется как у nav, так и у anchor. Это происходит из-за всплывания событий.    Вот что происходит, когда вы нажимаете только на элемент nav:       А вот что происходит, когда вы нажимаете только на элемент anchor: Для того, чтобы остановить распространение событий, мы можем воспользоваться методом stoppropagation() на получателе событий, из-за которого и происходит распространение события. В таком случае в приведенном выше примере получатель событий элемента nav не сработает.                   Example           
           
    Как перемещаться по модели DOM «Хороший разработчик JavaScript должен знать, как перемещаться по модели DOM. Перемещаться по модели DOM значит выбирать один элемент из другого,» - Зелл Лью. Теперь посмотрим, почему лучше обойти модель DOM, чем использовать метод document.querySelector(), и как это выполнить на профессиональном уровне.  Есть три способа обхода модели DOM: Снизу-вверх Сверху-вниз Продольный Как обойти модель DOM снизу-вверх Существует два метода, которые помогут вам перемещаться по модели DOM снизу-вверх: parentElement closest parentElement – это свойство, которое выбирает родительский элемент, например: const ele = document.querySelector("a"); console.log(ele.parentElement); //
parentElement отлично подходит для того, чтобы выбрать элемент, который находится на один уровень выше. Но closest позволяет найти элемент, который может быть на несколько уровней выше текущего. closest позволяет вам выбрать ближайший элемент-предок, который соответствует селектору.  Вот пример с использованием closest:
   

This is sample

   

This is heading

   

This heading 2

const ele = document.querySelector(".heading"); console.log(ele.closest(".demo")); // This is heading В приведенном выше фрагменте кода мы пытаемся получить ближайший элемент к .heading, который имеет класс .demo. Как обойти модель DOM сверху-вниз Мы можем перемещаться вниз, используя метод селектора children. При таком подходе вы можете выбрать прямого потомка нужного элемента.   Вот пример:
   Link-1    Link-2    Link-3    Link-4
const ele = document.querySelector("div"); const child = ele.children; console.log(child); // gives HTMLCollection // 4 element inside div Как обойти модель DOM продольно Это очень интересный вопрос, как же мы можем продольно обойти DOM. В основном мы можем использовать лишь два метода: previousElementSibling nextElementSibling С помощью метода previousElementSibling мы можем выбрать предшествующие элементы в HTML:
   Link-1    

Heading

const ele = document.querySelector("h1"); console.log(ele.previousElementSibling); // Link-1 А с помощью метода nextElementSibling мы можем выбрать последующие элементы в HTML:
   Link-1    

Heading

const ele = document.querySelector("a"); console.log(ele.nextElementSibling); //

Heading

img
Нотация Big O используется в информатике для определения верхней границы алгоритма. В основном она нужна, чтобы рассчитать максимальное время работы алгоритма в зависимости от размера входных данных, но также может применяться для определения объема памяти. В этой статье мы рассмотрим наиболее распространенные типы нотации Big O, используя для иллюстрации концепций праздничные торты. Мы представим, что устраиваем вечеринку, и нам нужно определить, сколько тортов нужно испечь в зависимости от количества присутствующих. O(1) — постоянное время В примере с постоянным временем неважно, сколько человек придет на день рождения, вы испечете только один торт. Поэтому время приготовления торта остается постоянным. Обратите внимание, что в нотации Big O не указывается, сколько длится постоянное время (может быть, на приготовление торта уходит 1 час, а может быть, 4 часа). Она просто указывает, что время, затраченное на это, не увеличивается с ростом числа гостей. Реальный пример операции O(1) - это обращение к массиву по его индексу. Получить элемент из массива, состоящего из 10 элементов, можно так же быстро, как и из массива, состоящего из 1 миллиона элементов. O(log n) — логарифмическое время В примере с логарифмическим временем праздничные торты используются для того, чтобы стимулировать людей приходить на вечеринку вовремя. Первый пришедший получает торт в свое распоряжение. Затем следующие 2 человека делят между собой торт. Затем следующие 4 человека делят торт и так далее. Таким образом, для вечеринки на 1 человека требуется 1 торт. Для вечеринки на 2 или 3 человека требуется 2 торта. Для вечеринки на 4 - 7 человек требуется 3 торта, а для вечеринки на 8 - 15 человек - 4 торта. В общем случае для вечеринки на n человек требуется log2(n) тортов. Наиболее распространенным примером операции O(log n) в реальном мире является бинарный поиск в упорядоченном массиве. Этот алгоритм просматривает середину массива и смотрит, меньше или больше искомое значение. Поскольку список упорядочен, он узнает, в какой половине массива находится искомое значение. Затем он повторяет процесс с этой половиной массива. Таким образом, для массива из 16 элементов первая итерация сужает поиск до 8 элементов, затем до 4, затем до 2 и затем до 1, всего 4, или log2(16), итераций. Наиболее распространенным примером операции O(log n) в реальном мире является бинарный поиск в упорядоченном массиве. Этот алгоритм просматривает середину массива и смотрит, меньше или больше искомое значение. Поскольку список упорядочен, он узнает, в какой половине массива находится искомое значение. Затем он повторяет процесс с этой половиной массива. Таким образом, для массива из 16 элементов первая итерация сужает поиск до 8 элементов, затем до 4, затем до 2 и затем до 1, всего 4, или log2(16), итераций. O(n) — линейное время В примере с линейным временем каждый гость получает свой торт. Если на вечеринку пришло n человек, вам нужно испечь n тортов. Таким образом, затраченное время зависит от количества гостей. Опять же, в нотации Big O не указывается, как долго длится процесс (может быть, на приготовление торта уходит 1 час, а может быть, 4 часа), а просто говорится, что время линейно увеличивается с ростом числа гостей. Реальный пример операции O(n) - это наивный поиск элемента в массиве. В массиве из 10 элементов, в худшем случае, вам придется просмотреть все 10 элементов, чтобы найти тот, который вам нужен. Но для массива из 1 миллиона элементов вам, возможно, придется просмотреть все 1 миллион. Конечно, вы можете найти решение и быстрее, но обозначение Big O указывает максимальное количество времени, которое займет алгоритм. O(n^2) — квадратичное время В примере с квадратичным временем каждый гость получает свой собственный торт. Кроме того, на каждом торте написаны имена всех гостей, а также вкусная глазурь. В этом случае на вечеринке на 1 человека будет один торт с одним именем. Для вечеринки на 2 человека - два торта, на обоих по два имени (всего 4 имени), а для вечеринки на 3 человека - три торта, на каждом из которых по три имени, то есть всего 9 имен. В общем случае для вечеринки на n человек требуется написать n*n имен (также известное как n в квадрате, или n в степени 2), поэтому скорость приготовления тортов (и написания всех имен) зависит от квадрата числа гостей. Реальный пример операции O(n^2) - это наивный поиск дубликатов в массиве. В этом случае вы перебираете все элементы в массиве и для каждого из них снова просматриваете массив на предмет совпадений. Для массива из 10 элементов внешний цикл имеет 10 итераций, и для каждой из них есть 10 итераций внутреннего цикла, итого 100. Для массива из 1 миллиона элементов - 1000 миллиардов. Существует более общий случай O(n^2), когда вместо того, чтобы время относилось к n в степени 2 (n^2), оно относится к n в степени c (n^c). Такое время обычно называют полиномиальным. O(n!) — факториальное время В примере Factorial Time гости участвуют в соревновании по петанку, и победитель забирает домой торт. Правда, есть небольшая проблема: игрок, который делает первый ход, оказывается в невыгодном положении. Чтобы выровнять ситуацию, проводится много игр, чтобы все перестановки гостей были охвачены и каждый получил возможность ходить первым. Все эти перестановки написаны на торте, опять же с помощью вкусной глазури. Это означает, что на вечеринку из двух человек приходится две игры, поскольку каждый гость по очереди ходит первым. На вечеринке из трех человек - 6 игр (если представить, что гости - Анна, Брайан и Крис, то перестановки будут ABC, ACB, BAC, BCA, CAB, CBA). В общем случае для вечеринки на n человек требуется n!, или n факториалов, поэтому скорость приготовления торта зависит от этого. n! вычисляется путем умножения всех целых чисел от n до единицы «n (n - 1) (n - 2) ... 2 1». Таким образом, для вечеринки из двух человек это 2 1, или 2. Для партии из трех человек это 3 2 * 1, то есть 6. Реальные примеры операций O(n!) - это все, что требует анализа списка перестановок, например, задача о путешествующем продавце. Выводы Надеемся, благодаря праздничным тортам нотация Big O стала легче усваиваться! График ниже также хорошо помогает запоминанию, показывая относительную скорость алгоритмов (если есть выбор, то лучше выбрать более быстрый!)          
ЗИМНИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59