Comments 31
Я всегда воспринимал эту книгу как пособие для школьного олимпиадного кружка по информатике. Если нужен серьезный справочник с глубокими основами - есть же классический учебник MIT "Алгоритмы" Кормена, Лейзерсона, Ривеста, Штайна.
пособие для школьного олимпиадного кружка по информатике
А что именно там из школьной программы? Я понимаю, что гипербола - это такой художественный прием, но если серьезно, то какая часть студентов первого курса это поймет? Очень далеко не каждый соискатель на место разработчика расскажет, как хеш таблицы работают, а вы утверждаете, что сжатие данных в школе проходят. Не могли бы уточнить о какой школе речь?
Уже довольно давно так сложилось, что школьные соревнования-олимпиады по программированию для старших классов имеют мало общего со школьной программой, а опираются, скорее, на программу примерно 1 курса по алгоритмам и структурам данных. Посмотрите, например, задачки с некоторых предыдущих олимпиад.
Посмотрите, например, задачки с некоторых предыдущих олимпиад.
Спасибо, посмотрел. Задачи очень сильно выходящие за школьную программу - это финальный этап. Но и там область необходимых знаний ограничена и не требует, например, реализовывать разбор текста по грамматике. Что наверное логично.
Вот для примера кусок оглавления:
10. Сопоставление с образцом
10.1. Простейший пример
10.2. Повторения в образце - источник проблем
10.3. Вспомогательные утверждения
10.4. Алгоритм Кнута - Морриса - Пратта
10.5. Алгоритм Бойера - Мура
10.6. Алгоритм Рабина
10.7. Более сложные образцы и автоматы
10.8. Суффиксные деревья
11. Анализ игр
11.1. Примеры игр
11.2. Цена игры
11.3. Вычисление цены: полный обход
11.4. Альфа-бета-процедура
11.5. Ретроспективный анализ
Какие задачи на каких олимпиадах требуют этих знаний и в какой школе их дают?
Какие задачи на каких олимпиадах требуют этих знаний и в какой школе их дают?
В случае с алгоритмом Кнута-Морриса-Пратта, например:
Задачи, сводящиеся к "эффективно найти все вхождения подстроки P в строку T".
На каком-то этапе отбора на всероссийскую/международную олимпиаду школьников по информатике. Вот, например, задачка с красноречивым названием из материалов для подготовки к школьным олимпиадам по информатике.
В той самой Летней Компьютерной Школе из соседнего комменатрия.
Конкретно формальные грамматики не пользуются на олимпиадах популярностью из-за того, что это задачки "на реализацию", которые нужно не столько решать, сколько аккуратно писать для них код.
Благодарю за ссылки. По ним можно дойти до интересного документа, являющегося основанием всей этой деятельности:
Правила выявления детей, проявивших выдающиеся способности, и сопровождения их дальнейшего развития (утв. постановлением Правительства РФ от 17 ноября 2015 г. N 1239)
2. Выявление одаренных детей осуществляется ... посредством проведения олимпиад ...
6. По итогам проведения мероприятия организатор ... направляет ... в веб-интерфейс государственного информационного ресурса о лицах, проявивших выдающиеся способности, предусмотренного пунктом 9 настоящих Правил, информацию об одаренных детях, являющихся победителями и призерами заключительного этапа мероприятий ...
7. Информация ... направляется ... для формирования их портфолио и организации дальнейшей поддержки и сопровождения этих одаренных детей.
11. Сопровождение дальнейшего развития одаренных детей ... в следующих формах:
а) обеспечение индивидуальной работы с одаренными детьми по формированию и развитию их познавательных интересов, в том числе тьюторской и (или) тренерской поддержки;
б) профессиональная ориентация одаренных детей посредством повышения их мотивации к трудовой деятельности по профессиям, специальностям, направлениям подготовки, востребованным на рынке труда;
в) содействие в трудоустройстве после окончания обучения;
г) психолого-педагогическое сопровождение одаренных детей;
К сожалению, все это великолепие прошло мимо меня и я о нём даже не подозревал. У детей в школе чего-то такого тоже не замечал. Возможно, "выдающиеся" и "одаренные" - это поиск самородков в тысячах тонн породы. Я ни в коем случае не хочу умалять достижений олимпиадников. Я ими готов восхищаться и гордиться. Но собеседуя соискателей на вакансии разработчиков я вижу простых людей, которые окончили "простую школу", "простой институт" и имеют опыт предыдущей работы. Их бесполезно спрашивать про алгоритм Кнута-Морриса-Пратта. При этом они вполне справляются с решением задач в виде написания приложения, тестов и документации. На моей практике, тех, кто разбираются в структурах и алгоритмах, среди соискателей менее 10%.
Возвращаясь к тому, с чего всё началось: пособие для школьного олимпиадного кружка по информатике. Соглашаюсь. Каюсь: неверно истолковал как "в каждой школе это проходят".
При этом они вполне справляются с решением задач в виде написания приложения, тестов и документации
Так это же хорошо! Олимпиадников - сотни, а разработчиков/тестировщиков и прочая-прочая - нужны десятки тысяч.
Проблема олимпиадников как раз в том, что они очень хорошо проходят все эти алгоритмические секции, потому что на них переобучены. А настоящая работа от алгоритмических секций значительно отличается.
А настоящая работа от алгоритмических секций значительно отличается.
Бесспорно. В настоящей работе в основном не надо задействовать все те знания и хитрые алгоритмы. Однако ваше высказывание как бы намекает, что олимпиадники не справляются с обычной работой, потому что обучены чему-то другому.
Но тут я категорически не согласен. После двух недель переучивания, чтобы использовать нормальные имена переменных и функций, любой олимпиадник отлично справится с любой "обычной" работой. Потому что уметь писать программы — это необходимое условие чтобы быть олимпиадником. Это как тяжелоатлет сможет работать грузчиком.
Проблема олимпиадников — это плохой стиль (который при приходе в индустрию лечится за пару недель). И еще некоторым может стать скучно, но это не так часто происходит.
Однако ваше высказывание как бы намекает, что олимпиадники не справляются с обычной работой
Я имею в виду, что прохождение алгоритмической секции для олимпиадника не является маркером сопутствующих навыков разработчика.
Если человек потратил несколько тысяч часов жизни на программирование, то он скорее всего с лёгкостью напишет на своём рабочем языке, например, несложный обход графа. Если мы говорим об "обычном" разработчике, то к этой отметке он приходит с некоторым багажом из чтения чужого кода и организации процесса разработки.
Олимпиадник потратил несколько тысяч часов жизни на написание гораздо более сложных алгоритмов, чем обход графа, поэтому он тоже с лёгкостью его напишет. Но ему, возможно, придётся объяснять после найма про стиль, про тесты, про системы контроля версий и про цену поддержки кода.
Естественно, это лучше, чем кандидат, которому придётся объяснять про стиль, про тесты, про системы контроля версий, про цену поддержки кода и про программирование в целом. Олимпиадник без опыта работы - это джун с хорошим потенциалом, как бы звёздно он ни проходил алгоритмические секции.
Это как тяжелоатлет сможет работать грузчиком.
Конечно сможет, но я бы не доверил переезд свой переезд группе тяжелоатлетов выбранных по их рабочим весам. Обычно грузчики работают в команде и в их работе есть какое-то количество практик, позволяющих не повредить мебель/технику при перевозке. Подозреваю, что тяжелоатлет без опыта работы грузчиком об этом даже не задумается (пока не набьёт шишки).
Я бы ещё уточнил, что олимпиадникам будет непросто с алгоритмами, которые долго пишутся/отлаживаются. Такие на олимпиаде трудно применить. Ну, может, единицы осилят, но вот так в относительно спокойной обстановке осилит гораздо больше, кто. Из-за этого их не дают на олимпиадах. А тут есть интересные и полезные находки.
Я писал (раз, два, три) интрузивное сбалансированное дерево с порядковой статистикой, которое использовал как быстрый список, как карту и как карту, у которой можно узнать и индекс тоже, это было важно. Где-то месяц ушёл на этот эксперимент со всем тестированием и отладкой. Интрузивная реализация добавляет веселья. Попытка кешировать индексы приводит к тому, что поначалу кешируется фигня. Нет-нет, да и ошибёшься. Надо тестировать, отлаживать. Ну какая олимпиада длится месяц
сбалансированное дерево с порядковой статистикой
Такие вещи на олимпиаде пишут за 5-10 минут. После практики конечно, ибо их пишут часто. Правда, обычно делают какое-нибудь Декартово дерево, оно сильно проще в реализации всяких там AVL или Красно-Черных деревьев. Интрузивность какого-то гемороя тут вообще не добавляет. На олимпиадах наоборот сразу пишут интрузивные структуры: класс со значениями и left/right указателями. И при перемешивании не значения двигают, а переключают указатели. Особенно в Декартовом дереве - там даже повторотов-то и нет, а только переключение указателей, чтобы разрезать дерево или склеить его. Ну, допустим, кто-то делает дерево поворотами. Требование не перемещать значения в памяти делает процедуру поворота на 5 строк длиннее. С удалением надо будет написать рекурсивную фунцию склеивания двух деревьев. Это все добавит 30 секунд рисования на бумажке, чтобы это спроектировать, и пару минут написания лишнего кода.
Без практики и тренеровок, минут за 30, в крайнем случае за час, такую структуру вам любой олимпиадник напишет.
Ну какая олимпиада длится месяц
Eсли человек может в течении 5 часов работать на пределе, то уж 8 часовой рабочий день в расслабленном темпе он уж точно выдержит. А то, что какой-то проект займет несколько дней или недель - ничего страшного. Способность быстро бегать сто-метровку не отнимает у человека возможности пройти в день 10-15 километров. Наоборот, такой человек явно в форме и ноги у него имеются. Так и умение очень очень быстро писать код в течении олимпиады не лишает человека возможности спокойно писать код неделями. Раз человек способен выучить десятки алгоритмов, то уж контекст своей задачи он даже за выходные не забудет.
left/right указателями
Так left/right в двусвязном списке, а в дереве left/right/parent. И если надо обменять два узла, то, как я сейчас понимаю, надо расписать отдельные случаи, когда два обмениваемых узла друг с другом не связаны напрямую, и когда связаны. Это я сейчас понимаю, а сам писал так, что LRP из одного скопировали во временные переменные, потом LRP из другого вставили во временные переменные, потом выгружаем, поменяв местами, потом у нас всё глючит, потом мы понимаем, что среди LRP, что у первого, что у второго могли оказаться 1 или 2, а мы же их типа меняем местами, а если мы их меняем местами, то надо в во временной копии LRP искать, а нет ли среди них 1 или 2, и если есть, то 1 заменять на 2 и наоборот, и только после подстановки вписывать обратно.
А до временных переменных ещё догадаться надо было. Мы же в двухсвязных списках без переменных обходились, ну и тут то же. Но нет. Тесты не проходят, тесты показывают, что из-за того, что что-то не в правильном порядке перезаписывалось, обращение по перезаписанному указателю идёт уже в какой-то другой объект.
Спустя время понимаю, что, пожалуй, если бы взять и разделить ситуации прямого родства от ситуации любого далёкого родства, я бы, скорее всего, написал сразу правильно. В двусвязных списках если нужно кодировать обмен и если не расписать отдельную обработку для непосредственных соседей, тоже можно угореть пытаться отладить код, общий на все случаи жизни. Но в двусвязных списках редко нужен обмен, а в деревьях сразу как только понадобилось удаление. Кстати, возможно, что на олимпиаде не понадобится. Но в жизни оно точно нужно.
Без практики и тренеровок, минут за 30, в крайнем случае за час, такую структуру вам любой олимпиадник напишет.
Было бы небезынтересно узнать, правда ли любой. Насколько любой. Я вот помню, что проталкивание предпотока не осилил. Так и был Форд-Фалкерсон всю дорогу. У всех какие-то лоскутные одеяла, кто что понял, но если по трое собрать, шансы на успех выше. А про декартово дерево я даже не помню, пытались нам его преподать или нет. Ни про дерево это особо не знал, ни даже что олимпиадникам его следует знать. Сильно позже школьных олимпиад, когда с олимпиадниками общался, мне поведали, что декартово дерево раньше писали. Ну, правда, это такое раньше, в котором C++ на олимпиадах не было, и декартово дерево было в роли обычной карты, а не для того, чтобы было, что аугментировать.
Я ещё помню, что мы графы в памяти часто хранили в формате таком, что у вершины первое исходящее ребро и первое входящее, а у ребра следующее исходящее из той же вершины и следующее входящее в ту же вершину, что и ребро. Если граф не ориентированный, то на уровне представления он всё-таки ориентированный, но при обработке ориентация игнорируется путём прохода ребёр в обоих направлениях. Мы это называли «список рёбер», не уверен, что это правильное название. Новое поколение так не делает! Новое поколение может зафигачить вектор соседних вершин или вектор инцидентных рёбер. У них теперь есть вектор.
Так вот, это прибавляет некоторого скепсиса по поводу того, что прям-таки любой олимпиадник.
в дереве left/right/parent. И если надо обменять два узла, то, как я сейчас понимаю, надо расписать отдельные случаи, когда два обмениваемых узла друг с другом не связаны напрямую,
Parent не всегда нужен, но даже если нужен, то обмены обычно происходят между родителем и ребенком (повороты эти самые).
А до временных переменных ещё догадаться надо было.
Вот тут как раз олимпиадники и сияют. Ибо формально строят модель что куда как перемещается и кучу раз подобные махинации проделывали.
Было бы небезынтересно узнать, правда ли любой. Насколько любой
Да, я слишком смело выразился и преувеличил. Не любой, конечно, а кто-то, кто серъезно этим занимается и хоть чего-то там добился. Например, вышел на всероссийскую олимпиаду и там вошел в топ 50%, допустим.
Ну, правда, это такое раньше, в котором C++ на олимпиадах не было, и декартово дерево было в роли обычной карты,
Нет, декартово дерево пишут, когда стандартного set/map не хватает. Например то же упомянутое дерево по неявному ключу. Или когда суммы на интервалах нужны. Когда хватает стандартного, ничего своего не городят, конечно.
Новое поколение так не делает! Новое поколение может зафигачить вектор соседних вершин или вектор инцидентных рёбер. У них теперь есть вектор.
Да, всякие стандарты и обычаи меняются со временем. Эта структура со списками и сейчас может быть полезна, например тем, что позволяет легко находить обратное ребро (обычно они в массиве парами и надо лишь последний бит инвертировать). И использовали ее не потому, что вектора не было, а потому что считалось что она быстрее. Плюс некоторые начинали с паскаля, где эта же структура и использовалась, потом привычка осталась.
и в какой школе их дают?
Например, в гимназии №42 г. Барнаула. Меня в неё пытались перетянуть ещё в 8м классе, заметив на олимпиадах, но оттянул этот момент до 9го, когда аттестат выдают. В новой школе и на математике было, допустим, интегрирование рациональных функций. Отсюда способ узнать, где такие школы: куда перетягивают олимпиадников.
До этой гимназии ещё ходил в кружок информатики, который сначала размещался в АКИПКРО (центр повышения квалификации преподавателей, в котором преподаватели хорошие со всего города были, особенно те, кто кружки вели), потом в школе №22. Как сама школа, не знаю, но вот кружок там какое-то время был, да.
В ЛКШ мне довелось побывать только один раз. Именно там нам преподавали дерево Фенвика, которое на самом деле дерево Рябко, и ещё дерево отрезков. Так и не помню, чтобы это где-то на олимпиадах пригодилось, но в душу запало. Этот один раз пришёлся как раз между 10м и 11м классом в гимназии №42. Чтобы туда поехать, надо деньги собрать. Нет, не так. Надо и узнать про ЛКШ, и после того, как узнать, ещё и деньги собрать. У меня родители оба программисты, но в житейском плане глупые, и в своей глупости невероятно изобретательные, оба нашли способы, как, будучи программистами, умудриться остаться в нищете. Чтобы поехать в ЛКШ, это какой-то предприниматель оплатил, который считал, что морально должен. Это мог быть МИТРА, Энтерра или Сибирикс. Отсюда ещё один способ узнавать, где такие школы: смотреть, откуда едут в ЛКШ. Каким школам доверяют местные предприниматели. Кроме Перми. Из Перми ехать далеко не надо.
Ну и можно просто мониторить школьные олимпиады. Откуда часто успешно выступают. Такое не бывает спонтанно. Нас нередко отправляли на разные олимпиады, и это надо несколько часов школьных освободить, это администрация участвует в изменении расписания по всем предметам.
Ну я как человек когда-то преподававший информатику в школе могу сказать, что сильно повезет, если в классе есть хотя бы десяток ребят, у которых не ветер в голове, и еще сильнее повезет, если информатикой (а не химией, биологией, физикой, языком) заинтересуется хотя бы половина из них. Большая удача наскрести участников на школьную олимпиаду с реально ценными призами и подарками.
Это у вас администрация наскребать должна, а не учитель сам по себе выдумывает один в поле воин. Странно другое. Странно, что учитель не знает, куда наскребают таких учеников. Может быть, в вашем городе просто не было.
Влезу в разговор, извините. Речь идет о любой школе, где есть вменяемый преподаватель, который готов вести такой кружок. И найдётся несколько интересующихся ребят, готовых на этот кружок ходить. Дело это добровольное, поэтому там, в общем-то, не "проходят", а просто этим занимаются. Особенность прикладной дискретной математики, на мой взгляд, в том, что это, в сущности, игра в кубики. В той или иной форме эта дисциплина доступна не то, что в школе, а порою и в детском саду. А если кому-то она не даётся, то это не аргумент. В конце-концов, не все же должны этим заниматься. Есть и другие интересные вещи.
Речь идет о любой школе, где есть вменяемый преподаватель, который готов вести такой кружок. И найдётся несколько интересующихся ребят, готовых на этот кружок ходить. Дело это добровольное, поэтому там, в общем-то, не "проходят", а просто этим занимаются
Ну я как человек когда-то преподававший информатику в школе могу сказать, что сильно повезет, если в классе есть хотя бы десяток ребят, у которых не ветер в голове, и еще сильнее повезет, если информатикой (а не химией, биологией, физикой, языком) заинтересуется хотя бы половина из них. Большая удача наскрести участников на школьную олимпиаду с реально ценными призами и подарками. В готовности школьника разбирать балансировку дерева после вставки я сильно сомневаюсь. В мотивации учителя факультативно это преподавать одному-двум ученикам тем более. Конечно, исключения бывают и среди первых, и среди вторых. Но это действительно исключения. Посмотрите, например, результаты по заключительным этапам ВсОШ по информатике по приведенной iliazeus ссылке.
Особенность прикладной дискретной математики, на мой взгляд, в том, что это, в сущности, игра в кубики. В той или иной форме эта дисциплина доступна не то, что в школе, а порою и в детском саду. А если кому-то она не даётся, то это не аргумент. В конце-концов, не все же должны этим заниматься.
Да, есть дети, которые в 3 года говорят на нескольких языках, выступают на скрипке и умножают двузначные числа в уме. Означает ли это, что все остальные должны соответствовать их уровню и школьный стандарт должен соответствовать бакалавриату? К сожалению, реальность такова, что далеко не каждый десятый и даже не двадцатый разработчик с опытом расскажет вам характеристики, как работает и как реализованы самые часто используемые контейнеры стандартной библиотеки ежедневно используемого им языка.
Да, есть дети, которые в 3 года говорят на нескольких языках, выступают на скрипке и умножают двузначные числа в уме. Означает ли это, что все остальные должны соответствовать их уровню (...)?Скорее, все остальные родители должны (сами себе должны, а не кому-то) соответствовать родителям этих детей. Вы же не зря упомянули именно скрипку именно в 3 года, это двойной намёк на книгу «послё трёх уже поздно». Почему бы в детском саду не поиграться с дискретной математикой, вместо сами знаете какой ерунды?
Почему бы в детском саду не поиграться с дискретной математикой, вместо сами знаете какой ерунды?
Речь шла о книге, которую автор позиционирует как пособие для школьного образования и о моём недоумении подобной характеристикой. Считаю излишним агитировать за или против помощи своему ребенку в развитии. Однако, сомневаюсь в способности и, главное, мотивации большинства школьников и учителей ИВТ среднеобразовательных школ освоить и дать представленный в книге материал. К счастью это не отменяет тех самых выдающихся одаренных детей и их исключительных преподавателей, коим являлся сам автор. Надеюсь, усилия государства в этом направлении, изменят ситуацию. Буду рад ошибиться и узнать, что с 90-х и начала нулевых ситуация действительно поменялась.
Означает ли это, что все остальные должны соответствовать их уровню и школьный стандарт должен соответствовать бакалавриату?
А кто говорит о "всех" или об изменении так называемого школьного стандарта? Вы спорите сами с собой. Речь идёт о том, что дети (возможно, в лице их родителей, но это бывает по-разному) должны иметь возможность влезть в это всё. Я тоже когда-то сам ходил на такие кружки, а потом вёл их время от времени. И не только с детьми, кстати. Да, на старте может быть 10 человек. На выходе - трое. Нет ничего чудеснее мотивированного ребёнка. Он способен очень на многое. Если в нужном возрасте попадёт в нужное (именно ему) место.
Речь идёт о том, что дети ... должны иметь возможность влезть в это всё.
Изначально речь шла о тезисе, что данная книга - школьное пособие. Автор не упоминает олимпиады в аннотации и введении (хотя в тексте некоторых задач дает примечание, что они были предложены на олимпиадах). В тоже время автор говорит об общеобразовательных школах. Именно это меня и удивило.
Не смог удержаться )))
Это так же далеко от Школы как МЁД от МЕЛА или мы о разных школах 1/1000
у нас с этого года платный факультатив по матике только когда на него ходят одновременно троечники и отличники толку от него НОЛЬ пустая трата денег и времени)))
а про общий уровень школы я вообще молчу
видимо не там живем)
пособие для школьного олимпиадного кружка по информатике
Аналогичного кружкам мехмата МГУ, упомянутым в тексте, только не по математике, а по информатике. Можно вспомнить, например, ЛКШ - это, конечно, не кружок, а летняя школа, но работают там со школьниками.
А что именно там из школьной программы?
Но ведь автор не утверждает, что книжка по школьной программе. В ней много задачек и не очень много теории, а изложение материала в основном идёт в виде разбора задач. Лишний формализм пропущен там, где его можно пропустить (книжка не вводит O-нотацию, например). Сравните с книжкой Кормена, написанной для студентов.
далеко не каждый соискатель на место разработчика расскажет, как хеш
таблицы работают, а вы утверждаете, что сжатие данных в школе проходят
Первое издание книжки вышло в 1995 - школьникам в те времена приходилось писать на олимпиадах контейнеры, включая хеш-таблицы и различные вариации самобалансирующихся деревьев.
Но ведь автор не утверждает, что книжка по школьной программе.
Нет, он говорит о том, что книга написана по материалам занятий программированием со школьниками. Я позволил себе усомниться в том, что это простые школьники.
Речь может идти только об очень очень особой школе и очень очень особых школьниках. Например, таких, которые ходят на математический кружок мехмата МГУ, где математически доказывают выигрышную стратегию при игре в крестики-нолики. 90% материала выходят за рамки школьной программы по информатике. Да и некоторые задачи используют математический аппарат, который тоже в школьный стандарт не входит. Не стоит отметать эту книгу как что-то для маленьких и неразумных.
Так каков же вывод? Книга для школьников (пусть и олимпиадников) и взрослому человеку читать её стыдно или поздно?
Ну мне не стыдно. Я почерпнул для себя новое. Мне было интересно. Тем, кто уже давно не школьник, я, по прежнему, её рекомендую:
Если базиса нет, то тут он дан. Если базис уже знаком, то для разминки и расширения кругозора.
Если сравнивать с "Грокаем алгоритмы", то лучше уж прочитать "Программирование: теоремы и задачи". Да, наверное есть другие книги, где нет доказательства корректности и задач без решений и они будут более эффективны в плане затрат времени и полученного результата. Например,
классический учебник MIT "Алгоритмы" Кормена, Лейзерсона, Ривеста, Штайна
Для этого мы мнением и обмениваемся. Нет общепризнанного списка о том, что читать и в каком порядке. В соседней ветке с обзором "Грокаем алгоритмы" тоже рекомендовали каноничные тексты, но каждый рекомендовал свой набор. Я уже пополнил список того, что мне стоит прочесть. Если кто-то заинтересуется книгой А. Шеня или наоборот из моего описания или ваших комментариев поймет, что она ему не подходит и не потратит время зря - тоже хорошо.
Так каков же вывод? Книга для школьников (пусть и олимпиадников) и взрослому человеку читать её стыдно или поздно?
Я такого не писал и не подразумевал - учиться никогда не поздно :)
Моя позиция в том, что книжка написана очень доступным языком и, несмотря на пассаж в посте про "очень особенных детей", её вполне можно читать вместе с заинтересованным и освоившим программирование (или это уже делает его очень особенным?) ребёнком лет 11-16. Наравне с тем, чтобы дать ребёнку поиграть в Human Resource Machine.
Для подготовки к алгоритмической секции её недостаточно (там выше был пассаж про О-нотацию), но для погружения в алгоритмы - книжка очень хорошая, потому что даёт достаточное количество практики, чтобы их "прочувствовать".
Немного оффтоп - вообще в области программирования вещи "для школьников" часто оказываются хорошей точкой входа. Например, есть отличный курс Кириенко по основам программирования (на примере python) с довольно обширным набором задач для практической отработки навыков.
Да, наверное есть другие книги, где нет доказательства корректности и
задач без решений и они будут более эффективны в плане затрат времени и
полученного результата. Например, классический учебник MIT "Алгоритмы" Кормена, Лейзерсона, Ривеста, Штайна
Книжка Кормена как раз более фундаментальная и её ощутимо сложнее читать, если изначально не иметь какого-то представления о теме (которое как раз можно получить пройдя книжку Шеня).
там выше был пассаж про О-нотацию
Да, автор не пишет O(nlogn), но для половины задач либо дано условие, либо дан анализ: "число операций пропорционально log n", "число шагов не должно превосходить ?1 log(a/b) + ?2 для некоторых констант ?1, ?2", "время работы остаётся порядка ?^2" и тому подобное. Возможно, это неканонично. Возможно, это понятнее, чем "сложность O(n^2)".

