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 Магас

продвижение сайта в топ Магас

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

купить продвижение Магас

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

поисковое продвижение сайта Магас

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

Реализованный проект для сферы грузоперевозок Магас

ООО «Диамант» специализируется на офисных и квартирных переездах, а так же прочих усилийах погрузки и выгрузки в Москве. Заказчик решил заказать вебсайт с простым Лендингом стартовой страницы сайта. Так же планировалось производить самостоятельное размещение информационных материалов, с возможностью редактирования материалов сайта. сайта под ключ составила — 21 400 руб.. Для того что бы заказать вебсайт у нас, вам надо лишь отправить заявку нам на почте или связаться с нами любым из перечисленных в разделе Контакты методов, мы свяжемся с Вами и поможем определится с техническим заданием, дизайном и ценой. Сравнение методов объединения двух отсортированных списков в Python — получи СКИДКУ 10% ООО «Код Эксперт — РМ» — осуществляет комплексную установку, поддержку и раскрутка сайтов   Индивидуальный Предприниматель Ознобин Р.А.8-927-977-80-70...

создание сайта интернет магазина цена Магас

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

разработка коммерческого сайта Магас

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

разработка сайта визитки Магас

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

заказать создание сайта Магас

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