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 Хамовники

Разработчикам и Франчайзе 1С Хамовники

Здравствуйте. Всех кто трудится на поле внедрения и разработки решений 1С : Платформа 8.2 и выше. Мы приглашаем к сотрудничеству в области замещения серверного ПО Microsoft Windows Server 20xx на серверное решение на основе Серверной платформы «Прометей». Наши сервера и СП «Прометей» основаны на базе ОС Linux CentOs 7, и включают в себя комплекс программ для адаптации и оптимизации усилия Servers с 1С. Наша ценовая политика приятно Вас порадует! И позволит Вам успешно конкурировать по общей цене внедрения в сравнении с конкурентами! Сервера СП «Прометей» показали высокую надёжность и отказоустойчивость, плюс реальное повышение скорости усилия 1С при высоких нагрузках. Сервера СП «Прометей» сертифицированы 1С на совместимость 30 августа 2011 года. В настоящий момент комплекс СП «Прометей» успешно внедрён в 37 предприятиях и организациях Республики Мордовия. В том числе в таких знаковых организациях, как — ОАО «СаранскМежРайГаз», ЗАО «Конвертор»,...

продвижение сайта цена Хамовники

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

сео продвижение сайта цена Хамовники

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

8 основных структур данных в Python Хамовники

Структуры данных — это структуры кода для хранения и организации данных, которые упрощают изменение, навигацию и доступ к информации. Структуры данных определяют способ сбора данных, функциональные возможности, которые мы можем реализовать, и отношения между данными. Структуры данных используются практически во всех областях информатики и программирования, от операционных систем до интерфейсной разработки и машинного обучения. Структуры данных помогают: Управляйте большими наборами данных и используйте их. Быстрый поиск определённых данных в базе данных. Создавайте чёткие иерархические или реляционные связи между точками данных. Упростите и ускорьте обработку данных. Структуры данных являются жизненно важными строительными блоками для эффективного решения реальных проблем. Структуры данных — это проверенные и оптимизированные инструменты, которые дают вам удобную основу для организации ваших программ. В конце концов, вам не нужно переделывать колесо (или конструкцию) каждый раз,...

система продвижения сайтов Хамовники

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

раскрутка сайта Хамовники

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

услуги по разработке сайтов Хамовники

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

Корпоративный сайт от 5000 рублей! Хамовники

Хамовники — Сделай заказ SEO сразу на 3-месяца и получи «Корпоративный Сайт Стандар» за 5000р. Вы нашли нас в ТОП10 поиска по запросу «Корпоративный сайт от 5000 руб.!» Хамовники — это лучшая реклама!!! Главное отличие Корпоративного сайта от Сайта Визитка состоит в возможности управления контентом страниц сайта и возможностью добавлять новые страницы и рубрики (Например — Новости, Акции, Скидки и тп) Для Вас Хамовники — Мы предлагаем вашему вниманию готовое решение «Корпоративный сайт Минимум» от 7500р. и «Корпоративный сайт Стандарт» от 10000р. — это полноценный портал небольшой коммерческой организации,  индивидуального предпринимателя или частной практики. Такое «Готовое решение» содержит весь минимально необходимый функционал для размещения информации и получения заявок от потенциальных клиентов вашего дела. В готовых решениях используется дизайн интерфейса на основе уже готовых...