Должен ли я продолжать инвестировать в структуры данных и алгоритмы? [закрыто]


28

В эти дни я вкладываю большие средства в структуры данных и алгоритмы и пытаюсь решить некоторые задачи программирования.
Я пытаюсь кодировать и решать с помощью Java и Clojure.

Я трачу свое время? я должен больше инвестировать в технологии и структуры, которые я уже знаю, чтобы получить более глубокие знания (входы и выходы) и иметь возможность кодировать с ними быстрее?

Изучая структуры данных и алгоритмы, стану ли я лучше программистом или эти предметы важны только в студенческие годы?


5
С какими структурами данных и алгоритмами вы работаете? В каких головоломках вы их используете?
oosterwal

Я работаю / еще работаю над хэш-таблицами, картами, кучами, графиками, деревьями и сопутствующими алгоритмами (обход, хеширование, поиск, вставка, удаление и некоторые алгоритмы сортировки). Головоломки от соревнований TopCoder и Google Code Jam.
Хирон

Ответы:


24

Вполне возможно потратить большую часть / всю вашу карьеру на значительную полезную работу с минимальным знанием алгоритмов и структур данных.

Минимальный уровень знаний алгоритмов и datastructures, для того , чтобы быть успешным, потребует от вас:

  • знать о большинстве из них (в том числе время от времени читать новые)
  • знать, где найти хорошие, проверенные, работающие реализации
  • уметь сравнивать алгоритмы и их полезность
  • быть в состоянии правильно скопировать один из примера с открытым исходным кодом в вашу конкретную среду, с небольшим количеством настроек

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

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

В вашей конкретной ситуации, переходя от фона разработки Java к работе с iO, при прочих равных условиях, вы ожидаете немного более высокого требования к вашему общему пониманию алгоритмов и структур данных. Вы захотите иметь возможность эффективно работать на устройстве с меньшим количеством доступных ресурсов. Кроме того, ожидайте добавить пару новых категорий в свой арсенал - особенно, вы захотите узнать больше об управлении памятью.


2
Полностью согласен. Мне почти никогда не приходится иметь дело с алгоритмами напрямую, поскольку подавляющее большинство из них уже включены в базовые библиотеки. Но у меня были бы проблемы, если бы я не понимал характеристики производительности достаточно, чтобы выбрать подходящий алгоритм или структуру для конкретного случая использования. OP, если вы не хотите работать в алгоритмах, вы можете получить много, много , много большую отдачу от инвестиций времени , потраченного изучение других библиотек и инструментов и методов.
Квентин-старин

1
Тьфу, написание алгоритма Укконена на Python достаточно сложно, я даже могу себе представить, как это делается на ассемблере.
rjzii

2
Это попадает в точку «сравнения алгоритмов», но я просто хотел пояснить, что вы должны знать компромисс между пространством и временем. Многие алгоритмы, которые обычно используются на настольных компьютерах из-за их скорости, могут быть неосуществимы на iOS, поскольку требуют больших структур данных.
Карл Билефельдт

3
Я не согласен. Простая причина в том, что когда кто-то тратит время на изучение Алгоритмов, Проектирования или Архитектуры, речь идет не только о том, когда и где он собирается их использовать. Это только делает человека умнее, и он может использовать обучение, решая другие проблемы. Это также стимулирует чувство оптимальной работы. Например, Алгоритм ручной работы может быть не для всех, но, поскольку вы знаете много всего, вы можете прийти с чем-то исключительным самостоятельно.
Компьютерщик

14

Неа. Если вы только начинаете, то пытаетесь разобраться с такими вещами, как программирование пользовательского интерфейса, и это просто удерживает вас. В конце концов вам нужно идти туда и изучать более крупные структуры ... как использовать структуры данных и алгоритмы, которые написали ДРУГИЕ люди. Когда вы только начинаете, хорошо придерживаться ограниченных проблем.

Алгоритмы и структуры данных являются основой всего, даже если вы, вероятно, никогда не напишите свой собственный, когда пройдете начальный этап. Знание их или, по крайней мере, знание их, в конце концов, сделает вас лучшим разработчиком. Вы будете знать, когда и зачем использовать каждый из них, потому что вы будете знать, КАК они работают. Кроме того, сделать ваши алгоритмы и структуры данных общими, чтобы они могли работать с любым типом или типом с интерфейсом X, действительно то, что вы будете использовать до конца своей карьеры.

Я вижу слишком много людей, прыгающих в такие вещи, как Qt, которые в конечном итоге задают вопросы, которые показывают нулевое знание C ++ (например). Они пытаются пропустить слишком много шагов, и, в конце концов, им нужно больше времени, чтобы учиться. Я бы сказал, что вы на правильном пути.


Я профессионально занимаюсь программированием на Java (имею в виду занятость) с 2007 года. Теперь я собираюсь (по крайней мере, надеюсь) заняться разработкой для iOS.
Хирон

9

Ты не тратишь свое время.

Если в ходе вашей работы вам понадобится инструмент или фреймворк, который вы ранее не использовали, вы изучите его и будете его использовать.

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

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


6

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


1

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

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

Вниз по кроличьей норе, Дороти!


1

Я потратил много времени на взлом C / C ++ с OpenGL. Я достаточно хорошо знаю языки и API ... и благодаря этому опыту я стал разумным разработчиком и программистом. Тем не менее, фактические алгоритмические знания, необходимые для решения различных проблем, с которыми я столкнулся, я только что смог понять.

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

Для многих различных видов программного обеспечения эти области будут основываться на основах, которые вы изучаете при изучении алгоритмов, в дополнение к их собственной теории, основанной на определенной нише (например, линейная алгебра в компьютерной графике, теория чисел / информации в криптографии и т. Д.).

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


0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.