В некоторых местах рассматриваются и затраты памяти. В некоторых местах рассматривается худший случай и в среднем.
Я нашёл анкету примерно 2000-го года для студентов на практику в одну IT-контору. Вполне годится для теоретической части собеседования на миддла.
Предыдущее издание книги можно, кстати, официально скачать с сайта издательства Московского Центра Непрерывного Математического Образования.
Так и издание 2021-го года там рядом лежит.
Благодарю, исправил. В разделе "Свободно распространяемые издания" ссылка именно на предыдущее. Наверное, забыли обновить.
Там на отдельной странице много книг этого автора перечислены (возможно даже все, я не знаю точно). Оттуда я ссылку и скопировал.
Пожалуй еще паять копеек вставлю по поводу печатных изданий (я далеко не программист)
но обучение по КНИГАМ для вхождения в профессию
дело более чем спорное
даже когда препод ЧИТАЕТ лекцию и то 70% зависит от таланта препода передать свои знания (а не его знаний как таковых) а уж потом от способностей студента,
а самостоятельное обучение требует СУППЕР мотивации и кучи СВОБОДНОГО времени
более-менее нормальная литература вся на английском
добавляем постоянные косяки перевода плюс отставание от реальных задач
в итоге получаем талмуд на 500 страниц в котором нужной инфы на 100 а их надо найти время все прочитать и еще что бы вкурить неплохо бы погуглить и далеко не факт что именно те методы нужны будут в конкретной задаче в
в итоге масса потерянного времени и мало толка)
не отрицаю пользы печатных изданий (хороших) но лишь как дополнение к самообразованию в виде справочника
ловлю тапки)
Программирование: теоремы и задачи