8-(927)-977-80-70 web-i-seo@yandex.ru
Режим работы: 10-00 до 20-00 МСК

Вы нашли нас по запросу -"Сравнение методов объединения двух отсортированных списков в Python Орехово-Зуево" - это лучшая рекомендация для подрядчика SEO продвижения в городе Орехово-Зуево или по России!

Сравнение методов объединения двух отсортированных списков в Python

Пусть у нас есть два списка (для простоты из целых чисел), каждый из которых отсортирован. Хотим объединить их в один список, который тоже должен быть отсортирован. Эта задача наверняка всем знакома, используется, например, при сортировке слиянием.

 

 

Способов реализации (особенно на python) достаточно много. Давайте разберем некоторые из них и сравним затрачиваемое время на разных входных данных.

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

 

Входные данные не меняются

Пусть есть два списка list1 и list2.

Начнем с самого простого алгоритма: обозначим метки за i и j и будем брать меньший из list1[i]list2[j] и увеличивать его метку на единицу, пока одна из меток не выйдет за границу списка.

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

Перейдем к коду:

def simple_merge(list1, list2):
    i, j = 0, 0
    res = []
    while i < len(list1) and j < len(list2):
        if list1[i] < list2[j]:
            res.append(list1[i])
            i += 1
        else:
            res.append(list2[j])
            j += 1
    res += list1[i:]
    res += list2[j:] 
    # один из list1[i:] и list2[j:] будет уже пустой, поэтому добавится только нужный остаток
    return res

 

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

 

Еще изменим обработку концов списков, так как теперь мы не умеем копировать сразу до конца. Будем обрабатывать элементы до того, когда оба итератора дойдут до конца, при этом, если один уже оказался в конце, будем просто брать из второго.

 

def iter_merge(list1, list2):
    result, it1, it2 = [], iter(list1), iter(list2)
    el1 = next(it1, None)
    el2 = next(it2, None)
    while el1 is not None or el2 is not None:
        if el1 is None or (el2 is not None and el2 < el1):
            result.append(el2)
            el2 = next(it2, None)
        else:
            result.append(el1)
            el1 = next(it1, None)
    return result

 

В этой реализации можно вместо добавления по одному элементу (result.append()) собрать генератор, а потом из него получить список. Для этого напишем отдельную функцию, которая будет строить генератор, а основная функция сделает из него список.

 

def gen_merge_inner(it1, it2):
    el1 = next(it1, None)
    el2 = next(it2, None)
    while el1 is not None or el2 is not None:
        if el1 is None or (el2 is not None and el2 < el1):
            yield el2
            el2 = next(it2, None)
        else:
            yield el1
            el1 = next(it1, None)

def gen_merge(list1, list2):
    return list(gen_merge_inner(iter(list1), iter(list2))) # из генератора получаем список

 

Встроенные реализации

Рассмотрим еще несколько способов слияния через встроенные в python функции.

  • merge из heapq. Как говорит документация, эта функция делает именно то, что мы хотим, и больше: объединяет несколько итерируемых объекта, можно задать ключ, можно сортировать в обратном порядке.
    Тогда нам нужно просто импортировать и использовать:

    from heapq import merge
    
    def heapq_merge(list1, list2):
        return list(merge(list1, list2)) # тоже возвращает генератор
  • Counter из collectionsCounter умеет считать количество вхождений каждого из элементов, выдавать их в тех количествах, в которых они входят, и еще несколько полезных вещей, которые сейчас не нужны (например, несколько самых часто встречающихся элементов).
    Воспользуемся gen_merge_inner для слияния элементов Counter(list1) и Counter(list2):

    def counter_merge(list1, list2):
        return list(gen_merge_inner(Counter(list1).elements(), Counter(list2).elements()))
  • И, наконец, просто сортировка. Объединяем и сортируем заново. Тут есть два варианта реализация через sort() и sorted(). Сразу сравним их:
