Как стать автором
Обновить

Комментарии 29

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

При всём уважении к этому фундаментальному справочнику, это очень плохой учебник и плохой материал для подготовки к интервью, мне кажется его некорректно сравнивать с настоящими учебниками.

А что бы вы посоветовали?

Как учебник - Algorithm Design (John Kleinberg, Éva Tardos), для подготовки к интервью - Elements of Programming Interviews, как справочник - Кормена.

  • Algorithms от Sedgewick'а (с вполне практичными примерами на Java)

  • Classic Computer Science Problems in Python (тоже практичней некуда, еще и владение Python'ом подкачаете)

  • Algorithms Design Manual от Skiena (имхо, одна из самых популярных рекомендаций в FAANG'ах)

и этот псевдокод еще очень странный и далёкий от современного программирования

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

return quicksort(less) + [pivot] + quicksort(greater)

Код работает правильно, все понятно, все приближено к современной реальности. Но за этой простотой и понятностью скрываются циклы и копирования. Эффективность такой реализации сомнительна. Второй пример: в Алгоритмике при объяснении метода двух указателей на примере сортировки слиянием можно увидеть вот такой код:

merge(v.begin() + l, v.begin() + mid, v.begin() + mid, v.begin() + r, c.begin());

Не изучавшему STL будет сложно понять, что это std::merge из C++ и что тут на самом деле цикл и внутри него if, копирование и инкремент одного из двух указателей. Код короткий и хорошо понятный опытному C++ разработчику. Но для всех других такая высокоуровневость скорее помешает понять алгоритм.

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

Но я соглашусь. Текст тяжелый, половина книг - упражнения и решения к ним. Это совсем не тоже, что каталог для практиков как у GoF.

Согласен, начинать учить программирование по Кнуту - смерти подобно, это то же что рекомендовать начинать изучение теорвера - по Ширяеву, физики - по Ландау-Лифшицу. Да есть немногие гении, кому это зайдет с самого начала, для всех остальных - это скорее отобъет всякое желание изучать что-то дальше. Цель образования - зажечь любопытство - все остальное уже дело времени.

Уже обсуждалась эта книга неоднократно на хабре. Мнения 50/50. Я бы не назвал это "Профессиональной литературой". Подтвержу слова статьи, что во второй половине книги автор перестает "грокать" и начинает "плавать". Это наводит на мысль, что глубоко изучать сложные алгоритмы все равно придется по другой литературе.

@nikolaysmartynovты пишешь "хотелось бы каталога алгоритмов". На мой взгляд монография  Donald E. Knuth "The Art of Computer Programming" остается наилучшим вариантом. Другой вопрос, что это не публицистика, а научный труд, который читать - труд не меньший :)

В своем комментарии https://habr.com/ru/post/439576/comments/#comment_19802200 я отмечал, что иначально Grokking Algorithms была выпущена с большим количеством ошибок, и перевод ситуацию только ухудшил. Некоторые исправления автор разместил тут: https://adit.io/errata.html , я нашел еще несколько ошибок, сообщил автору, но в errata правки пока не появились.

ты пишешь "хотелось бы каталога алгоритмов". На мой взгляд монография  Donald E. Knuth "The Art of Computer Programming" остается наилучшим вариантом.

К сожалению на русском можно купить только первые три тома. Четвертый том не найти. Остальные и вовсе не переводились. А похоже именно там комбинаторика, статистические методы, NP-полные задачи и т.п. По крайней мере этого нет в первых трех томах. Можно конечно и в электронном, и на английском почитать, но это не совсем то.

На озоне электронные версии вполне вменяемых денег стоят (по 1500 за том) https://www.ozon.ru/product/iskusstvo-programmirovaniya-tom-1-osnovnye-algoritmy-148568216/?sh=taJR1JgKXg

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

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

Так ведь, четвертый том Кнут таки и не закончил (и, наверное, уже не закончит никогда). А "остальных" и вовсе не существует в природе.

А в скиллбоксе не знаешь какие книги рекомендуют? В списке литературы для поступления в шад, не видел такой книги.

Не могу сказать, ибо не знаю. Но видимо, там рекомендуют какую-то более серьезную литературу. Возможно, что-то что перечислил HotkeyM или SibProgrammer.

Это был сарказм, просто яп это же просто курсы для свитчеров, и относится к таким курсам , как к авторитетному источнику я бы не стал.

Книжка "Грокаем алгоритмы" - точно не учебник. Простоватая, мне не зашла. Как-то все скользко, мутно. Все книги про алгоритмы делятся на 2-е части или заумные вроде Кнута, например, где ты с 20 страницы понимаешь, что ты ничего не понимаешь или простые до нельзя, вот как эта, что-то типа алгоритмы в комиксах, где вроде бы все понятно, но ничего не ясно. А вот "золотой середины" по книгам здесь очень мало.

Я бы порекомендовал Ананий Левитин "Алгоритмы: введение в разработку и анализ" мне очень понравилась. Просто о сложном. Я бы даже бумажный экземпляр купил, может кто подскажет где?

Похоже только с рук или в букинистике.

Jon Kleinberg, Eva Tardos Algorithm design

Роберт Седжвик, фундаментальные алгоритмы на c++

Обе есть на русском , читабельные , понятные

Если честно, название и описание этой книги очень сильно вводит в заблуждение. Мне ее рекомендовал один из преподавателей практикума, словами вроде "Позволит намного лучше понять и разобраться в алгоритмах в целом". И когда я её покупал, думал о том что там будут какие то хитрые алгоритмы, досканальный разбор, может придется вспомнить универский матан, но нет. Как чтение для совсем новичков имхо - очень даже. Но чтобы вот "грокаем" - ну точно нет.

Если английский — не проблема, то у Introduction to algorithms недавно вышло 4 издание. На русский переведено пока только третье, но кардинальных отличий нет. Динамическое программирование там есть :)

