| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Алгоритмы > Мышление слабо алгоритмическое, но очень хочется |
| Автор: КунгФуЧайник 23.11.2011, 14:16 |
| Мышление, наверное, больше гуманитарное. Знаю концепции ООП, "программировал" в С++ Builder, работа связана с отчетами для бух.программы - тупо вытащить такую-то инфу из такой-то таблицы. Хочется прочно связать себя с серьезным программированием (ИИ, моделирование, поиск), но алгоритмическое мышление слабое. Например: дана задача, нужно решить - написать алгоритм. Т.е., как я понимаю, понять, что за шаги должны быть и почему именно такие шаги, а не какие-то другие. Начинаю погружаться в задачу и практически сразу мозг отказывается работать, будто упираюсь в стену. Начинается что-то вроде "проскальзываний" - не могу четко сформулировать эти "что" и "почему", в голову всякий мусор лезет. Про формирование алгоритмов с помощью рекурсий я вообще молчу, хотя этот способ мне нравится много больше циклов. Получается, либо мне вообще уходить из программирования, либо перестроить мышление с гуманитарного на алгоритмическое. Уходить не хочу, поэтому на полном серьезе прошу помочь - посоветовать литературу, доступную для нулевого уровня. И вообще, можно ли перестроить так мышление в зрелом возрасте или это врожденная способность? |
| Автор: VictorTsaregorodtsev 23.11.2011, 15:08 |
| Вот это я не рекомендую вязать с ИИ, моделирование, поиск я формулирую в виде алгоритмов над векторами и матрицами (причём не над классами-векторами, как, допустим, в STL - а над обычными массивами, т.е. с минимумом ООП), или в виде алгоритмов над разреженными матрицами. С рекурсией или ООПом вдоль и поперёк - будут тормоза уже на средних объемах данных, а гигабайты вообще будет не потянуть. На сайте в подписи - есть заметка, где я издеваюсь над тормозами чужих программ (моя прога работает в 10-100 раз быстрее пяти других прог разных авторов, хотя алгоритм мы все реализовывали один и тот же). |
| Автор: kemiisto 23.11.2011, 16:32 | ||
tail call elimination & link-time optimization вам в руки! Если рекурсия хвостовая, то многие компиляторы умеют сами заменять на итерацию. И есть задачи, где рекурсивное решение - единственное из разумных. В общем согласен, что в 99% рекурсию пихают куда не надо, и что она таки может быть причной тормозов, но не надо так катигорично. С ООП тут ещё проще ситуация - если у вас язык подразумевает статическую компановку, а используемый компилятор не умеет оптимизацию во время компановки, то... То используйте компилятор, который умеет. КунгФуЧайник, мышление перестроить может и нельзя, но кто сказал, что это необходимо? Посоветую для начала классику: Вирт Н., Алгоритмы и структуры данных, Дал У., Дейкстра Э., Хоор К. Структурное программирование. А почему так считаете? Образование гуманитарное? |
| Автор: КунгФуЧайник 24.11.2011, 12:41 |
| kemiisto, спасибо за названия. Но Вирт, кажется, на паскале все это показывает. Может быть в паскале структуры данных другие или они в любом языке одинаковые? В пайтоне, например, который я немного изучаю, есть тип dict. Я думал его структура такая же, как в описании типа (ключ-значение), а он, оказывается, на самом деле реализован то ли хэш-структурой, то ли еще чем-то. Нет пожалуй. Средне-специальное - техническое, но с программированием связано косвенно. В художке параллельно старшим классам учится, правда год. С детства лепил, рисовал. А вот с математикой плохо - только сейчас ее абстракцию начинаю понимать. Особенно убивает то, что вроде чувствую из каких операций состоит алгоритм, а четко сформулировать их не могу - понимание ускользает. |
| Автор: VictorTsaregorodtsev 24.11.2011, 15:17 |
| kemiisto, я примером использования векторно-матричных операций просто сделал первый шаг к указанию на то, что существуют хорошо оптимизированные библиотеки (MKL, BLAS, LAPACK,...), которые эффективно доработаны и до многопоточного распараллеливания и/или распараллеливания на кластер. Но раз ТС пишет, что ему трудно записывать/переписывать алгоритм на уровне матем.абстракций, то мой совет по либам пока неактуален. |
| Автор: Metalex 25.11.2011, 13:58 |
| Жаль, не могу вспомнить книгу, но что-то из раздела "Все в примерах на С++". Приятно удивило, что там рассматривались задачки не только на стандартную рекурсию, а и простенькое консольное рисование всяких узоров с помощью рекурсии, при чем не самой легкой. Если освоите это, да еще и закрепите - с рекурсией не должно вообще возникать проблем. Очень хорошо развивает "рекурсивное" мышление работа с деревьями. |
| Автор: VictorTsaregorodtsev 25.11.2011, 15:17 |
книга Грэхем, Кнут, Паташник "(чиста) Конкретная математика. Основание информатики" |
| Автор: esperanto 26.11.2011, 00:27 | ||
А вы ее прочитали и поняли всю до конца? Или хотя бы процентов 70? Добавлено через 3 минуты и 4 секунды Вы читаете на английском? А вообще вам надо изучить алгоритмы и смежные специальности 1) дискретную математику 2) теорию вероятностей 3) теорию вычислимости 4) структуры данных 5) алгоритмы курс или два 6) графы и их применения 7) теория чисел. 8) мат. анализ 9) логика 10) исскуственный интелект 11) теория информации +- и тогда вы будете неплохо разбираться может быть |
| Автор: _Y_ 26.11.2011, 23:31 |
| Мне почему-то кажется что советы "что изучать" здесь не совсем в тему. Скорее надо "как изучать". Ведь разговор не о том "что надо знать", а о том как-бы мозги подрегулировать. ИМХО может помочь подход от простого к сложному. Разбираетесь с алгоритмами столь простыми, что в процессе разбора заснуть не успеваете |
| Автор: esperanto 27.11.2011, 00:05 | ||
Именно что вам кажется. Что знать как изучать, надо знать что изучать. Невозможно изучать КАК неизвестно что. И человек должен иметь представление о масштабах задаче, прежде чем каковать, как же ему изучить. Но это мое личное мнение, основанное на 8 годах преподавания в университете и двух институтах на различных факультетах. И оно может и не верное. |
| Автор: baldina 27.11.2011, 02:58 | ||||
серьезное программирование означает профессиональное. неважно что, важно как какая разница? алгоритмы и структуры те же. алгоритмы часто на псевдоязыке записывают, что бы не привязываться к языку. правда, с реализацией так записанных алгоритмов у новичков могут быть проблемы. один простенький оператор yeld чего стоит))) esperanto, конечно дискретная математика и иже с ими важны, конечно нужно изучать. но вопрос то не в этом, точнее не столько в этом, а в алгоритмическом мышлении, в подходе. КунгФуЧайник, Вам нужно поизучать методологию разработки алгоритмов. Метода, способа разработки алгоритмов не существует. Это всегда творческий процесс, связанный с догадкой, озарением. Однако подходы есть, они довольно неплохо классифицированы и описаны. Здесь есть некоторая аналогия с дифференцированием и интегрированием: первое можно уметь или не уметь, второе можно не уметь, уметь, а можно уметь здорово; мучаясь над очередным интегралом мы пробуем различные способы, единственного верного пути нет. попробуйте эти книги: С.Скиена Алгоритмы. Руководство по разработке А.Левитин. Алгоритмы. Введение в разработку и анализ Лучше, наверно, начать со второй, она сосредоточена на методологии. Добавлено через 4 минуты и 28 секунд да, кстати. есть классика жанра - Д. Пойа Как решать задачу для общего развития и приведения мышления в порядок очень хорошо Добавлено через 14 минут и 55 секунд
тогда Кнут и Грэхем, возможно для Вас. Она не настолько сложна, как Вас пугают это ключевое, это причина. начните с четкой формулировки задачи. вслух (очень важно, что бы не просто промелькнула мысль, а была сформулирована конкретно, словами). если Вы что-то изучили, пробуйте это выразить своими словами, причем так, что бы они были понятны первокласснику, но при этом отражали суть. |
| Автор: _Y_ 27.11.2011, 10:53 | ||||
Мы с Вами по-разному понимаем вопрос автора темы. Мне кажется что у него ключевая проблема именно в том, что мозг "самоотключается" на данной тематике. У меня то же самое бывает когда сижу на каких-нибудь административных собраниях, семинарах о значимости науки/техники для общества, и обсуждениях "как бы нам раздобыть побольше денег". Отрубаюсь и засыпаю прямо на глазах у публики как бы мне самому результаты этого заседания ни были важны. Автор темы знаком с тем что такое алгоритмы и зачем они ему нужны. И масштабы задачи вроде бы представляет. Вот я и предложил ему что-то, что для него должно быть достаточно просто: метод попарной перестановки, например. Можно даже "расширить" - потратить пару недель на разборку различных методов сортировки. Среди них много очень простых, кстати. Потренировать мозги (что и требуется, сколь я понимаю). ОФФ: кстати, как-то мы выяснили, что большинство выпускников факультета прикладной математики к моменту выпуска уже не помнят никаких методов сортировки, кроме попарной перестановки
Письками будем меряться? Но это мое личное мнение, основанное на 8 26 годах преподавания в университете и двух институтах трех разных стран на пяти различных факультетах. И оно может и не верное. |
| Автор: КунгФуЧайник 27.11.2011, 13:42 | ||
Ответ длинный. Короче не получилось, извините.
Именно. Не знал, что есть методология разработки алгоритмов. Спасибо за названия. Да. Причина, как мне кажется после субъективной "самодиагностики", в отсутствии умения разложить задачу на четкую, "атомарную", последовательность шагов. Бывает, "определил" шаг, вроде все понятно - смотрю на этот шаг и в упор не понимаю, что это на самом деле не шаг, а еще не четкий клубок, который еще распутывать, чтобы получить последовательность (либо вообще понять, что определил неправильно). Чего-то в логике не хватает. esperanto, тот список, что вы привели - пока только облизываюсь, ближе подступиться не получается, хотя много раз пробовал. Это уже для "второго приближения". Хотя из списка можно, наверное, уже сейчас взять на проработку пункт про логику. Из всех советов попробую сформулировать план на "первое приближение": 1. Тренировка мозга на формулирование алгоритмов от простых к сложным. 2. Изучение литературы по методологии алгоритмов. Хоть процесс творческий, но приемы как подходить к анализу задач наверняка есть. Чтобы не было такого состояния, когда не знаешь, с какой стороны поступиться, за что взяться. 3. Тренировка логики. Посылки, выводы. 4. Какие-нибудь упражнения, чтобы научить мозг отвлекаться от конкретики. А то математика мне не дается со школы именно потому, что не понимаю, что там прячется за всякими буквами, обязательно нужны какие-нибудь конкретные примеры. Цель - сформировать навык анализа алгоритмических задач, и их формулирования в алгоритмы. После этого, думаю, можно приступать к списку esperanto. Что скажете? Плохо, сейчас усиленно тренирую. Нашел Alan Graham "Базовая Математика" ("Teach Yourself Basic Mathematics"). Другого Грехема тоже нашел. |
| Автор: _Y_ 27.11.2011, 13:52 |
| КунгФуЧайник, ИМХО алгоритм борьбы со своей проблемой Вы составили вполне правильно |
| Автор: baldina 27.11.2011, 14:15 |
| VictorTsaregorodtsev, http://wmate.ru/ebooks/dl_book487.html?mirror=1&SID |
| Автор: mrgloom 29.11.2011, 08:25 |
| имхо, читать просто какого нить Кнута с нуля и без практики, мозгов не прибавиться и все быстро забудется. надо сначала сносно программировать и знать базовые алгоритмы и структуры данных. потом можно ковырять олимпиадные задачки по программированию ,а можно ковырять какой нить опенсорсный проект. |
| Автор: VictorTsaregorodtsev 29.11.2011, 14:59 |
| baldina, эта книжка у меня есть в бумажном виде (купил в январе 99 в Мск) |
| Автор: baldina 29.11.2011, 17:56 | ||
я туплю. хотел адресовать это КунгФуЧайник, неправильно прочитав его пост: мне показалось, что он не нашел |
| Автор: esperanto 29.11.2011, 18:06 |
| Простите за офтоп, но кто тут прочел всю конкретную математику и понял, очень интересно? |