Часть 0.1. Поясняю за структуры данных (часть 1)

Привет, меня зовут Артем и я люблю программировать. Надеюсь, вы прочитали предыдущую, нулевую статью.

Что бы стать хорошим программистом (не веб-разработчиком, а хорошим программистом), вы в первую очередь должны понять, что программирование – это манипуляция данными. И то, насколько вы хорошо умеете обращаться с данными в зависимости от поставленной задачи, определяет, сможете ли вы создавать хорошие программы или нет. В интернете уже есть куча материала на тему структур данных и алгоритмов, но я попробую расписать весь этот материал по-своему. Возможно, это поможет кому-то лучше понять эту тему.


Сложность алгоритма
Часть 0.1. Поясняю за структуры данных (часть 1)

Начнем с определения понятия «сложность алгоритма» — это нам пригодится тут и в следующей статье про алгоритмы.

Если говорить простыми словами – то сложность алгоритма – это то, сколько действий нужно совершить данному алгоритму, чтобы выполнить определенную задачу. Чем больше действий нужно алгоритму, тем он сложнее, и тем он хуже (если существуют альтернативные алгоритмы с меньшей сложностью).


Например, представим ряд чисел – 12345. Нам нужно инвертировать порядок этих чисел (переставить числа так, чтобы вышло 54321). Представим, что алгоритму №1 нужно совершить 5 действий, чтобы переставить числа, а алгоритму №2 – 10. Из этого можем сделать вывод, что в данном случае алгоритм №1 будет предпочтительней для нас.


Но это говоря простыми словами. В реальности на выбор алгоритма также влияет то, сколько памяти он занимает в процессе работы (например, у алгоритма высокая сложность, но он кушает мало памяти, и для устройств с малым количеством оперативной памяти лучше реализовать его), сложность реализации алгоритма (например, мы знаем, что алгоритм «быстрой сортировки» быстрее, чем алгоритм «сортировки пузырьком». Но у вас в компании работают только веб-программисты, которые написать алгоритм быстрой сортировки не смогут. Поэтому вам ничего не остается, кроме реализации алгоритма «сортировки пузырьком») и требования алгоритма к железу (в основном это алгоритмы для нейросетей, которые работают на видеокартах. Например, что бы прогнать картинку 512х512 пикселей через нейросеть типа ESRGAN, вам потребуется видеокарта, у которой не менее 2 ГБ видеопамяти).


Сложность алгоритма обозначается большим О. Например, O(1), O(n), O(n!). И тут все сложна легко. Вспоминаем математику, на которой ты стрелял в друга скомканными шариками из ручки, что значение функции может зависеть (или не зависеть) от определенных параметров этой функции. Например, функция 1 = n (это то же самое, что и O(1)) говорит, что независимо от значения n результат всегда будет 1. Функция y = n! (это O(n!)) означает, что результат (это y) будет равняться значение n факториал (не путать с фракталом). То есть, если у нас 5 чисел, то алгоритм сложностью O(n!) сделает 1 * 2 * 3 * 4 * 5 операций (посчитай сам, сколько это).


Лично мне нравиться эта табличка, которую я нашел в группе /dev/null в ВК

Другой взгляд на О большое:


O(1) = O(уууее)

O(log n) = O(да)

O(n) = O(к)

O(n^2) = O(йблин)

O(2^n) = O(нет)

O(n!) = O(МГ!)


Как это связано со структурами данных? Структуры данных и алгоритмы очень тесно связаны, и у каждой структуры есть свои алгоритмы обхода элементов структуры, их добавление\удаление, поиск в структуре и т.д. И поэтому важно знать сложность алгоритмов, которые дают нам возможность управлять этой структурой, что бы выбрать подходящую для решения нашей задачи.


Со сложностью алгоритмов вроде разобрались. На практике для каждой задачи есть несколько решений, и вы сами, как программист, вольны выбрать то, которое подходит именно под вашу ситуацию.

В следующей статье я попробую рассказать о структурах данных, зачем они нужны и рассмотреть такие структуры, как стек, очередь и связанный список.


После прочтения данного текста можете заглянуть в комментарии - там могут дополнить материал или исправить ошибки в данном материале.

Лига программистов

2.1K постов11.9K подписчика

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества

6
Автор поста оценил этот комментарий

> Если говорить простыми словами – то сложность алгоритма – это то, сколько действий нужно совершить данному алгоритму, чтобы выполнить определенную задачу. Чем больше действий нужно алгоритму, тем он сложнее, и тем он хуже (если существуют альтернативные алгоритмы с меньшей сложностью).


Нет, перед тем, как кого-то учить, выучись сам. Сложность не про количество действий, не про скорость и не про лучшесть, сложность показывает, как будет расти время выполнения алгоритма с увеличением входных данных(N).


def alg1(n):

__for i in range(n):

____do_something_in_constant_time()


def alg2(n):

__for i in range(n):

____do_something_in_constant_time()

____do_something_else_in_constant_time()


Оба алгоритма O(N), но первый делает меньше действий.

раскрыть ветку
3
Автор поста оценил этот комментарий

а я если я веб, но на джаве, я могу считаться программистом?

или если я на пыхе держу довольно высоконагруженный бекенд для приложений?


блин, после таких утверждений начинаешь считать себя каким-то не доразвитым, что-ли (


p.s. к сожалению, или к счастью, по сруктурам данных и алгоритмам читал Кнута, намного интереснее сией статьи

раскрыть ветку
3
Автор поста оценил этот комментарий

"рассказать об структурах данных"

Нинада.

Во-первых, элементарная грамотность сначала нужна, чтобы просвещать других. А у тебя таких ошибок в каждом посте немало.

Во-вторых, Википедию подвезли? Нуууу, хорошо. Но зачем?

раскрыть ветку
1
Автор поста оценил этот комментарий
Интернет пришёл в колхоз.
1
Автор поста оценил этот комментарий

И опять вброс говна, в сторону веб-программистов.

Напомню, что в прошлом посте автор упомянул, что:
"Также проектов, связанных с веб-разработкой, будет очень мало, ибо я не считаю чистое веб-программирование (я подразумеваю знание HTML\CSS\JS и/или какого-нибудь ASP или Node.js) - программированием".


В этом, он утверждает, что:

"например, мы знаем, что алгоритм «быстрой сортировки» быстрее, чем алгоритм «сортировки пузырьком». Но у вас в компании работают только веб-программисты, которые написать алгоритм быстрой сортировки не смогут. Поэтому вам ничего не остается, кроме реализации алгоритма «сортировки пузырьком»".


Ну, какого хрена? Веб-программисты создают веб-ПРИЛОЖЕНИЯ! Приложения! На любом языке - C#, C, C++, PHP - плевать на язык. Веб-приложение отличается от обычного только способом взаимодействия с пользователем. Поясняю - я могу взять код ASP.Net приложения, и перенести его в классический WinForms проект, без каких-либо правок (просто добавив обёртки для вызовов методов при взаимодействии с формой). И наоборот точно так же.

В веб-программировании используются ВСЕ те же самые приёмы, что и в обычном.

раскрыть ветку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества