Планирование состояний и их переходов
Реализация конечного автомата начинается с выявления его состояний и переходов между ними. Представьте себе конечный автомат, описывающий действия муравья, несущего листья в муравейник:
Описание состояний интеллекта муравья
Отправной точкой является состояние «find leaf», которое остается активным до тех пор, пока муравей не найдет лист. Когда это произойдет, то состояние сменится на «go home». Это же состояние останется активным, пока наш муравей не доберется до муравейника. После этого состояние вновь меняется на «find leaf».
Frontend-разработчик
Ренессанс Кредит, Москва, По итогам собеседования
tproger.ru
Вакансии на tproger.ru
Если состояние «find leaf» активно, но курсор мыши находится рядом с муравьем, то состояние меняется на «run away». Как только муравей будет в достаточно безопасном расстоянии от курсора мыши, состояние вновь сменится на «find leaf».
Обратите внимание на то, что при направлении домой или из дома муравей не будет бояться курсора мыши. Почему? А потому что нет соответствующего перехода
Описание состояний интеллекта муравья
Обратите внимание на отсутствие перехода между «run away» и «go home»
6.1.3. Оценка сложности алгоритмов¶
Для оценки вычислительной сложности алгоритмов необходимо знать и учитывать сложности:
-
используемых структур данных;
-
совокупности различных операций.
В Python имеются (структуры данных), операции над которыми имеют определенную сложность.
Большинство операций со списком/кортежем имеют сложность \(O(N)\) (Таблица 6.1.1).
Операция |
Сложность |
Примечание |
---|---|---|
\(O(1)\) |
||
\(O(1)\) |
||
\(O(1)\) |
Аналогично |
|
\(O(1)\) |
Аналогично |
|
\(O(b-a)\) |
||
\(O(len(…))\) |
Зависит от длины аргумента |
|
\(O(len(…))\) |
Зависит от длины аргумента |
|
\(O(N)\) |
||
\(O(N)\) |
||
\(O(N)\) |
||
\(O(N)\) |
||
\(O(N)\) |
Поиск в списке |
|
\(O(N)\) |
Аналогично |
|
\(O(N)\) |
Точнее \(O(N)\) |
|
\(O(N)\) |
||
\(O(N)\) |
||
\(O(N)\) |
||
\(O(N \log{N})\) |
Направление сортировки не играет роли |
|
\(O(k \cdot N)\) |
По сравнению со списком/кортежем множества большую часть операций выполняют со сложностью \(O(1)\) (Таблица 6.1.2).
Операция |
Сложность |
Примечание |
---|---|---|
\(O(1)\) |
||
\(O(1)\) |
||
\(O(1)\) |
В отличие от списка, где \(O(N)\) |
|
\(O(1)\) |
В отличие от списка, где \(O(N)\) |
|
\(O(1)\) |
||
\(O(1)\) |
В отличие от списка, где \(O(N)\) |
|
\(O(1)\) |
Аналогично |
|
\(O(len(…))\) |
Зависит от длины аргумента |
|
\(O((len(s))\) |
Аналогично |
|
\(O(len(s))\) |
||
\(O(len(t))\) |
||
\(O(len(s)+len(t))\) |
||
\(O(len(s)+len(t))\) |
||
\(O(len(s)+len(t))\) |
||
\(O(len(s)+len(t))\) |
||
\(O(N)\) |
||
\(O(N)\) |
Большинство операций словарей имеет сложность \(O(1)\) (Таблица 6.1.3).
Операция |
Сложность |
Примечание |
---|---|---|
\(O(1)\) |
||
\(O(1)\) |
||
\(O(1)\) |
||
\(O(1)\) |
||
\(O(1)\) |
||
\(O(1)\) |
||
\(O(1)\) |
||
\(O(1)\) |
Аналогично или |
|
\(O(1)\) |
||
\(O(len(…))\) |
Зависит от длины аргумента |
|
\(O(N)\) |
Для всех методов: keys(), values(), items() |
Примечание
Важно выбирать структуру данных, которая была бы оптимальной для конкретной задачи. Например, если приложения будет осуществлять частый поиск информации, словарь даст большую эффективность, при этом, если необходимо просто хранить упорядоченный набор данных — словарь или кортеж подойдут лучше
Например, если приложения будет осуществлять частый поиск информации, словарь даст большую эффективность, при этом, если необходимо просто хранить упорядоченный набор данных — словарь или кортеж подойдут лучше.
Примеры дискретных распределений
Константа. Да, это тоже случайная величина в теории вероятностей. Случайная величина X называется константой, если она принимает лишь одно значение c ∈ R с вероятностью 1
Распределение Бернулли, p ∈
Самое простое распределение. То самое подбрасывание монетки, где у нас есть всего два исхода (то, что монетка может упасть ребром, мы не рассматриваем). Обозначается Ber(p). Имеет параметр p ∈ , где p — вероятность успеха.
Случайная величина X имеет распределение Бернулли с параметром p ∈ , если X принимает значение 1 с вероятностью p и значение с вероятностью 1 − p. Параметр p называется вероятностью успеха
Таблица распределения:
Пишется как: X ∼ Ber(0.5) — это как раз про монетку, X ∼ Ber(1).
Примеры распределения Бернулли в реальной жизни: пол сотрудника, победа спортивной команды, бумага в общественном туалете (либо она есть, либо её нет).
Равномерное распределение на конечном множестве
Случайная величина X имеет равномерное распределение на множестве {a1, a2, . . . , an}, если X принимает каждое значение ai с вероятностью 1/n. Т.е. конечное количество исходов, где каждый из них принимается с одинаковой вероятностью. Таблица распределения имеет следующий вид:
Примеры равномерного распределения в реальной жизни: игральная кость, рулетка
Биномиальное распределение Bin(n, p), n ∈ N, p ∈
Здесь у нас уже два параметра. Случайная величина Y имеет биномиальное распределение с параметрами n ∈ N и p ∈ , если Y = X1 + X2 + . . . + Xn, где X1, X2, . . . , Xn ∼ Ber(p) независимые, т.е. сумма независимых случайных величин с равностью успеха p (с одной и той же вероятностью успеха). Фактически, Y — это количество «успехов» в n независимых испытания Бернулли, от нуля до n
Распределение Пуассона Pois(λ), λ > 0
Параметр лямбда (λ) — это интенсивность (число больше нуля). Чем больше значение λ, тем будет больше вероятность успеха за фиксированный временной интервал (характеризует интенсивность процесса, как часто встречаются успехи в нём)
Случайная величина X имеет распределение Пуассона с параметром λ > 0, если X принимает значения k = 0, 1, 2, . . . с вероятностями:
k! — факториал числа k (произведение всех натуральных чисел от 1 до k включительно)
Является предельным распределением для Bin(n, p) при p → 0, np → λ. Параметр p зависит от n. При n стремящемся к бесконечности (n -> ∞), р будет стремиться к нулю (p -> 0), но при этом np -> λ. Например, у нас есть игра «Морской бой»
Где n- количество ходов (снарядов), а m — количество блоков. Вероятность попасть в один блок (p) будет равна 1/m. Получается биноминальное распределение с такими параметрами можно попытаться аппроксимировать с помощью распределения Пуассона
Примеры распределения Пуассона в реальной жизни: По сути, это будет количество событий, которые произошли за какой-либо временной промежуток, например: количество звонков в call-центре за час, количество рожденных детей за год
Небольшая задачка
На пустынном шоссе вероятность появления автомобиля за30-минутный период составляет 0.95. Какова вероятность его появленияза 10 минут?
Решить её в лоб не получится, т.к.0.95 нельзя просто поделить на три — вероятность встретить автомобиль даже в случае 30 минут не равна единице, но при этом, мы можем встретить не один автомобиль, а два. Или даже три — есть множество комбинаций вероятностей.
Данная задача часто встречается на собеседованиях и интервьюеров больше интересуют ваши рассуждения о процессе решения, будете ли вы усложнять или упрощать решение.
Что сюда можно прикрутить? Условия задачи отлично подходят для распределения Бернулли. Мы можем разделить отрезок 30 минут на три равных, по 10 минут. У каждого отрезка есть случайная величина. Каждая Xi — это бернуллиевская случайная величина с вероятностью наступления успеха p
Вспоминаем таблицу распределения:
Задача сводится к том, что нам нужно найти вероятность успеха р. Получается, что нашу вероятность можно записать так:
P (Xi =1 хотя бы для одного i = 1,2,3) = 0.95
Вероятность того, что мы встретим хотя бы один автомобиль равна единице. НО! Если в событие встроено условие «хотя бы один», будет правильным перейти к дополнительному событию. Здесь мы перемножаем вероятность для xi = 0, которая равняется 1-p.
1 − P(все Xi = 0 для всех i=1,2,3) или же 1- (1-p)3
Таким образом мы получаем:
1- (1-p)3 = 0.95
В итоге, чтобы посчитать вероятность события (р), нам нужно привести формулу к такому виду:
p = 1 − 3√ 1 − 0.95
Кубический корень из 0,05 ≈ 0.37, соответственно, 1 — 0,37 = 0,67
Определение
Категории сами по себе — очень простые конструкции. Категория — это набор объектов и морфизмов между ними. Морфизмы можно рассматривать как однонаправленные стрелки, соединяющие объекты. В общем случае про сущность самих объектов ничего не известно. Теория категорий работает не с объектами, а с морфизмами, точнее — с их композицией.
Используется следующая нотация:
- ObC — объекты категории C;
- HomC(A, B) — морфизмы из A в B;
- g ∘ f — композиция морфизмов f и g.
В определении категории на морфизмы накладываются дополнительные ограничения:
- Для пары морфизмов f и g, если f — морфизм из A в B (f ∈ Hom(A, B)), g — морфизм из B в C (g ∈ Hom(B, C)), то существует их композиция g ∘ f — морфизм из A в C (g ∘ f ∈ Hom(A, C)).
- Для каждого объекта задан тождественный морфизм idA ∈ Hom(A, A).
Существуют два важных свойства, которым должна удовлетворять любая категория (аксиомы теории категорий):
- Ассоциативность композиции: h ∘ (g ∘ f) = (h ∘ g) ∘ f;
- Композиция с тождественным морфизмом: если f ∈ Hom(A, B), то f ∘ idA = idB ∘ f = f.
Категории очень легко и естественно визуализируются как ориентированные графы. В принципе, любой ориентированный граф можно достроить до категории, добавив композиции морфизмов и тождественные морфизмы, если необходимо.
Для любой категории можно определить двойственную категорию (обозначается Cop, в которой морфизмы получены разворотом стрелок исходной категории, а объекты — те же самые. Это позволяет формулировать двойственные утверждения и теоремы, истинность которых не меняется при обращении стрелок.
Объекты и морфизмы не обязательно образуют множества (в классическом смысле из теории множеств), поэтому в общем случае используется словосочетание «класс объектов». Категории, в которых классы объектов и морфизмов всё-таки являются множествами, называются малыми категориями. Далее мы будем работать только с ними.
Что такое конечный автомат?
Конечный автомат (или попросту FSM — Finite-state machine) это модель вычислений, основанная на гипотетической машине состояний. В один момент времени только одно состояние может быть активным. Следовательно, для выполнения каких-либо действий машина должна менять свое состояние.
Конечные автоматы обычно используются для организации и представления потока выполнения чего-либо. Это особенно полезно при реализации ИИ в играх. Например, для написания «мозга» врага: каждое состояние представляет собой какое-то действие (напасть, уклониться и т. д.).
Описание состояний автомата
Конечный автомат можно представить в виде графа, вершины которого являются состояниями, а ребра — переходы между ними. Каждое ребро имеет метку, информирующую о том, когда должен произойти переход. Например, на изображении выше видно, что автомат сменит состояние «wander» на состояние «attack» при условии, что игрок находится рядом.
Примеры непрерывных распределений
Равномерное распределение на отрезке Unif, a < b.
Равномерное распределение обозначается словом Unif (от слова uniform). По сути, это означает, что вы (по аналогии с отрезком в начале блока про непрерывные распределения) равномерно распределили массу.
Случайная величина X имеет равномерное распределение на отрезке , если её плотность f(u) имеет вид:
Примеры равномерного распределения из реальной жизни: Угол поворота стрелки в «Поле Чудес», генераторы (псевдо)случайных чисел, угол выстрела теннисной пушки
Экспоненциальное распределение Exp(λ), λ > 0
Случайная величина X имеет экспоненциальное (показательное) распределение с параметром λ > 0, если её плотность имеет вид:
До нуля у нас будет значение 0, а уже от 0 — экспоненциальное убывание. Чем больше параметр λ, тем функция плотности убывает быстрее.
Примеры экспоненциального распределения в реальной жизни: время до приезда метро, время между покупками в «Пятерочке», срок эксплуатации какой-либо техники, время работы лампочки до перегорания.
Нормальное распределение N (µ, σ2), µ ∈ R, σ > 0
Буквы в параметрах следует читать так: µ — мю, σ — сигма. Случайная величина X имеет стандартное нормальное распределение (или стандартное гауссовское), если её плотность имеет вид:
Её можно привести к такому виду:
Обозначение: X ∼ N (0, 1)
В общем случае Y имеет нормальное распределение (или гауссовское) c параметрами µ ∈ R и σ > 0, если Y = µ + σX, где X ∼ N (0, 1). Изменение параметра X растягивает, либо сжимает функцию плотности. Салатовым, по центру, мы видим стандартное нормальное распределение
Примеры нормального распределения в реальной жизни: отклонение от среднего роста призывников, отклонения от удара футболиста при пенальти (в ворота будет приходить основная часть ударов, но будут и удары мимо — там функция будет затухать)
Алгебра событий
Операция сложения событий означает логическую связку ИЛИ, а операция умножения событий — логическую связку И.
Сложение событий
Суммой двух событий A и B называется событие A+B, которое состоит в том, что наступит или событие A, или событие B, или оба события одновременно. В том случае, если события несовместны, последний вариант отпадает, то есть может наступить или событие A, или событие B.
Правило распространяется и на большее количество слагаемых, например, событие A1 + A2 + A3 + A4 + A5 состоит в том, что произойдет хотя бы одно из событий A1, A2, A3, A4, A5, а если события несовместны — то одно и только одно событие из этой суммы: или событие A1, или событие A2, или событие A3, или событие A4, или событие A5.
Примеров масса:
-
Событие (при броске игральной кости не выпадет 5 очков) состоит в том, что выпадет или 1, или 2, или 3, или 4, или 6 очков.
Событие B1,2 = B1 + B2 (выпадет не более двух очков) состоит в том, что появится 1 или 2 очка.
Событие BЧ = B2 + B4 + B6 (будет чётное число очков) состоит в том, что выпадет или 2 , или 4 , или 6 очков.
Умножение событий
Произведением двух событий A И B называют событие AB, которое состоит в совместном появлении этих событий. Иными словами, умножение AB означает, что при некоторых обстоятельствах наступит и событие A, и событие B. Аналогичное утверждение справедливо и для большего количества событий: например, произведение A1A2A3 … A10 подразумевает, что при определенных условиях произойдет и событие A1, и событие A2, и событие A3,…, и событие A10.
Рассмотрим испытание, в котором подбрасываются две монеты, и следующие события:
-
A1 — на 1-й монете выпадет орел;
Ā1 — на 1-й монете выпадет решка;
A2 — на 2-й монете выпадет орел;
Ā2 — на 2-й монете выпадет решка.
Тогда:
-
событие A1A1 состоит в том, что на обеих монетах (на 1-й и на 2-й) выпадет орел;
событие Ā2Ā2 состоит в том, что на обеих монетах (на 1-й и на 2-й) выпадет решка;
событие A1Ā2 состоит в том, что на 1-й монете выпадет орел и на 2-й монете решка;
событие Ā1A2 состоит в том, что на 1-й монете выпадет решка и на 2-й монете орел.
7 Потерянный брат — последний босс
Это на самом деле вполне возможно, и совсем не надумано. Многие игроки пытались разобраться в основной сюжетной линии основной истории, приходя к выводу, что, проведя столько времени врозь, под влиянием разных людей и событий, два потерянных брата и сестры в конечном итоге будут сражаться друг с другом.
В заставке в конце второго акта Пролога брат или сестра со спокойным и расчетливым выражением лица предстают перед Магом Бездны. Других намеков на то, что они могли стать злыми, не было, но этого было достаточно, чтобы игроки начали выдвигать дикие теории. Кроме того, потерянные братья и сестры, сражающиеся друг с другом, — это хорошо известный образ в играх (например, Кассандра и Алексиос из Assassin’s Creed Odyssey ), так что они могут быть на чем-то.
Состояния
Пример с логгером, с которого мы начинали, реализует работу с write-only состоянием, но хотелось бы использовать состояние и для чтения. Модифицируем тип функции так, чтобы получить обогащённую функцию, работающую с состоянием. Добавим в тип функции один аргумент, обозначающий текущее состояние, а также изменим тип возвращаемого значения (теперь это пара, состоящая из самого значения и изменённого состояния):
Объявим синоним типа для работы с состоянием:
Фиксируем тип состояния и покажем, что является функтором. Нам понадобится вспомогательная функция :
Реализация класса :
Таким образом, обогащённые функции из в , в которых ведётся работа с состоянием, имеют тип , причём — функтор. Попробуем превратить его в монаду, реализовав их композицию:
Отсюда получим реализацию класса . Тождественный морфизм, функция , ничего не делает с состоянием, а просто добавляет свой аргумент в пару-результат:
Функция для чтения состояния должна всегда возвращать текущее состояния, ей не нужны аргументы. Можно сказать, что это морфизм из в в категории Клейсли, поэтому функция должна иметь тип :
Конечно, в реализации можно опустить. Здесь он добавлен для того, чтобы показать эту операцию с точки зрения теории категорий.
Запись состояния, наоборот, принимает новое значение состояния и записывает его. Нам важен только побочный эффект, но не возвращаемое значение, поэтому соответствующий морфизм идёт в обратную сторону, из в , а функция имеет тип :
Реализация работы с состоянием вышла чуть более сложной, чем предыдущие примеры, но на её основе можно создать формальную модель для работы с вводом/выводом. В ней предполагается, что «окружающий мир» реализован в виде некоторого типа , о котором неизвестно никаких подробностей. При общении с внешним миром программа получает на вход объект типа и производит какие-то действия, в результате которых получает нужный ей результат и изменяет внешний мир (например, выводит строку на экран или читает символ из потока ввода). Эту абстрактную концепцию можно реализовать с помощью состояния:
Тип — один из первых, о котором узнаёт начинающий пользователь Haskell, и наверняка сразу встречает пугающее слово «монада». Такой упрощённый взгляд на этот тип как на состояние для работы с внешним миром может помочь понять, почему это так. Кончено, это описание очень поверхностно, но полноценный рассказ о том, как на самом деле реализован ввод-вывод, зависит от компилятора и выходит далеко за рамки статьи.
Пара слов о WCF
Windows Communication Foundation (WCF) – это SDK (Software Development Kit), комплект средств для разработки и развертывания веб-служб для Windows. Иными словами, WCF – технология Microsoft, позволяющая разрабатывать сервис-ориентированные приложения и микросервисы.
Цель WCF – предоставить универсальную программную модель для построения распределенных приложений, позволить разрабатывать приложения, независимые от нижележащих технологий, использовать их для соединения служб и программ вместе. Эта достаточно сложно, если не невозможно: полностью отделить программную структуру приложения от коммуникационной инфраструктуры. Однако WCF позволило приблизиться к этой цели.
Клиенты и службы взаимодействуют через передачу сообщений. Сообщения могут передвигаться напрямую от службы к клиенты, или через посредников. В WCF все сообщения – это SOAP-сообщения. WCF-службы в отличие от базовой идеологии Web-служб могут работать через различные транспортные протоколы, не только через HTTP. WCF-клиенты могут работать с не-WCF-службами, так же как WCF-службы могут работать с не-WCF-клиентами.
Так как реализация службы скрыта от среды, WCF также предоставляет средства для демонстрации мета-данных, описывающих доступную функциональность служб и возможные пути коммуникации. Метаданные публикуются определенным, технологически-нейтральным способом, например, с использованием WSDL через HTTP, или через специальные стандарты обмена метаданными.
Поддержка сервис-ориентированности – одна из основных целей разработки WCF, и это включает:
- Доступ к схеме, а не к классу. В отличие от других технологий распределенной коммуникации службы взаимодействуют с клиентами через хорошо описанный интерфейс. Он скрывает все детали реализации службы.
- Службы и клиенты взаимодействуют через один интерфейс, однако они полностью независимы. Они могут быть написаны на разных языках, в разных средах, выполняться на разных ОС, иметь еще сотни отличий, но все же прекрасно взаимодействовать.
- Явные границы. Целью моделей распределенных объектов, так как, например, DCOM было представление удаленных объектов такими же, как и локальных. С одной стороны, это упрощало разработку, но с другой стороны, это скрывало неизбежные отличия между удаленным и локальным объектами. WCF устраняет эту проблему и делает взаимодействие между клиентом и службой более явным, не стараясь скрывать факт распределенности.
- Совместимость на основе соглашений и политик. Взаимодействие между программными системами строится на таких механизмах и стандартах, как WSDL или WS-Policy.
Для поддержки базовой технологии коммуникации WCF реализует т.н. WS-* спецификации веб-служб. Эти спецификации были созданы рабочими комитетами W3C, которые состояли из специалистов Microsoft, IBM, BEA и других поставщиков. Спецификации поддерживают несколько направлений, такие как: базовая передача сообщений, безопасность, надежность, управление транзакциями и работа с мета-данными служб:
- Сообщения. SOAP — это основной протокол для веб-служб, описывающий структуру заголовков и тел сообщений. Стандарт WS-Addressing определяет дополнительные SOAP заголовки для адресации сообщений, которые освобождают SOAP от зависимости от нижележащих протоколов. Механизм оптимизации передачи сообщений (Message Transmission Optimization Mechanism (MTOM)) определяет оптимизированный формат SOAP-сообщений. Он основан на спецификации XOP (XML-binary Optimized Packaging).
- Метаданные. Язык описания веб-служб описывает язык для спецификации служб и некоторые аспекты их использования. WS-Policy определяет динамические аспекты поведения служб, которые не могли быть описаны через WSDL. WS-MetadataExchange позволяет клиентам через SOAP запрашивать описание службы.
- Безопасность. WS-Security, WS-Trust и WS-SecureConversation дополняют SOAP-сообщения информацией об аутентификации, целостности, конфиденциальности данных и о других аспектах безопасности.
- Надежность. WS-ReliableMessaging определяет дополнительные SOAP-заголовки для обеспечения надежности коммуникации.
- Управление транзакциями. Служба, построенная на базе WS-Coordination и WS-AtomicTransaction, позволяет использовать ACID-транзакции при SOAP-обмене сообщениями.
5 Алиса может быть в другом измерении
Алиса — мать Клее, и ее нигде нет в Тейвате. Различные персонажи неоднократно намекали на ее личность и действия в игровом мире. Помимо материнства Клее, она также была вовлечена в культуру Тейвата, написав гайд по Тейвату.
По словам Клее, Алиса бросила ее за три года до встречи со Странником и уехала «куда-то далеко и опасно». Это привело к тому, что фанаты выдвинули теорию о том, что в настоящее время она может находиться в другом измерении и еще не сыграла ключевую роль в основной истории Genshin Impact . Что касается текущей версии Genshin Impact , голос Алисы был услышан только один раз во время ограниченного по времени мероприятия, в записанном сообщении, которое она оставила Клее во время события «Приключения на острове летнего солнцестояния».
8 Есть восьмой элемент
Главный принцип Тейвата — это Дело в том, что семь элементов управляют законами страны. Однако, пока Орден Бездны был частью Genshin Impact s Многие фанаты предполагали, что в мире есть гораздо больше, чем семь основных элементов.
Возможно, самый влиятельный из этих потенциальных «восьмых элементов» происходит от персонажей Дайнслейфа и его брата-путешественника, который возглавляет Орден Бездны. Из-за загадочных свойств этих способностей ни один игрок не смог успешно определить, из какого элемента они исходят; как таковой, это привело к тому, что многие игроки стали строить теории о том, что таинственный элемент связан с Хаэнри, ах, возможно, даже являясь причиной Катаклизма.
Помимо этого неизвестного элемента, некоторые игроки даже предполагают что этот элемент может быть связан с силами Колли в манге Genshin Impact , которые, похоже, существуют за пределами 7 элементов игры. Однако в настоящий момент это не подтверждено.
6.1.2. Асимптотические нотации¶
Асимптотическая сложность алгоритма описывается соответствующей нотацией:
-
О-нотация, \(O\) («О»-большое): описывает верхнюю границу времени (время выполнения «не более, чем…»);
-
Омега-нотация, \(\Omega\) («Омега»-большое): описывает нижнюю границу времени (время выполнения «не менее, чем…»).
Например,
\
говорит о том, что алгоритм имеет квадратичное время выполнения относительно размера входных данных в качестве верхней оценки («О большое от эн квадрат»).
Каждая оценка при этом может быть:
-
наилучшая: минимальная временная оценка;
-
наихудшая: максимальная временная оценка;
-
средняя: средняя временная оценка.
При оценке, как правило, указывается наихудшая оценка.
Примечание
Допустим, имеется задача поиска элемента в массиве. При полном переборе слева направо:
-
наилучшая оценка: \(O(1)\), если искомый элемент окажется в начале списка;
-
наихудшая оценка: \(O(N)\), если искомый элемент окажется в конце списка;
-
средняя оценка: \(O \left ( \cfrac{N}{2} \right ) = O(N)\).