list1 = [i for i in range(1, 200000, 3)]
list2 = [i for i in range(2, 250000, 4)]
%timeit res1 = sorted(list1 + list2)
%timeit res2 = list1 + list2; res2.sort()
6.73 ms ± 64.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
4.43 ms ± 38.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

В результате:

    def sort_merge(list1, list2):
        return (list1 + list2).sort()

Если можно менять исходные списки

 

Предположим, что после слияния старые списки больше не нужны (как обычно и случается). Тогда можно написать еще один способ. Будем как и раньше сравнивать нулевые элементы списков и вызывать pop(0) у списка с меньшим, пока один из списков не закончится.

 

def pop_merge(list1, list2):
    result = []
    while list1 and list2:
        result.append((list1 if list1[0] < list2[0] else list2).pop(0))
    return result + list1 + list2

 

Получили простенькую функцию на 4 строчки, но использовать дальше исходные списки не получится. Можно их скопировать, потом работать с копиями, но это потребует много дополнительного времени. Здесь будут проблемы с тем, что удаление нулевого элемента очень дорогое. Поэтому еще одна модификация будет заключаться в том, что мы будем вместо удаления из начала списка использовать удаление из конца, но придется в конце развернуть списки.

 

def reverse_pop_merge(list1, list2):
    result = []
    while list1 and list2:
        result.append((list1 if list1[-1] > list2[-1] else list2).pop(-1))
    return (result + list1[-1::-1] + list2[-1::-1])[-1::-1]

 

Сравнение

 

Пора перейти к самому интересному.
Составим список функций, которые будем сравнивать:

 

  • simple_merge
  • iter_merge
  • gen_merge
  • heapq_merge
  • counter_merge
  • sort_merge
  • pop_merge
  • reverse_pop_merge

 

Будем измерять время работы с помощью модуля timeit. Код можно посмотреть здесь.

 

Разберем несколько ситуаций: оба списка примерно одинакового размера, один список большой, а второй маленький, количество вариантов элементов большое, количество вариантов маленькое. Кроме этого проведем просто общий случайный тест.

Тест первый

 

Проведем общий тест, размеры от $1$ до $10^5$, элементы от $1$ до $10^6$.

 

Отдельно сравним pop и reverse_pop:

 

 

pop_merge тратит колоссально больше времени в общем случае, как и ожидалось.

 

Не будем учитывать здесь огромный pop_merge, чтобы лучше видеть разницу между другими:

 

 

reverse_pop_merge показал себя относительно неплохо по сравнению с ручной реализацией и heapq_merge.

 

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

 

Тест второй, сравнимые размеры

 

Размеры будут принадлежать отрезку $[50x, 50(x+1))$, а $x$ увеличиваем, начиная с $1$. Шаг $50$.

 

 

Как уже можно видеть pop_merge при небольшом размере списков еще ведет себя как heapq_merge, а дальше обгоняет всех.

 

Тест третий, один маленький, второй большой

 

Размер первого равен $x$, размер второго $10^4 + 100x$.

 

 

В самом начале (на очень маленьких списках) reverse_pop_merge обгоняет всех, кроме sort_merge, но на чуть больших все выходит на стандартные позиции.

 

Тест четвертый, много повторных

 

Размеры фиксированы, а количество элементов увеличивается на $5$, начиная с $1$.

 

 

Как видно, на достаточно малых количествах counter_merge оказывается быстрее reverse_pop_merge и heapq_merge, но потом он отстает.

 

Чемпионы

Абсолютным победителем оказался sort_merge! Гораздо быстрее просто отсортировать список заново, чем использовать вроде бы линейные от длины списков функции.

На втором месте в подавляющем большинстве случаев идет gen_merge, за ним следует iter_merge.

Остальные методы используют еще больше времени, но некоторые в каких-то крайних случаях достигают результатов 2-3 мест.

Дата изменения


Индивидуальный Предприниматель Ознобин Р.А.
8-927-977-80-70
Адрес: г. Орехово-Зуево, ул. Строителей, строение 12

Полезная информация по теме - Сравнение методов объединения двух отсортированных списков в Python Орехово-Зуево

