LoveRead.info » Книги » Разная литература » Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих - Адитья Бхаргава

Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих - Адитья Бхаргава

Книгу Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих - Адитья Бхаргава читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

3 910 0 10:02, 19-11-2022
Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих - Адитья Бхаргава
19 ноябрь 2022

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

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

    1 ... 26 27 28 29 30 31 32 33 34 ... 46
    Перейти на страницу:

    stations["kthree"] = set(["or", "nv", "ca"])

    stations["kfour"] = set(["nv", "ut"])

    stations["kfive"] = set(["ca", "az"])

    Ключи — названия станций, а значения — сокращенные обозначения штатов, входящих в зону охвата. Таким образом, в данном примере станция kone вещает в штатах Айдахо (id), Невада (nv) и Юта (ut). Все значения являются множествами. Как вы вскоре увидите, хранение данных во множествах упрощает работу.

    Наконец, нам понадобится структура данных для хранения итогового набора станций:

    final_stations = set()

    Вычисление ответа

    Теперь необходимо вычислить набор используемых станций. Взгляните на диаграмму и попробуйте предсказать, какие станции следует использовать.

    Учтите, что правильных решений может быть несколько. Вы перебираете все станции и выбираете ту, которая обслуживает больше всего штатов, не входящих в текущее покрытие. Будем называть ее best_station:

    best_station = None

    states_covered = set()

    for station, states_for_station in stations.items():

    Множество states_covered содержит все штаты, обслуживаемые этой станцией, которые еще не входят в текущее покрытие. Цикл for перебирает все станции и находит среди них наилучшую. Рассмотрим тело цикла for:

    covered = states_needed & states_for_station

    if len(covered) > len(states_covered)   

    Новый синтаксис! Эта операция называется "пересечением множеств"

      best_station = station

      states_covered = covered

    В коде встречается необычная строка:

    covered = states_needed & states_for_station

    Что здесь происходит?

    Множества

    Допустим, имеется множество с названиями фруктов.

    Также имеется множество с названиями овощей.

    С двумя множествами можно выполнить ряд интересных операций.

    • Объединение множеств означает слияние элементов обоих множеств.

    • Под операцией пересечения множеств понимается поиск элементов, входящих в оба множества (в данном случае — только помидор).

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

    Пример:

    >>> fruits = set(["avocado", "tomato", "banana"])

    >>> vegetables = set(["beets", "carrots", "tomato"])

    >>> fruits | vegetables      Объединение множеств

    set(["avocado", "beets", "carrots", "tomato", "banana"])

    >>> fruits & vegetables      Пересечение множеств

    set(["tomato"])

    >>> fruits – vegetables      Разность множеств

    set(["avocado", "banana"])

    >>> vegetables – fruits    Как вы думаете, как будет выглядеть результат?

    Еще раз напомню основные моменты:

    • множества похожи на списки, но множества не содержат дубликатов;

    • с множествами можно выполнять различные интересные операции — вычислять их объединение, пересечение и разность.

    Вернемся к коду

    Продолжим рассматривать исходный пример.

    Пересечение множеств:

    covered = states_needed & states_for_station

    Множество covered содержит штаты, присутствующие как в states_needed, так и в states_for_station. Таким образом, covered — множество штатов, не входящих в покрытие, которые покрываются текущей станцией! Затем мы проверяем, покрывает ли эта станция больше штатов, чем текущая станция best_station:

    if len(covered) > len(states_covered):

      best_station = station

      states_covered = covered

    Если условие выполняется, то станция сохраняется в best_station. Наконец, после завершения цикла best_station добавляется в итоговый список станций:

    final_stations.add(best_station)

    Также необходимо обновить содержимое states_needed. Те штаты, которые входят в зону покрытия станции, больше не нужны:

    states_needed -= states_covered

    Цикл продолжается, пока множество states_needed не станет пустым. Полный код цикла for выглядит так:

    while states_needed:

      best_station = None

      states_covered = set()

      for station, states in stations.items():

        covered = states_needed & states

        if len(covered) > len(states_covered):

          best_station = station

          states_covered = covered

    states_needed -= states_covered

    final_stations.add(best_station)

    Остается вывести содержимое final_stations:

    >>> print final_stations

    set(['ktwo', 'kthree', 'kone', 'kfive'])

    Этот результат совпадает с вашими ожиданиями? Вместо станций 1, 2, 3 и 5 можно было выбрать станции 2, 3, 4 и 5. Сравним время выполнения жадного алгоритма со временем точного алгоритма.

    Упражнения

    Для каждого из приведенных ниже алгоритмов укажите, является этот алгоритм жадным или нет.

    8.3 Быстрая сортировка.

    8.4 Поиск в ширину.

    8.5 Алгоритм Дейкстры.

    NP-полные задачи

    Для решения задачи о покрытии множества необходимо вычислить каждое возможное подмножество.

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

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

    Сколько маршрутов необходимо вычислить для пяти городов?

    Задача о коммивояжере — шаг за шагом

    Начнем с малого. Допустим, городов всего два. Выбирать приходится всего из двух маршрутов.

    Логично спросить: в задаче о коммивояжере существует ли конкретный город, с которого нужно начинать? Допустим, коммивояжер живет в Сан-Франциско и должен посетить еще четыре города. Сан-Франциско должен быть

    1 ... 26 27 28 29 30 31 32 33 34 ... 46
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

    Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


    Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

    • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
    • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
    • 3. Просьба отказаться от нецензурной лексики.
    • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

    Надеемся на Ваше понимание и благоразумие. С уважением, администратор LoveRead.info.


    Установить VPN и читай слушай бесплатно

    Новые отзывы

    1. awaynice awaynice21 июнь 16:59 Книга в которой начинаешь сходить с ума вместе с героем: было или не было? Ксчастб, она короткая.... Эхо забвения - Хелен Гард
    2. Ольга Ольга20 июнь 23:30 Очень миленько. Но не характерно для автора. До последней строчки была в напряжении, кто погибне т.... Бывший. Добьюсь тебя снова - Марта Макова
    3. Анна Анна19 июнь 19:20 Спасибо за ещё одну новиночку,так приятно и волнительно читать,особенно когда переплетается с другими историями.... Даже не сомневайся - Юлия Резник
    Все комметарии
    Новинки бесплатной онлайн библиотеки