python数据结构与算法-13_高级排序算法-分治法

分治法 (Divide and Conquer)

很多有用的算法结构上是递归的,为了解决一个特定问题,算法一次或者多次递归调用其自身以解决若干子问题。
这些算法典型地遵循分治法的思想:将原问题分解为几个规模较小但是类似于原问题的子问题,递归求解这些子问题,
然后再合并这些问题的解来建立原问题的解。

分治法在每层递归时有三个步骤:

  • 分解原问题为若干子问题,这些子问题是原问题的规模最小的实例
  • 解决这些子问题,递归地求解这些子问题。当子问题的规模足够小,就可以直接求解
  • 合并这些子问题的解成原问题的解

归并排序

现在我们就来看下归并排序是是如何利用分治法解决问题的。

  • 分解:将待排序的 n 个元素分成各包含 n/2 个元素的子序列
  • 解决:使用归并排序递归排序两个子序列
  • 合并:合并两个已经排序的子序列以产生已排序的答案

考虑我们排序这个数组:[10,23,51,18,4,31,13,5] ,我们递归地将数组进行分解

在这里插入图片描述

当数组被完全分隔成只有单个元素的数组时,我们需要把它们合并回去,每次两两合并成一个有序的序列。

在这里插入图片描述

用递归代码来描述这个问题:

def merge_sort(seq):
    if len(seq) <= 1:   # 只有一个元素是递归出口
        return seq
    else:
        mid = int(len(seq)/2)
        left_half = merge_sort(seq[:mid])
        right_half = merge_sort(seq[mid:])

        # 合并两个有序的数组
        new_seq = merge_sorted_list(left_half, right_half)
        return new_seq

注意我们这里有一个函数没实现,就是如何合并两个有序数组 merge_sorted_list。其实你在纸上画一画,
合并两个有序数组并不难实现。

在这里插入图片描述

在这里插入图片描述

def merge_sorted_list(sorted_a, sorted_b):
    """ 合并两个有序序列,返回一个新的有序序列

    :param sorted_a:
    :param sorted_b:
    """
    length_a, length_b = len(sorted_a), len(sorted_b)
    a = b = 0
    new_sorted_seq = list()

    while a < length_a and b < length_b:
        if sorted_a[a] < sorted_b[b]:
            new_sorted_seq.append(sorted_a[a])
            a += 1
        else:
            new_sorted_seq.append(sorted_b[b])
            b += 1

    # 最后别忘记把多余的都放到有序数组里
    if a < length_a:
        new_sorted_seq.extend(sorted_a[a:])
    else:
        new_sorted_seq.extend(sorted_b[b:])

    return new_sorted_seq

这样就实现了归并排序,并且你会发现它返回一个新的数组而不是修改原有数组。

时间复杂度

我们来简单看下它归并排序的时间复杂度,假设排序 n 个数字时间复杂度是 T(n),这里为了方便假设 n 是 2 的幂

\begin{align}
T(n)= \begin{cases} c, & \text {if n n n = 1} \ 2T(n/2)+cn, & \text{if n n n > 1} \end{cases}
\end{align}

在这里插入图片描述

总的代价是 c n l g ( n ) + c n cnlg(n)+cn cnlg(n)+cn ,忽略常数项可以认为是 O(nlg(n))。如果这个图看不懂,我们自己求解下也不难,首先我们简化一下,
把常数系数当成 1,得到以下递归式:

\begin{align}
T(n)= \begin{cases} 1, & \text {if n n n = 1} \ 2T(n/2)+n, & \text{if n n n > 1} \end{cases}
\end{align}

在这里插入图片描述

思考题

  • 请你完成归并排序的单元测试
  • 这里实现的归并排序是 inplace 的吗?
  • 归并排序是稳定的吗?稳定指的是排序前后相同大小的数字依然保持相对顺序。

