• Как в Python корректно использовать алгоритм бинарного поиска?

    STLEON
    @STLEON
    In Console We Trust. Code hard. Or die.
    Какой-то у тебя большой бинарный поиск. Посмотри на мой omgit.ru/blog/binary-search
    Ответ написан
    1 комментарий
  • Как в Python корректно использовать алгоритм бинарного поиска?

    bobrovskyserg
    @bobrovskyserg
    Вижу несколько разных вопросов:
    Как произвести подсчет числа прописных букв в тексте просто?
    Как произвести подсчет числа прописных букв в тексте быстро?
    Что за хрень я написал и почему она не работает?

    #  просто и быстро
    STR_TEXT = "Требуется произвести подсчет числа прописных букв в тексте."
    AllCapitalLetters = set("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ")
    CapitalInTEXT = [c for c in STR_TEXT if c in AllCapitalLetters]
    print(CapitalInTEXT)
    print(len(CapitalInTEXT))

    С латиницей прокатил бы такой вариант:
    STR_TEXT = "CapitalInTEXT = [c for c in STR_TEXT if 'A' <= c <= 'Z']"
    CapitalInTEXT = [c for c in STR_TEXT if 'A' <= c <= 'Z']

    С кириллицей так не выйдет: в юникоде, например
    In [1]: ''.join(chr(i) for i in range(1025, 1072))
    Out[1]: 'ЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'
    в других кодировках по-другому.

    Чтож, попрактикуемся в бинарном поиске:
    AllCapitalLetters = 'ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'
    # обрати внимание на порядок букв
    # на неотсортированном AllCapitalLetters алгоритм виснет
    CapitalInTEXT = []
    for c in STR_TEXT:
        i = 0
        j = len(AllCapitalLetters) - 1
        while i <= j:
            m = (i + j) // 2
            cm = AllCapitalLetters[m]
            if c > cm:
                i = m + 1
            elif c < cm:
                j = m - 1
            else:
                CapitalInTEXT.append(cm)
                break

    Вместо самописа можно воспользоваться стандартной библиотекой:
    from bisect import bisect_left
    
    AllCapitalLetters = 'ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'
    CapitalInTEXT = []
    for c in STR_TEXT:
        idx = bisect_left(AllCapitalLetters, c)
        if idx < len(AllCapitalLetters) and c == AllCapitalLetters[idx]:
            CapitalInTEXT.append(c)


    По быстродействию простой вариант в 8 раз лучше варианта с bisect и 24 раза лучше самописного.
    На этой задаче бинарный поиск бесполезен. А полезен он, например, при поиске ближайших соседей испытуемой буквы, которой в AllCapitalLetters нет, напр. буквы "Ї".
    Ответ написан
    8 комментариев
  • Как распределить время при обучении программированию?

    @danSamara
    Мой ответ будет несколько груб и не типичен, однако: "Станьте говнокодером!"
    Я не шучу - берите реальные задачи и решайте их как можете - по наитию, по кривым советам из гугла и stackoverflow, но главное - делайте законченные решения, получайте результат который работает.
    Любую задачу сначала решайте сами - нужно сделать сортировку - пишите алгоритм и радуйтесь, что он работает. А уже потом - читайте как надо сделать, и только после этого (если почувствуете потребность!) - читайте теорию.
    Все книги что вы написали безусловно волшебны и необходимы для отличного программиста, однако без практики они - пыль, которая развеется спустя неделю после прочтения. Поверьте мне, я их все читал :)
    Кстати Кнута я бы вычеркнул без раздумий - для его чтения и понимания нужен очень хороший мат-базис и опыт в программировании. Если случиться, что вы будете писать оптимизированные библиотеки для обработки данных на С - тогда и начинайте его читать, очень пригодится, отвечаю )
    Пример обучения:
    1. Ставим задачу. Пример - написать приложение, которое выводит топ-10 вопросов на Тостере.
    2. Разбиваем задачу на проблемы которые надо решить. Пример - развернуть рабочее окружение, понять как сделать "Hi world", как работать с сетью, как парсить HTML
    3. Решаем проблемы. В лоб. Задание - на скорость, всё должно быть решено в кратчайшие скроки. Для каждой проблемы используем любое решение которое попалось под руку. Буквально - первое, это важно! То есть реально ковнокодим, забивая на всё - на красоту кода, на оформление, на скорость, лишь бы работало! Девиз этого этапа - херак, херак и в продакшен! Результат этапа - рабочее приложение.
    4. Делаем поверхностный анализ. Задача решена? Есть ли косяки которые уже не нравятся? Как их можно решить, исходя из минимального опыта? Локализуем проблемные участки исходя из собственных взглядов. Результат этапа - опыт самостоятельного анализа кода.
    5. Делаем глубокий анализ. Пытаемся для каждой задачи подобрать лучшее решение из тех что есть. Читаем теорию о том, как надо делать на самом деле. Изучаем и внедряем паттерны, пытаемся сделать код, который можно переносить в другой проект. Важно не менять условия задачи, вроде "а можно же ещё вывести ответы на вопросы". Не можно, задача должна оставаться прежней. Результат этапа - хороший код и выявленные пробелы в знаниях.
    6. Отдыхаем, читая теорию в рамках решённых задача и около них. Результат - теория, подкреплённая практикой.
    7. GOTO 1.
    Ответ написан
    2 комментария
  • Как распределить время при обучении программированию?

    Stroy71
    @Stroy71
    Век живи-век учись.
    Из опыта:
    1. Не пытайтесь изучать маловостребованные, но перспективные языки(Python, Perl и т.д.). Идеальный выбор- PHP или JavaScript. В первом случае, количество потенциальных работодателей падает в разы. Количество же претендентов("молодых-перспективных"), не так сильно, как хотелось бы.
    2. Не "растекайтесь мыслию по древу". (Решите, какие навыки оттачивать в первую очередь: практические-по американской системе, или все сразу-по советской системе. далее об амер. сис-ме)Т.е. сосредоточьтесь на решении практических задач. После получения определенного уровня можно будет перейти к практике задач требующих знания теории алгоритмов и т.д и т.п.
    ИМХО, лично я изучал(после знакомства с Паскалем в ВУЗе) в таком порядке: (нумерация исходя из Вашего списка):3(или его аналога)-до полного освоения. 4-по мере потребности 3.
    4 и 2, ИМХО, излишни, и требуют особого изучения для "особо-продвнутых"
    3. V желательно изучать на продвинутых ступенях, изучив 3 и, более-менее 4.
    Время изучения(по порядку изучения,ИМХО):
    1.3-20%(примерно)
    2.4- 5-10%
    3.5- 5-10%
    4. 1- 60%
    5..2(если оч. понадобится)-около 10%.
    P. S. Из всех книг, указанных в разделе 2, особо тщательно рекомендую проштудировать Д.Кнута.
    Ответ написан
    8 комментариев
  • Как распределить время при обучении программированию?

    God-emperor
    @God-emperor
    create a golden path
    1) Алгоритмы + база языка
    Вы изучаете/пишите реализацию алгоритмов, тем самым осваивая базовый синтаксис языка.
    2) Определяете 2-3 более обширные задачки на бизнес-логику, решаете их с помощью базовых средств вашего основного языка (Учим язык на продвинутом уровне)
    3) Решаем данные задачи с помощью парочки фреймворков, сравниваем.
    4) Дальше в любом порядке (параллельно или последовательно тоже не важно) изучаете оставшийся материал, который вас интересует на ваших же примерах. Т.е. доделываете, переделываете и т.д.

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

    Сначала найди человека, который ЗАХОЧЕТ тебя учить. Поставит реальные задачи и выстроит твое обучение в систему. Один ты не пройдешь этот путь.
    Реальная разработка далека от тем, которые ты поднял. Эти темы хороший фундамент, для разработчика. Но освоить их дело не быстрое. И без ментора, 90% вероятность уйти в излишее углубление - а значит, потерять время и стать болтуном теоретиком, который все-равно не может писать код.
    Лишнего времени у тебя нет вообще. Программистами 80% работают молодые, 20-28 летние ребята и возится с тобой они просто не захотят.
    Поэтому тебе надо бить только в цель.
    Так, что рвись за реальным опытом. За реальным пониманием - как это работает. Большая теория computer science пока не твой друг. Кстати как у тебя с английским? Скорее всего почти никак. Поэтому ближайшие год - полтора, ты будешь осваивать его, для беглого чтения. 90% полезной для разработчика информации, на английском, инет и книги.
    Попробуй сейчас поискать фирму которая тебя возмет, когда ты станешь крут - и это будет очень сложно. Возраст и отсутствие опыта это весомый фактор.
    Скорее всего, тебе надо найти узкую, востребованную специализацию и долбить ее все это время, не теорию!, а навыки. Понять какие есть несложные популярные задачи на фриланс бирже, и научиться с помощью ментора делать только их. Начать этим зарабатывать. А потом будет понятно, что дальше. Насколько ты вообще это способен делать.
    Береги здоровье. Поддерживай и развивай его. Программирование очень затратная деятельность, особенно когда тебе за 36.
    Мне сейчас 38, я сам несколько лет был любитель теории и академического самообразования для разработчика. Недавно пришло осознание, что это тупик. Программирование сейчас - это куча реальных процессов разработки, на многих уровнях, и темах. Им не обучишься самостоятельно. Недавно нашел удаленно хороших знакомых, которые ХОТЯТ помочь мне научиться. Стал видеть их глазами, и все наконец задвигалось. Мне сейчас срочно нужны не перечисленные тобой книги (хотя я их действительно частично изучил), а понимание web-протоколов, unix, принципов тестирования, ООП, кучи используемых библиотек, разговорного английского, частично frontend технологии и тп.
    Так, что братан держись! И да, сопутствует нам удача.
    Кстати, я практикую тайчи. Это поддержка на всех уровнях. Без этого я не сунулся бы в подобные авантюры.

    --
    Update 0:

    Решил пойти коротким путем (в частности, после твоего вопроса) и выделить деньги на курсы Ruby On Rails. Записался вот сюда Ссылка удалена модератором.

    Одна из целей курса: помочь человеку развиться до достаточного уровня, чтобы устроиться на работу крепким junior-программистом. Большая проблема для джуниоров на рынке RoR - это получение первой работы.

    Для курса требуется уже некоторый уровень знаний всего стека разработки (от Unix - до самого фреймворка RoR).

    Из сразу заметных плюсов курсов:
    - наличие активного форума сообщества обучающихся
    - видны топики студентов прошлых наборов, можно посмотреть какие были вопросы и ньюансы
    - в форум постятся вакансии
    - есть обсуждения: как лучше вести себя джуниору, полезная литература и другие вкусные фишки...

    Важным, оказалось, что здесь есть сообщество единомышленников; тех кто хочет изучить Ruby On Rails и устроиться на работу. Это позволяет лучше понять себя - видя работу других. А также постановка задач куратором позволяет лучше фокусировать свои усилия при изучениии, что сложно самообучаясь.

    Курсы будут идти три месяца.
    Ответ написан
    2 комментария
  • Как вы управляете своей базой знаний? Какие инструменты для этого используете?

    @Lexans
    Не надеюсь что среднестатистический участник тостера подскажет вам что-то, кроме мейнстрима, о котором вы наверняка знаете, но все же попытаюсь

    Archivarius 3000: полнотекстовый локальный поиск по свалка книг

    OneNote: упорядочивание в иерархию всего и вся, удобнейший поиск, теги (например "todo", "вопрос", "важно" - всё настраивается), формулы, синхронизация с мобильным. Использую для ведения базы знаний несколько лет, evernote не конкурент. Не подходит для свалки материалов, но идеален для конспектов и организации рабочей информации.

    Anki: колоды карт вопрос -ответ вместе с умным алгоритмом запоминания методом периодического повторения
    Ответ написан
    2 комментария