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 Элиста

Наша работа для компании натяжных потолков Элиста

Разработан новый сайт. Частный предприниматель решил заказать простой, но красивый сайт о натяжных потолках. Основным требованием было — красивый лендинг (оформление главной страницы) и красивые галереи «Выполненных работ». Из функционала сайта, был заказан всплывающий элемент — «Отправить заказ». Базовая цена сайта составила — 11 600 руб. ! наполнение сайта материалами — от 300 до 1000 руб. за страницу  (в зависимости от наличия и объёмов таблиц, фото и текстов). визуальных эффектов сайта — 5 000 руб.. Лендинга сайта (главной страницы сайта) — 6 000 руб. Что бы заказать сайт у нас, вам надо лишь отправить заявку с данного сайта или связаться с нами любым из перечисленных в разделе Контакты методов. Мы свяжемся с Вами и поможем определится с техническим заданием, дизайном и ценой сайта. ООО «Код Эксперт — РМ» — общая создание, тех.поддержка и раскрутка сайтов. Посмотреть...

система продвижения сайтов Элиста

Поисковые системы, такие как Google, Yandex, Mail и др., создают стандарты, которые служат руководством для разработки системы адаптации сайтов Элиста в поисковых комплексах. Статистика показывает, что сайты получают самое большое количество трафика посещений — от on-line-поиска. Сравнение методов объединения двух отсортированных списков в Python — получи СКИДКУ 10% Есть два основных способа адаптации сайтов с помощью поисковых систем-это поисковая оптимизация (SEO) и платная поисковая реклама. Система адаптации сайтов Элиста SEO-это процесс улучшения веб-сайта, чтобы контент занимал высокое место в поисковых комплексах. В платной поисковой рекламе компании покупают платные объявления, используя выбранные ключевые слова. Чаще всего рекламодатель имеет план и анализ по ключевым запросам клиентов, но мы готовы разработать его с нуля. Каждый раз, когда Ваш потенциальный  клиент выполняет...

заказать поисковое продвижение сайта Элиста

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

разработка сайта под ключ Элиста

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

купить продвижение Элиста

Если Вы хотите купить раскрутка Элиста по доступной цене, то Вам стоит знать что это такое и сколько это стоит. Мы предлагаем действительно выгодные цены, комплексное обслуживание и при долгосрочном заказе дарим сайт в подарок! Покупая  раскрутка сайта, вы покупаете не только усилия с использованием сразу нескольких инструментов и достижение нескольких целей, в том числе закупку и усилия по размещению внешних ссылок на целевой сайт, раскрутку в соц сетях, рост доверия поисковых систем и потребителей, а так же имидж «Первого» в вашем регионе. Именно так и только так можно добиться хорошего результата. SEO раскрутка в свою очередь напрямую влияет на посещаемость заинтересованными людьми, а значит и на количество проданного товара. Сравнение методов объединения двух отсортированных списков в Python — получи СКИДКУ 10% Вашей on-line витрины и как следствие на количество продаж через...

сео продвижение сайта Элиста

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

seo продвижение сайтов Элиста

раскрутка сайтов в Элиста для начинающего и уже действующего дела играют ключевую роль в успехе и развитии.  Предлагая реальную ценность, товары и сервис для ваших клиентов, вам выгодно быстро и эффективно доносить данные до целевой аудитории, которая может стать вашими покупателями через поиск в сети on-line. Сравнение методов объединения двух отсортированных списков в Python — получи СКИДКУ 10% ИП Ознобин Р.А. имеет 15 летний опыт в создании и оптимизации web сети порталов, обеспечивая качественный результат не зависимо от того является ли ваш бизнес региональным, национальным или международным. Наша компания постоянно достигает коммерческих целей наших клиентов, генерируя реальные продажи по доступным условиям. Мы предлагаем разработать план по оптимизации Вашего портала Элиста и превратить его в реальность по всем стандартам разработки W3C (World Wide Web Consortium) и следуя...

создание и продвижение сайтов Элиста

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