延伸阅读

  • 《算法导论》第 2 章和第 4 章,你需要了解下『主定理』,以及如何求解形如 T ( n ) = a T ( n / b ) + f ( n ) T(n)=aT(n/b) + f(n) T(n)=aT(n/b)+f(n) 的递归式复杂度
  • 了解算法导论上递归式的三种求解方法:代入法,递归树法,主方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/175464.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM的公司仓库管理系统(有报告)。Javaee项目

演示视频&#xff1a; 基于SSM的公司仓库管理系统&#xff08;有报告&#xff09;。Javaee项目 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMvc …

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(七)

分页查询、删除和修改菜品 1. 菜品分页查询1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码开发1.2.1 设计DTO类1.2.2 设计VO类1.2.3 Controller层1.2.4 Service层接口1.2.5 Service层实现类1.2.6 Mapper层 1.3 功能测试1.3.2 前后端联调测试 2. 删除菜品2.1 需求分析…

11月22日星期三今日早报简报微语报早读

11月22日星期三&#xff0c;农历十月初十&#xff0c;早报微语早读。 1、我国自主研发气象无人艇实现首次海上云雾立体观测。 2、国家统计局与国家医疗保障局签署数据共享利用合作协议。 3、三部门&#xff1a;加强全国重点文物保护单位内古树名木保护。 4、油价4连降&#xf…

COMSOL 多场耦合仿真技术与应用”光电常见案例应用

(一)案列应用实操教学&#xff1a; 案例一 光子晶体能带分析、能谱计算、光纤模态计算、微腔腔膜求解 案例二 类比凝聚态领域魔角石墨烯的moir 光子晶体建模以及物理分析 案例三 传播表面等离激元和表面等离激元光栅等 案例四 超材料和超表面仿真设计&#xff0c;周期性超表面…

21款奔驰GLS450升级23P驾驶辅助 提升安全出行

辅助驾驶越来越多的被大家所青睐&#xff01;为了提升驾驶安全性和舒适便捷性奔驰改装原厂半自动驾驶23P辅助系统 23P智能辅助驾驶系统还是很有必要的&#xff0c;因为在跑高速的时候可以使用23P智能驾驶的自动保持车速&#xff0c;保持车距&#xff0c;车道自动居中行驶以及自…

数据集笔记:Pems 自行下载数据+python处理

以下载District 4的各station每5分钟的车速为例 1 PEMS网站下载数据 点击红色的 选择需要的station和区域&#xff0c;点击search&#xff0c;就是对应的数据&#xff0c;点击数据即可下载 &#xff08;这个是station每5分钟的速度数据&#xff09; 2 pems 速度数据 2.1 每一…

虾皮泰国选品-如何使用知虾进行市场分析和选品

在电商平台上&#xff0c;选品是一项非常重要的任务。虾皮作为泰国地区最大的电商平台之一&#xff0c;提供了一款名为“知虾”的选品工具&#xff0c;帮助卖家进行市场分析和选品决策。本文将介绍如何使用知虾进行虾皮泰国选品市场分析和选品&#xff0c;以及其中的具体步骤和…

C题目11:数组a[m]排序

每日小语 双手&#xff0c;且放下一切劳作&#xff0c;前额&#xff0c;也忘掉忧思&#xff0c;此时此刻我所有的感觉就想沉入安睡。 自己敲写 这个问题老师上课讲了一种方法&#xff0c;叫做冒泡排序。基本思想是 1.找最小值&#xff0c;放到a[0] 2.从a[1]~a[3]找最小值&a…

Spark---转换算子、行动算子、持久化算子

一、转换算子和行动算子 1、Transformations转换算子 1&#xff09;、概念 Transformations类算子是一类算子&#xff08;函数&#xff09;叫做转换算子&#xff0c;如map、flatMap、reduceByKey等。Transformations算子是延迟执行&#xff0c;也叫懒加载执行。 2)、Transf…

ROS2对比ROS1的一些变化与优势(全新安装ROS2以及编译错误处理)《1》

