Алгоритмы неформально. Инструкция для начинающих питонистов - [28]

Шрифт
Интервал


Подсчет шагов

Вместо затрат времени в секундах более надежной метрикой быстродействия алгоритма оказывается количество шагов, необходимых для выполнения алгоритма. Количество шагов в алгоритме — характеристика самого алгоритма, не зависит от архитектуры оборудования, а иногда даже от языка программирования. В листинге 4.3 приведен код сортировки методом вставки из листингов 4.1 и 4.2 с добавлением нескольких строк с командой stepcounter+=1. Счетчик шагов увеличивается каждый раз, когда мы берем со старой полки новую папку для вставки, при каждом сравнении этой папки с другой папкой на новой полке и при каждой вставке папки на новой полке.


Листинг 4.3. Код сортировки методом вставки со счетчиком шагов

def insert_cabinet(cabinet,to_insert):

  check_location = len(cabinet) - 1

  insert_location = 0

  global stepcounter

  while(check_location >= 0):

    stepcounter += 1

    if to_insert > cabinet[check_location]:

        insert_location = check_location + 1

        check_location = - 1

    check_location = check_location - 1

  stepcounter += 1

  cabinet.insert(insert_location,to_insert)

  return(cabinet)

def insertion_sort(cabinet):

  newcabinet = []

  global stepcounter

  while len(cabinet) > 0:

    stepcounter += 1

    to_insert = cabinet.pop(0)

    newcabinet = insert_cabinet(newcabinet,to_insert)

  return(newcabinet)

cabinet = [8,4,6,1,2,5,3,7]

stepcounter = 0

sortedcabinet = insertion_sort(cabinet)

print(stepcounter)

В данном случае при выполнении этого кода мы видим, что для реализации сортировки методом вставки для списка длиной 8 выполняются 36 шагов. Попробуем выполнить сортировку методом вставки для списков другой длины и посмотрим, сколько шагов для этого потребуется.

Для этого напишем функцию, которая подсчитывает шаги, необходимые для сортировки методом вставки для несортированных списков разной длины. Вместо того чтобы записывать каждый несортированный список вручную, мы воспользуемся простым списковым включением в Python для генерирования случайного списка любой заданной длины. Для упрощения генерирования случайных списков в Python можно импортировать модуль Python random. Пример создания случайного несор­тированного списка длины 10:

import random

size_of_cabinet = 10

cabinet = [int(1000 * random.random()) for i in range(size_of_cabinet)]

Наша функция просто генерирует список заданной длины, выполняет код сортировки методом вставки и возвращает итоговое найденное значение для stepcounter.

def check_steps(size_of_cabinet):

  cabinet = [int(1000 * random.random()) for i in range(size_of_cabinet)]

  global stepcounter

  stepcounter = 0

  sortedcabinet = insertion_sort(cabinet)

  return(stepcounter)

Создадим список всех чисел от 1 до 100 и проверим, сколько шагов потребуется для сортировки списка каждой длины:

random.seed(5040)

xs = list(range(1,100))

ys = [check_steps(x) for x in xs]

print(ys)

В этом коде сначала вызывается функция random.seed(). Этот вызов не является необходимым, но гарантирует, что при выполнении того же кода вы получите такие же результаты. Как видите, мы определяем набор значений для x, хранящийся в xs, и набор значений для y, хранящийся в ys. Значения x просто представляют собой числа от 1 до 100, а значения y — количества шагов, необходимые для сортировки случайно сгенерированных списков каждого размера, соответствующего x. Взглянув на вывод, вы увидите, сколько шагов потребуется сортировке методом вставки для случайно сгенерированных списков длины 1, 2, 3... 99. График зависимости между длиной списка и количеством шагов сортировки строится фрагментом, приведенным ниже. Для построения графика импортируется пакет matplotlib.pyplot.

import matplotlib.pyplot as plt

plt.plot(xs,ys)

plt.title('Steps Required for Insertion Sort for Random Cabinets')

plt.xlabel('Number of Files in Random Cabinet')

plt.ylabel('Steps Required to Sort Cabinet by Insertion Sort')

plt.show()

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

Рис. 4.1. Количество шагов при сортировке методом вставки

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


Сравнение с известными функциями

Забудем об искусственной неровности рис. 4.1, проанализируем общую форму кривой и попробуем проанализировать скорость ее роста. На интервале между x = 1 и x = 10 количество шагов растет довольно медленно. После этого кривая постепенно набирает крутизну и становится более неровной. Между x = 90 и x = 100 скорость роста становится очень заметной.

Можно сказать, что с ростом длины списка кривая постепенно становится более крутой, но и это описание не настолько точное, как нам хотелось бы. Иногда нарастающую скорость роста называют экспоненциальной. Имеем ли мы дело с экспоненциальным ростом в данном случае? Строго говоря, существует


Рекомендуем почитать
Проблематика информационного обеспечения геоинформационных систем

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


Справочник по PHP

Вниманию читателей предлагается справочник по PHP.Справочник предназначается для людей, уже освоивших азы программирования на языке PHP.Справочник создан на основе информации, предоставленной на сайте «Справочник Web-языков» www.spravkaweb.ru.


Стандарты программирования на С++. 101 правило и рекомендация

Эта книга поможет новичку стать профессионалом, так как в ней представлен сконцентрированный лучший опыт программистов на С++, обобщенный двумя экспертами мирового класса.Начинающий программист найдет в ней простые и понятные рекомендации для ежедневного использования, подкрепленные примерами их конкретного применения на практике.Опытные программисты найдут в ней советы и новые рекомендации, которые можно сразу же принять на вооружение. Программисты-профессионалы могут использовать эту книгу как основу для разработки собственных стандартов кодирования, как для себя лично, так и для группы, которой они руководят.Конечно, книга рассчитана в первую очередь на профессиональных программистов с глубокими знаниями языка, однако она будет полезна любому, кто захочет углубить свои знания в данной области.


Практика и проблематика моделирования бизнес-процессов

Цель книги – познакомить читателей с существующими подходами и решениями в области моделирования бизнес-архитектуры предприятия. В книге освещаются различные аспекты данной проблематики, в том числе такие вопросы как базовые подходы к моделированию и возможности современных инструментальных средств.Особое внимание уделяется специфике организации проектов по разработке моделей бизнес-архитекуры. На основе практического опыта реализации проектов по моделированию бизнес-процессов в различных предметных областях проанализированы и обобщены типичные риски, ошибки и заблуждения основных участников, даны рекомендации по их предупреждению.


Освой самостоятельно С++ за 21 день

В книге широко представлены возможности новейшей версии программного продукта Microsoft Visual C++. Подробно описаны средства и подходы программирования современных профессиональных приложений. Материалы книги дополнены многочисленными демонстрационными программами, в процессе разработки которых максимально используются возможности программных инструментов Microsoft Visual Studio. Особое внимание уделено новинкам версии 6.0 и новейшим технологиям объектно-ориентированного программирования, включая использование библиотеки MFC и шаблонов классов, а также создание связанных списков.


Использование ListView в режиме виртуального списка

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