НЛО прилетело и опубликовало эту надпись здесь

ГА хороша именно что для первичного ознакомления с алгоритмами

Для первичного ознакомления с алгоритмами лучше взять учебник Вирта — в котором «на пальцах» объясняется концепция вычислительной сложности и сравниваются разные алгоритмы решения одной задачи. А ГА — согласен с автором статьи — типичный научпоп для тех, кто ни в каком виде не собирается заниматься программированием, но хочет иметь хоть какое-то представление о нём.

Ух. Когда-то книжка дала базу для олимпиад по информатике. Не то чтобы я сразу научился во все таски, но понял, что даже сложные алгоритмы могут быть простыми и понятными при должном подходе, после чего стал искать для всех непонятных действий такие объяснения. Простые, может даже глупые, но которые работают. И как-то пошло)

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

Возможно, алгоритмы `Aditya Y. Bhargava` не самые быстрые, да и изучил я треть от книги. Но! Все приведенные примеры ГА рабочие, на их основе я создал свою реализацию. Для тестов прошу ознакомиться с моим репозиторием github. https://github.com/DamianMorozov/Console.GrokkingAlgorithms
После чего, прошу привести конкретные тесты на замер сравнения производительности вашей реализации и моей (полностью основанной на исходных кодах ГА).
Если лень делать тесты, скидывайте ссылку на свой репо с вашей реализацией, я найду время сравнить производительность.
- Тест 1. Сортируем массивы.
- Тест 2. Сортируем списки.
- Тест 3. Сортируем файлы со строками.

прошу привести конкретные тесты на замер сравнения производительности вашей реализации и моей (полностью основанной на исходных кодах ГА)

Если обе реализации основаны на алгоритме, который в книге, то нет смысла что-то сравнивать. Одно дело взять реализацию варианта быстрой сортировки выбором с обменом и сравнить с реализацией варианта быстрой сортировки расщеплением, а потом сравнить потребление памяти и времени и глубину стека. А так что мы будем сравнивать? Кто сколько наоптимизировал отойдя от того, что есть в книге?

скидывайте ссылку на свой репо с вашей реализацией

Ссылка дана в конце статьи.

Все приведенные примеры ГА рабочие, на их основе я создал свою реализацию

Ключевая часть "на их основе я создал свою реализацию". А вот с "Все приведенные примеры ГА рабочие" есть проблемы. Например, в главе 9 есть пример с самой длинной общей подпоследовательностью двух строк. Автор берет слова с одинаковым количеством букв, причем первые буквы совпадают. Это очень удобно, так как не надо думать о начальных условиях и тому подобном. На практике, приведенный в книге код легко выйдет за левую и верхнюю границы. Это никак не учитывается при обращении к предыдущей строке/ячейке. Ровно также из ниоткуда появляется значение первой ячейки.

if word_a[i] == word_b[j]:
  cell[i][j] = cell[i-1][j-1] + 1
else:
  cell[i][j] = max(cell[i-1][j], cell[i][j-1])    

Ссылка дана в конце статьи.

Не могу понять в вашем репо, примеры использования алгоритмов.

Не могу понять в вашем репо, примеры использования алгоритмов.

Примеры использования можно найти в тестах. Для Java использован Spock, а для C++ - CUnit.

Например, задача оптимизации туристического рюкзака из 9-й главы

    def "9.2"() {
        given:
        Map<String, Ex_9.ItemInfo> inventory = [water : new Ex_9.ItemInfo(10.0, 3),
                                                book  : new Ex_9.ItemInfo(3.0, 1),
                                                food  : new Ex_9.ItemInfo(9.0, 2),
                                                jacket: new Ex_9.ItemInfo(5.0, 2),
                                                camera: new Ex_9.ItemInfo(6.0, 1),]
        int bagSize = 6
        when:
        Set<String> result = new Ex_9().optimizeBagDynamic(inventory, bagSize)
        then:
        result ==~ ['water', 'food', 'camera']
    }

Структура проекта - стандартный Java и C++ проекты Gradle.

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации