Я просматривал свои заметки и наткнулся на реализацию различных алгоритмов сортировки.
Когда я попытался осмыслить реализацию QuickSort и MergeSort, мне пришло в голову, что, хотя я занимаюсь программированием для жизни и считаю себя порядочным в том, что я делаю, у меня нет ни фотографической памяти, ни просто умственных способностей для реализации этих алгоритмов без опираясь на мои заметки. Все, что я помнил, это то, что некоторые из этих алгоритмов стабильны, а некоторые нет. Некоторым требуется время O (nlog (n)) или O (n ^ 2). Некоторые используют больше памяти, чем другие ...
Я чувствую, что я не заслуживаю такой работы, если бы не было, потому что моя позиция не требует, чтобы я использовал какой-либо алгоритм сортировки, кроме тех, которые есть в стандартных API. Я имею в виду, у кого из вас есть должность программиста, где на самом деле важно, чтобы вы могли помнить или придумывать подобные вещи самостоятельно?
источник
Ответы:
Давайте спросим Альберта и посмотрим, что он скажет по этому вопросу:
Аминь, брат Альберт, аминь.
Проведя хороший обзор основных алгоритмов в любой конкретной дисциплине (сортировка, поиск и т. Д.), Вы можете забыть о деталях реализации до тех пор, пока вам действительно не понадобится алгоритм, и в этом случае вы посмотрите его или воспользуетесь существующая библиотека 25 лет назад я построил крупную поисковую систему с использованием B * -деревьев, но сегодня мне понадобится RTFM, чтобы хорошо их использовать.
источник
O(n log n)
, но если вы получите много ошибок в кеше или (не дай бог) попадете на диск, тогда этоn log n
будет просто приятная память.Это не вопрос запоминания. Это вопрос глубокого понимания общих классов алгоритмов, таких как разделяй и властвуй. Если вы действительно понимаете «разделяй и властвуй», вам не нужно запоминать быструю сортировку. Вы можете восстановить его на месте по мере необходимости. Более того, реальная отдача заключается даже не в том, что вы можете самостоятельно восстановить быструю сортировку, а в том, что вы можете распознать, когда новая проблема поддается решению «разделяй и властвуй».
Не все задания по программированию одинаковы. Некоторым работам нужны глубокие знания алгоритмов, некоторым нужны люди, которые понимают теорию типов, а некоторым просто нужны люди, которые могут очищать данные из веб-формы и перемещать их в базу данных. Некоторые задания даже требуют всех этих навыков одновременно. На какой работе вы хотите работать?
источник
Я думаю, что единственное время, когда вам нужно все это помнить, - это когда вы подаете заявление на работу, когда вы должны придумывать ответы на месте и не иметь внешних ресурсов.
У меня были коллеги, которые переписывали быструю сортировку и еще много чего, но я продолжаю говорить им, чтобы они вернулись к использованию встроенных функций сортировки, которые есть в языке. Я знаю, что в зависимости от того, над какими типами проектов мы работаем, мы должны помнить другие алгоритмы, поскольку они обычно не включаются в стандартные библиотеки, но сортировка не подходит, поскольку она обычно встроена в язык.
Когда нам нужно запомнить эти алгоритмы, мы обычно обращаемся к google или книге, и обычно это не поиск конкретной реализации, а то, что было бы лучшей реализацией для нашей проблемы.
источник
Просто помнить, какой алгоритм полезен в каких сценариях, будет более чем достаточно, чтобы помочь во время вашей работы. Фактически, большинство заданий программирования не требуют запоминания подхода, скорее, они заинтересованы в вашем способе распознавания алгоритмического паттерна, когда сталкиваются с проблемой .
На самом деле, в большинстве блогов / статей по программированию имеется масса информации по темам алгоритмов. Таким образом, запоминание точной реализации не имеет значения. Наиболее ценной информацией было бы получить базовое представление о том, какие типы алгоритмов доступны, и какие конкретные проблемы они хорошо решают . Поиск точной реализации, когда вы знаете, что ищете, довольно быстрый.
Таким образом, всегда лучше знать, что вы ищете и где ссылки - которые помогут вам найти источник.
источник
Точная реализация не очень важна. Но принцип слияния / быстрой сортировки - рекурсия, разбиение и т. Д. - очень прост и понятен каждому программисту. Этот алгоритм на самом деле очень просто описать словами, как только вы поймете.
На самом деле проблема не в том, можете ли вы найти его или в Google, а в том, понимают ли программисты эти методы решения проблем и могут ли они применяться в других ситуациях.
источник
У меня два мнения на эту тему. Я знаю многих программистов, которые не знают, что такое алгоритм сортировки, но выполняют свою работу довольно хорошо. Я также верю в понимание принципов, чтобы действительно понять сферу.
Мне трудно получить непредвзятый ответ на эту тему, так как я программировал так долго, что я, вероятно, забыл больше алгоритмов, которые я знаю в настоящее время, - но я все еще знаю алгоритмы сортировки, упомянутые в этом вопросе. Я думаю, что у лидеров мысли в Agile (например, Рон Джеффрис, Алистер Кокберн) есть некоторые хорошие идеи, близкие к этой идее (например, Шу-Ха-Ри).
Вкратце к этому бессвязному ответу: определенно используйте API (NIH - признак незрелости разработчика), но всегда понимайте основные принципы. Надеюсь, это поможет.
источник
Сортировка и поиск очень важны, будь вы поклонник Дональда Кнута или хотите стать следующим Ларри Пейджем. В зависимости от бизнеса, в котором вы находитесь, и уровня конкуренции, которым вы можете управлять среди своих кандидатов, я бы порекомендовал вам включить в собеседование некоторые из следующих понятий.
Сортировка
Поиск
Некоторые могут сказать, что требование кода для этих алгоритмов является излишним, если работа не на необитаемом острове без подключения к интернету. Другое соображение заключается в том, что если у вас есть 30 минут, и вы хотите спросить о чем-то еще, для многих кандидатов реализация такого рода может занять большую часть вашего времени.
источник