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% Вы можете комплексно заказать поисковое раскрутка сайта Тёплый-Стан и мы проведем полную работу по настройкам ядра Вашего on-line ресурса для поискового адаптации и получения лучшего результата. Улучшая рейтинг страниц, благодаря проведённому анализу и оптимизации Вашего on-line ресурса, Вы привлечете больше трафика, т.е. больше целевых посетителей, что и является конечной целью поискового адаптации Вашего on-line портала. заказать поисковое раскрутка сайта Тёплый-Стан по доступной цене у нашей компании, означает довериться 15 летнему опыту усилия в этой области и получить хороший результат. Говоря о целевых посетителях мы имеем ввиду что это те люди...

8 основных структур данных в Python Тёплый-Стан

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

разработка коммерческого сайта Тёплый-Стан

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

стоимость медицинского сайта Тёплый-Стан

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

стоимость продвижения сайта Тёплый-Стан

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

заказать продвижение сайта Тёплый-Стан

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

разработка сайтов цена Тёплый-Стан

Что бы создание сайтов цена Тёплый-Стан на который будет доступна Вашему бюджету, отвечала Вашим поставленным задачам обратитесь к нам. Более 15 лет опыта в разработке для разных направлений в бизнесе, делает нас гарантом хорошего результата. Цены на наши сервис Вы можете уточнить в этом разделе или же сделав заявку онлайн, тогда мы произведем расчет соответствующий Вашим задачам и требованиям. Если же Вам необходима консультация Вы можете позвонить нам и мы ответим на все интересующие вопросы. создание сайтов цена Тёплый-Стан может колебаться от 3-4 тыс руб. и доходит до сотен тысяч у разных компаний, в первую очередь это зависит от ценовой политики компании разработчика и от сложности выполнения портала. Мы предлагаем Вам заказать установку под ключ, цены на которые зависят от Ваших целей и сложности портала. Но в любом случае цена на оказываемые нами сервис более доступны, поэтому к нам обращаются за комплексом работ по производству и оптимизации сайтов. Качественная создание...