Чи варто продовжувати інвестувати в структури даних та алгоритми? [зачинено]


28

Сьогодні я інвестую великі кошти в структури даних та алгоритми і намагаюся вирішити деякі головоломки програмування.
Я намагаюся кодувати і вирішувати за допомогою Java та Clojure.

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

Вивчаючи структури даних та алгоритми, чи стану я кращим програмістом, або ці теми важливі лише в роки коледжу?


5
З якими структурами даних та алгоритмами ви працюєте? Які головоломки програмування ви використовуєте?
oosterwal

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

Відповіді:


24

Цілком можливо провести більшу частину / всю свою кар’єру, роблячи значну, корисну роботу, лише мінімально знаючи алгоритми та структури даних.

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

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

Немає * максимуму * . Якщо ви хочете, ви можете перенести своє дослідження на рівень доктора філософії та за її межами. Це корисність безпосередньо пов'язана з тим видом роботи, який вам цікавий, і з тим, який вид роботи ви вважаєте найбільш цікавим і корисним.

Це говорить про те, що, як груба (але не абсолютна) настанова, чим більш низьким, тим більш ресурсомістким і менш автоматизованим буде мова, рамки та додатки, над якими ви працюєте, тим вище необхідний рівень кваліфікації, якщо мова йде про до алгоритмів та структур даних. Наприклад, реалізація алгоритму Укконена в збірці, ймовірно, але не обов'язково, означатиме, що ви хочете зрозуміти рівнем майстра алгоритму та структури даних, що займаються.

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


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

1
Фу, писати алгоритм Укконена в Python досить важко, я навіть можу почати уявляти, як це робити в зборах.
rjzii

2
Це підпадає під точку "порівняння алгоритмів", але я просто хотів уточнити, що ви повинні знати компроміс між просторовою та часовою складністю. Багато алгоритмів, які зазвичай використовуються на настільних комп’ютерах через їх швидкість, можуть не бути здійсненими на iOS, оскільки вони вимагають великих структур даних.
Карл Білефельдт

3
Я не погоджуюсь. Проста причина - коли хтось витрачає час на вивчення алгоритмів чи проектування чи архітектури, мова йде не лише про те, коли / де він збирається ним користуватися. Це просто робить людину розумнішою, і він може використовувати навчання під час вирішення інших проблем. Це також заохочує почуття робити справи оптимально. Наприклад, наприклад. може бути не зроблений власноруч алгоритм, але оскільки ви знаєте багато речей, ви можете прийти з чимось винятковим самостійно.
Geek

14

Ні. Якщо ви тільки починаєте, то намагаєтесь увійти в такі великі зображення, як програмування інтерфейсу користувача, і таке просто стримує вас. Врешті-решт вам потрібно піти туди та вивчити більші рамки ... як використовувати структури даних та алгоритми, які написали ДРУГІ люди. Коли ви тільки починаєте, хоча добре дотримуватися обмежених проблем.

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

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


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

9

Ти не витрачаєш часу.

Якщо під час роботи вам потрібно буде скористатися інструментом або рамкою, яку ви раніше не використовували, ви дізнаєтесь її та використаєте.

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

Я намагаюся сказати, що це такі речі, які ви не просто навчитесь робити, вам потрібно це навчитися, навчаючись або в академічній ситуації, або за допомогою особистого інвестування зусиль, як ви роблять зараз.


6

На практиці знайте, що є наявними структурами даних, які їх характеристики складності, де отримати хороші їх реалізації та де зберігати свою копію Введення в алгоритми, щоб пізніше переглянути деталі.


1

Якщо саме це робить вас щасливими, то ви обов'язково повинні дотримуватися цього. Якщо ви переживаєте, що ви не застосовуєте достатньо теорії, розгляньте важко теоретичний проект. Побудуйте з нуля невелику мову програмування, наприклад, зілля . Повна реалізація використовує таблиці Hash, графіки, дерева та величезний масив алгоритмів. Якщо це здається цікавим, ви можете зануритися в оптимізацію, генерацію коду або розширення користувача.

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

Вниз у кролячій норі, Дороті!


1

Я провів багато часу на злому в C / C ++ з OpenGL. Я досить добре знаю мови та API ... І завдяки цьому досвіду я став розумним розробником та програмістом. З цього приводу, власне алгоритмічні знання, необхідні для вирішення різних проблем, що виникли, я лише справді зміг зрозуміти.

Якщо говорити з особистого досвіду, зосередження уваги на створенні програм буде марною витратою вашого часу, якщо ви не знаєте теорії проблемних доменів, які стосуються того, що ви намагаєтеся створити.

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

Вам не обов’язково ставати комп'ютерним чарівником, що стоїть за усім, але робити те, що ви робили під час цієї посади, це дуже і дуже потрібний шлях, щоб хоч раз спуститися в програмування - незалежно від того не вони самоучки.


0

Я думаю, якщо ви їх не знаєте добре, тоді ви не знайдете причин використовувати їх. Я, здається, постійно знаходжу для них використання. Але я мушу визнати, що з поліпшенням дженериків за останні півтора десятка років або близько того потреба переказувати власні виникає все рідше і рідше. Це все ще не усуває переваги того, як і коли їх використовувати, і вони можуть значно спростити інакше складний код.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.