Понятие функции

Чтобы выбирать наиболее эффективный алгоритм, нужно научиться оценивать, сколько он потребляет ресурсов. Для этого вспомним, что такое функция в математике.
Функция — это соответствие между элементами двух множеств, при котором каждому элементу одного множества соответствует некоторый элемент другого множества. Например, y=xy = xy=x, y=x2y = x^2y=x2 или y=x3y = x^3y=x3.
Есть множество XXX и множество YYY. Функция f(x)f(x)f(x) задаёт правило: как по значению из множества XXX получить соответствующее значение из множества YYY.
Чтобы нарисовать график функции, можно взять несколько значений xxx, посчитать для каждого из них yyy, отметить на плоскости соответствующие точки и соединить их линией. Для графика прямой достаточно двух точек. В других случаях их может потребоваться больше.
Для функции y=xy = xy=x значения xxx и yyy совпадают. Через точки (0,0)(0, 0)(0,0) и (1,1)(1, 1)(1,1) можно провести прямую. При построении графиков удобно использовать таблицу значений.
image
На графике этой функции видно, что любая точка, для которой xxx и yyy равны, будет лежать на прямой.
image
Чтобы получить yyy для квадратичной функции y=x2,y = x^2,y=x2, нужно возвести значение xxx во вторую степень. Снова применим таблицу значений. Здесь двух точек для построения графика не хватит.
image
На основе таблицы получаем график:
image
Составим таблицу значений для кубической функции y=x3y = x^3y=x3:
image
Теперь построим график:
image
Функции применяются не только в математике. Каждой стране соответствует столица, каждой точке на поверхности планеты однозначно соответствуют ее широта и долгота. Это тоже примеры функций.
Когда зависимость yyy от xxx можно описать уравнением y=kx+by=kx+by=kx+b, получаем линейную функцию.
y=xy=xy=x — частный случай такого уравнения при k=1k=1k=1 и b=0b=0b=0.
Если зависимость у от х имеет вид y=ax2+bx+cy=ax^2+bx+cy=ax2+bx+c, имеем дело с квадратичной функцией.
y=x2y=x^2y=x2 — это её частный случай при a=1,b=0,c=0a=1, b=0, c=0a=1,b=0,c=0.
Когда уравнение зависимости у от х принимает вид y=ax3+bx2+cx+dy=ax^3+bx^2+cx+dy=ax3+bx2+cx+d, функция кубическая. y=x3\\y=x^3y=x3 — её частный случай при a=1,b=c=d=0.a=1, b=c=d=0.a=1,b=c=d=0.
Рассмотрим рисунок с тремя графиками. Представим, что функции показывают, как время работы алгоритмов зависит от размера входных данных.
Алгоритм с линейной зависимостью работает быстрее, то есть мы скорее получим ответ на интересующий нас вопрос. При увеличении размера входных данных объём выполняемых операций растёт не так быстро, как для двух других функций.
image
Убедимся в этом на примерах.
image
Для линейной функции y=2y=2y=2 при x=2, x=2, \ x=2,  y=4y=4y=4 при x=4x=4x=4. Значение yyy изменилось всего на два.
В квадратичной функции y=4y=4y=4 и 161616 при тех же значениях xxx. Изменение уже более существенное.
Для кубической функции при x=2x=2x=2, y=8y=8y=8, а при x=4x=4x=4, y=64y=64y=64. Разница ещё больше.
Квадратичная функция растёт быстрее, а кубическая — ещё быстрее. Это наглядно отражено на графике.
Рассмотрим несколько примеров, которые продемонстрируют, время работы каких алгоритмов может, таким образом, зависеть от размера входных данных.
В больнице, в которую обычно ходит Гоша, работает доктор Игнатий Петрович. Он не очень общительный и часто весь день не покидает кабинет. Заходят к нему только пациенты.
Нужно определить, сколько раз в день откроется дверь в кабинет Игнатия Петровича при условии, что все пациенты, уходя, закрывают её за собой.
Каждый посетитель кабинета откроет дверь два раза. То есть количество открытий двери будет вдвое больше, чем количество вошедших. Получаем линейную зависимость, которую можно задать уравнением: y=2⋅xy=2\cdot xy=2⋅x, где yyy обозначает, сколько раз будет открываться дверь, а xxx — количество вошедших.
Другой пример. Тимофей утром встретил в лифте трёх коллег. Все поздоровались за руку. Но если людей много, так обычно не делают. Это заняло бы слишком много времени, ведь каждый должен пожать руку каждому. Здесь зависимость квадратичная. Давайте разберёмся почему.
image
Предположим, всего nnn человек. Каждый будет здороваться со всеми, кроме себя самого, то есть n−1n-1n−1 раз.
Кажется, чтобы посчитать общее количество рукопожатий, можно воспользоваться следующим алгоритмом:
Скопировать кодPYTHON
# people - массив с именами всех встретившихся людей handshakes_number = 0 for i in range(len(people)): for j in range((len(people)): if i != j: handshakes_number += 1
Но при таком способе подсчёта каждое рукопожатие будет посчитано два раза: первый — за счет прохода по всем значениям массива счетчиком iii, второй — счетчиком jjj. Ведь Петя здоровается с Васей и Вася с Петей — это одно рукопожатие. То есть получившееся значение переменной handshakes_number нужно разделить на 2:
Скопировать кодPYTHON
handshakes_number /= 2
Всего получается n⋅n−12=n2−n2 \displaystyle n \cdot \frac{n-1}{2} = \frac{n^2-n}{2}n⋅2n−1​=2n2−n​ рукопожатий, то есть зависимость квадратичная.
Вы вспомнили основы функций и поняли, что желательно выбирать алгоритм, сложность которого имеет наименьшую скорость роста.
Эффективность алгоритмов могут оценивать не только линейной, квадратичной и кубической, но и другими видами зависимостей.
Далее вас ждут задания. В процессе их выполнения вы ненадолго снова почувствуете себя школьниками!
Ребята часто играют вместе в футбол. Тимофей не то чтобы играет лучше Георгия, просто обычно ему везёт с командой, не жмут кроссовки и не светит в глаза солнце. Каждый матч он забивает на три гола больше Гоши. Выберите функцию, которой можно описать зависимость количества голов, забитых Тимофеем, от количества голов, забитых Георгием.
Сколько голов забил Тимофей за 2 матча, если в первом из них Гоша забил 2 гола, а во втором — ни одного?
Обычно после зарплаты Алла покупает лотерейные билеты компании «Котаны». Билеты дорожают каждый день. Зависимость сегодняшней стоимости лотерейного билета от вчерашней задаётся формулой: y=x+0,01x2+5y=x+0,01x^2+5y=x+0,01x2+5. Сегодня билет стоит 150 рублей. Но зарплата только завтра! За сколько Алла сможет купить билет?
Зависимость времени прихода Риты на работу от количества просмотренных вчера вечером сериалов выражается функцией:
y=x2+3x+19x+2\displaystyle y=\frac{x^2+3x+19}{x+2}y=x+2x2+3x+19​.
Во сколько Рита придёт на работу завтра, если сегодня у неё отключили интернет, и смотреть сериалы не получится?