1、概述 我们在前面介绍的ROS&#xff0c;都是ROS1的版本&#xff0c;近期对机器狗进行学习的时候&#xff0c;发现版本是ROS2了&#xff0c;也发现平时习惯的一些命令都有了变化&#xff0c;改变还是挺大的&#xff0c;不过熟悉之后还是很习惯ROS2的写法。 ROS2不是在ROS1的基…

NV080D语音芯片:让智能快递柜取件更便利

随着互联网的普及和电子商务的迅速发展&#xff0c;网购消费已经成为了越来越多人的选择。这也催生了一个庞大的“网购一族”&#xff0c;他们购买的各种商品会通过快递公司送到家门口。然而&#xff0c;收取快递往往也伴随着一系列问题。比如&#xff0c;派送时间和收件人取件…

如何通过提升客户体验带来更大的增长、更好的客户留存率?

客户期望的转变 在一个日益数字化的世界里&#xff0c;有必要采取以客户为中心的思维方式。因为客户与企业互动的方式有很多是在数字空间发生的&#xff0c;客户的需求和模式已经转变。 这种情况已经酝酿了几年&#xff0c;但在2020年才打开闸门。随着疫情的爆发&#xff0c;企…

【文末送书】十大排序算法C++代码实现

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

解决 Python requests 库中 方法选择错误问题

在使用Python库requests进行网页请求时&#xff0c;可能会遇到一个问题&#xff0c;即在处理重定向时&#xff0c;requests的Session.resolve_redirects方法会复制原始请求对象&#xff0c;这可能导致后续请求的HTTP方法选择错误。 解决方案&#xff1a; 针对上述问题&#x…

PyCharm 配置sqlite3驱动下载问题

单击View -> Tool Windows -> Database&#xff0c;打开Database窗体&#xff0c;之后进行配置&#xff0c;下载驱动包失败&#xff01; 解决 &#xff08;1&#xff09;下载Sqlite3驱动 下载地址: Central Repository: org/xerial/sqlite-jdbc 选择的版本是3.34.0,下载…

【Rxjava详解】(一)观察者模式的拓展

文章目录 RxJava引入扩展的观察者模式RxJava的观察者模式基本实现 RxJava入门示例Action RxJava引入 在介绍RxJava之前先说一下Rx。全称是Reactive Extensions&#xff0c;直译过来就是响应式扩展 Rx基于观察者模式&#xff0c;它是一种编程模型&#xff0c;目标是提供一致的…

PDF Reader Pro 3.0.1.0(pdf阅读器)

PDF Reader Pro是一款功能强大的PDF阅读、注释、填写表单&签名、转换、OCR、合并拆分PDF页面、编辑PDF等软件。 它支持多种颜色的高亮、下划线&#xff0c;可以按需选择&#xff0c;没有空白处可以进行注释&#xff0c;这时候便签是你最佳的选择&#xff0c;不点开时自动隐…

探索锦食送如何通过API集成无代码开发技术提高电商平台和营销系统效率

探索锦食送无代码开发集成技术 随着电子商务和营销系统的快速发展&#xff0c;企业不断寻求更高效和灵活的管理方式。锦食送&#xff0c;作为高端餐饮外卖服务的领先者&#xff0c;通过无代码开发的API集成技术&#xff0c;实现了电商平台和营销系统的高效管理。这种创新的连接…

ROS2串口通讯serial库(适用于humble版本)

要的串口操作的API介绍在这里&#xff1a;serial: serial::Serial Class Reference (wjwwood.io) 但是我们不是直接利用上面这个东西&#xff0c;而是使用的是根据这个改写的一个针对ros2的一个serial库&#xff0c;这个serial库是根据上面这个库改写来的&#xff0c;ros2的库在…

​​​​​​​3分钟实现EG网关串口连接麦格米特PLC

EG网关串口连接麦格米特PLC 前言&#xff1a;麦格米特PLC广泛应于工业控制领域&#xff0c;是一款性能高、稳定性强的PLC设备。此文档将介绍如何使用EG系列网关通过串口连接麦格米特PLC&#xff0c;并添加到EMCP物联网云平台&#xff0c;实现电脑Web页面、手机APP和微信对麦格米…