стоимость seo продвижения сайта Орехово-Зуево

Узнать стоимость адаптации сайта Орехово-Зуево Вы можете у нас на странице заказа или связавшись удобным способом с нашим специалистом. поисковая оптимизация сайта — это современная технология необходимая как любая другая реклама, поскольку потребитель может искать ваши продукты или сервис с помощью поисковой системы, такой как Google, Yandex, Mail и другие. стоимость адаптации сайта Орехово-Зуево — При предоплате за 3-месяца и получи скидку 10%. Вы нашли нас в ТОП10 поиска по запросу «стоимость адаптации сайта» Орехово-Зуево — это лучшая реклама!!! cтоимость адаптации сайта Орехово-Зуево варьируется в зависимости от многих факторов. Традиционные маркетинговые концепции, включающие визуальный маркетинг и аудиомаркетинг, такие как реклама на телевидении, радио и на рекламных щитах, существуют уже давно, и существует множество статистических данных и данных, доказывающих, что эти методы чрезвычайно полезны для...

Вебсайт поставщика строительных материалов Орехово-Зуево

Создан новый сайт для крупного поставщика строительных материалов ООО «Берг» ООО «Берг» занимается комплексной поставкой строительных материалов и комплектацией строительных объектов. Заказчик решил заказать корпоративный сайт и онлайн магазином, это позволяет клиентам заказчика формировать и оплачивать заказы он-лайн. ЧТо особенно удобно для частного заказчика. сайта составила — 47 300 руб.. Для того что бы заказать сайт у нас, вам надо лишь отправить заявку нам на почте с данного сайта или связаться с нами любым из перечисленных в разделе Контакты методов. Мы свяжемся с Вами и поможем определится с техническим заданием, дизайном и ценой сайта. ООО «Код Эксперт — РМ» — осуществляет комплексную установку, поддержку и раскрутка сайтов. Посмотреть сайт заказчика … ...

заказать сео продвижение сайта Орехово-Зуево

Для того чтобы заказать сео раскрутка сайта  Орехово-Зуево  советуем Вам ознакомиться с нашими предложениями, определив масштаб портала и цель к примеру рекламной компании выведения нового продукта на on-line рынок. Раскрутка Вашего портала по доступным ценам у нас это гарантированный результат поставленной цели. Сравнение методов объединения двух отсортированных списков в Python — получи СКИДКУ 10% Как правило сотрудник в штате Вашей компании будет обходиться дороже чем заказать такую усилийу у специализирующейся компании на оптимизации on-line ресурсов Более того квалификация специалиста в данной области влияет так же на результат и успех сео адаптации. Поэтому мы рекомендуем заказать сео — у действительно опытной компании, т.к. в итоге Вы сэкономите траты и они быстро окупятся, ведь новые посетители это Ваши клиенты. заказать сео раскрутка...

Аренда интернет магазина Орехово-Зуево

Здравствуйте. У нас есть уникальное предложение для владельцев магазинов! У вас есть бизнес и вы хотите торговать через on-line магазин? Мы предлагаем Вам партнёрскую программу, которая позволит Вам иметь новый канал продаж, техническую поддержку, маркетинговую и SEO поддержку, БЕЗ ПРЕДВАРИТЕЛЬНЫХ ЗАТРАТ ! Мы готовы работать за проценты с реальных продаж ! По предварительному соглашению — мы предоставим Вам : Хостин (вычислительные мощности где «крутится сайт» и тех обслуживание ПО) Ваш индивидуальный домен (имя сайта — по согласованию с Вами) Сайт (Хорошо отлаженный, работающий на мобильных ив браузерах он-лайн магазин) Техническую поддержку (Мы полностью обеспечим работоспособность сайта и его обновления) SEO раскрутка (Мы будем своими силами и средствами продвигать Ваш сайт в ТОП 10) Маркетинговую поддержку ( Мы предоставим Вам хорошо продуманные варианты рекламных компаний на Ваш выбор и будем их технически обслуживать ) Что от Вас — Наполнение...

