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 предприятиях и организациях Республики Мордовия. В том числе в таких знаковых организациях, как — ОАО «СаранскМежРайГаз», ЗАО «Конвертор»,...

разработка сайта организации Новый-Уренгой

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

Cертификация серверов на базе СП «Прометей» в 1С Новый-Уренгой

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

стоимость медицинского сайта Новый-Уренгой

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

Ознобин Роман Александрович Новый-Уренгой

директор ООО «Код Эксперт — РМ», управляющий партнёр ООО «Код Эксперт», CEO, руководитель порталов ; «Позади более 100 сайтов и WEB приложений, десятки организаций и Servers, внедрений и разработок. Но более всего я горжусь победой на конкурсе инновационных порталов Министерства Экономики и Технологий Германии в Гановере, где разрабатываемые нами технологии оптимизации для Linux Os показали реальное ускорение вычислительных процессов с использованием больших массивов данных на 12%!!! А так же благодарностью людей доверивших нам свои заботы и надежды.»  С наилучшими пожеланиями, Ознобин Роман Награды: Призёр (3-е место) на конкурсе инновационных порталов Министерства экономики и технологий Федеративной Республики Германия. Гановер. 10.11.2011 Победитель конкурса Лучший предприниматель Республики Мордовия 2013 года в номинации «Эффективные инновации и новые технологии в малом и среднем бизнесе». Как член команды ООО «Код – Эксперт» в должности...

продвижение сайта в топ цена Новый-Уренгой

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

продвижение интернет магазина Новый-Уренгой

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

разработка индивидуальных сайтов Новый-Уренгой

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