Веб-мастерская про услуги ремонта и строительства Орехово-Зуево

Создан новый сайт. Заказчик — частный предприниматель из Самары решил заказать вебсайт с перечнем усилий по ремонту и возможностью добавлять фото своих работ. Так же решили сразу заказать раскрутку по запросам о ремонте Самаре. В соответствии со стратегией и выбранными для оптимизации запросами, была составлена карта содержания и прописан мета-движок и сбалансированно содержание. Ведутся постоянные усилия по улучшению позиции в поисковых комплексах по целевым запросам клиента. Сравнение методов объединения двух отсортированных списков в Python — получи СКИДКУ 10% Базовая цена составила — 18 500 руб.. предварительного анализа целевых запросов и составления карты + 7000 руб.. Для того что бы заказать сайт у нас, вам надо лишь отправить заявку нам на почте или связаться с нами любым из перечисленных в разделе Контакты методов, мы свяжемся с Вами и поможем определится с...

Сравнение методов объединения двух отсортированных списков в Python Орехово-Зуево

Пусть у нас есть два списка (для простоты из целых чисел), каждый из которых отсортирован. Хотим объединить их в один список, который тоже должен быть отсортирован. Эта задача наверняка всем знакома, используется, например, при сортировке слиянием. ; ; Способов реализации (особенно на python) достаточно много. Давайте разберем некоторые из них и сравним затрачиваемое время на разных входных данных. Основная идея алгоритма заключается в том, что, поместив по одной метке в начале каждого списка, будем сравнивать отмеченные элементы, брать меньший из них и передвигать метку в его списке на следующее число. Когда один из списков кончается, нужно добавить остаток второго в конец. ; Пусть есть два списка list1 и list2. Начнем с самого простого алгоритма: обозначим метки за i и j и будем брать меньший из list1[i], list2[j] и увеличивать его метку на единицу, пока одна из меток не выйдет за границу списка. При первом сравнении мы выберем минимальный элемент из двух...

разработка сайта организации Орехово-Зуево

Любой бизнес который заинтересован в привлечении новых клиентов через on-line обращается к нам, потому как создание сайта организации Орехово-Зуево  это первый шаг для выполнения поставленной задачи. Если Вас нет в web сети, то Вас не возможно найти. создание сайта организации Орехово-Зуево включает в себя несколько этапов, которые конечно же лучше всего предоставить одной организации специализирующейся на этом. Такие этапы как создание концепции, дизайна, технического задания, логотипа, программная создание, техническое размещение ресурса на хостинге с правильным подбором доменного имени, проработка функционала сайта — все это достаточно большой объем усилия. Мы стараемся при реализации подобного портала сэкономить Ваше время и финансы, предоставьте всю работу сделать нам, конечно с Вашего одобрения и контроля. Актуальна создание сайтов образовательных организаций Орехово-Зуево, т.к. сегодня развивается онлайн обучение и любому вузу или образовательному учреждению,...

купить сайт под ключ Орехово-Зуево

купить сайт под ключ Орехово-Зуево по самым выгодным ценам в короткие сроки и получить хороший результат только у нас, ознакомьтесь с нашими предложениями и выберете подходящий план для Ваших целей.  может варьировать в зависимости от поставщика усилий и сложности исполнения портала. Мы предлагаем взвешенный подход, а именно доступные цены без лишних переплат, комплексное решение, позволяющее вывести Ваш бизнес на новый уровень, создав новый канал продаж. купить on-line магазин под ключ Орехово-Зуево по доступной цене, не просто выгодно Вам, но и при правильном подходе быстро приносит Вам конвертацию посетителей в продажи, что делает затраты вполне обоснованными и продиктованными современными технологиями, ведь все больше покупок совершается в web сети. У нас действительно Вы можете купить сайт под ключ недорого, но мы рекомендуем заказывать не только изготовление, но и его раскрутка в web сети, ведь именно это дает посещение и совершение сделок в web сети. Мы предлагаем Вам...