Python 解决方案:两个排序数组的中位数2024 年 8 月 29 日 | 阅读 15 分钟 在这个问题中,我们将得到两个数组。设这两个数组为 array1 和 array2。这两个数组将是排序的,并且可以有不同的大小。设两个数组的大小分别为 n 和 m,其中 n 是 array1 中的元素数量,m 是 array2 中的元素数量。 让我们看一些例子来理解这个问题。 输入: array1 = [-5, 2, 7, 9, 11],array2 = [-13, -10, -6, 3, 6, 13] 输出: 两个数组的中位数是 3。 如果我们合并两个数组,新数组将是排序的 = [-13, -10, -6, -5, 2, 3, 6, 7, 9, 11, 13] 由于元素数量为 11,即奇数个元素,中位数 = (n + m - 1) / 2,即第 6 个元素。Sorted[6] = 3 输入: array1 = [3, 6, 9, 10],array2 = [4, 7, 10, 11, 12, 13] 输出: 两个排序数组的中位数是 9.50 如果我们合并两个数组,新数组将是排序的 = [3, 4, 6, 7, 9, 10, 10, 11, 12, 13] 由于元素数量为 10,即偶数个元素,中位数 = [(n + m) / 2, ((n + m ) / 2) + 1],我们将取这两个值。因此,中位数是 (sorted[5] + sorted[6]) / 2 = 9.50。 方法 - 1解决这个问题的最基本方法是创建一个第三个数组。这个第三个数组将存储两个数组的总和;因此,这个数组的总大小将是 n + m。我们将对这个新数组进行排序并找到中位数。我们必须检查 n + m 是奇数还是偶数才能找到中位数。如上所示,如果第三个数组的总长度是奇数,则中位数位于排序数组的 (n + m - 1) / 2 索引处。但是,如果第三个数组的长度是偶数,则中位数是排序数组中索引为 (n + m) / 2 和 ((n + m ) / 2) - 1 的两个元素的平均值。 这个想法与上面显示的示例非常相似。我们将按照以下步骤解决问题。
现在我们将看到上述方法的 Python 代码。 代码 输出 The sorted array is: [-13, -10, -6, -5, 2, 3, 6, 7, 9, 11, 13] The median of the sorted array is: 3 The sorted array is: [3, 4, 6, 7, 9, 10, 10, 11, 12, 13] The median of the sorted array is: 9.5 时间复杂度: 我们需要对大小为 (n + m) 的第三个数组进行排序。对该数组进行排序的时间复杂度为 O(Log (n + m))。 辅助空间: 我们使用了额外的内存空间来存储第三个数组,因此空间复杂度为 O(n + m)。 方法 - 2我们将使用一种有效的方法来排序两个数组,从而降低时间复杂度。 给我们的两个数组是已排序的。我们可以利用这个属性,更有效地合并这两个数组,而不是先将它们相加然后排序。我们将跟踪已排序的数组数量,当达到两个数组的总元素数量的一半时,我们将打印中位数。在此方法中,我们还需要处理根据两个数组长度之和出现的两种情况。 如果长度之和为奇数,则中位数是合并两个数组后位于 (m + n) / 2 索引处的值。 如果长度之和为偶数,则中位数是合并两个数组后位于 (m + n) / 2 和 (m + n) / 2 + 1 索引处的值的平均值。 让我们进行一次干运行来理解这种方法。
以下是此方法的 Python 代码。 代码 输出 The median of the sorted array is: 3 The median of the sorted array is: 9.5 时间复杂度:在此方法中,我们需要对合并后的数组进行排序。我们通过一个 for 循环找到了中位数。因此,此方法的 O(m + n) 时间复杂度。 辅助空间:与前一种方法不同,我们没有存储合并数组的地方。因此,此方法的空间复杂度是常数,即 O(1)。 方法 - 3在此方法中,我们将使用二分查找。 正如我们在前一种方法中所见,排序数组的性质可以用来设计一种有效的方法来查找两个数组的中位数。对于排序数组最常用的方法之一是二分查找。我们将使用二分查找在不显式合并和排序的情况下划分两个数组。 为了找到中位数,我们需要找到一个点可以将合并后的数组分成两个相等的部分。我们可以使用二分查找在每个数组中单独找到一个点。当我们合并两个数组时,这些点也会合并,并将成为将合并后的数组分成两部分的点。 让我们举个例子:array1 = [-5, 2, 7, 9, 11],array2 = [-13, -10, -6, 3, 6, 13]
现在,我们将看到使用 Python 解决此问题必须遵循的步骤。
代码 输出 The median of the sorted array is: 3 The median of the sorted array is: 9.5 时间复杂度:我们在长度较大的数组上应用二分查找。因此,时间复杂度将是 O(max(log m, log n))。我们应用了这个条件来通过其中一个长度为 0 的情况。 辅助空间:我们没有使用额外的空间来存储数组。因此,空间复杂度是常数,即 O(1)。 方法 - 4在此方法中,我们将使用优先队列最小堆来查找中位数。 我们将通过迭代数组直到达到中位数索引来使用优先队列查找中位数。 让我们借助图示来理解算法。 array1 = [-5, 2, 7, 9, 11],array2 = [-13, -10, -6, 3, 6, 13],n = 5,m = 6 (n = array1 的长度,m = array2 的长度) 步骤 1:我们将初始化一个优先队列 p_q。我们将第一个数组的元素添加到优先队列中。 p_q.push(-5) p_q.push(2) p_q.push(7) p_q.push(9) p_q.push(11) 当我们将第一个数组的所有元素添加到优先队列时,最终队列将是 [-5, 2, 7, 9, 11]。 步骤 2:现在我们将第二个数组的元素添加到优先队列中。 p_q.push(-13) p_q.push(-10) p_q.push(-6) p_q.push(3) p_q.push(6) p_q.push(13) 当我们添加第二个数组的元素到优先队列时,最终队列将是 p_q = [-13, -10, -6, -5, 2, 3, 6, 7, 9, 11, 13] 步骤 3:最后一步是找到中位数。我们将根据优先队列的长度是偶数还是奇数的情况来找到中位数。 如果优先队列的长度是奇数 那么,我们将对队列进行 (n + m) // 2 次迭代。在每次迭代中,我们将从队列中弹出一个元素。 在迭代结束时,队列的顶部元素将是中位数。 如果优先队列的长度是偶数 那么我们将迭代优先队列直到 (n + m) // 2 和 ((n + m) // 2) - 1。我们将返回队列顶部元素的平均值。 这是此方法的 Python 代码。 代码 输出 The median of the sorted array is: 3 The median of the sorted array is: 9.5 时间复杂度:在这里,时间复杂度将是 O(max(n, m) * log(max(n, m)))。时间复杂度之所以如此,是因为我们对两个数组都使用了优先队列。 辅助空间:我们使用了额外的空间来存储优先队列。因此,空间复杂度等于优先队列的长度,即 O(n + m)。 下一个主题最大子数组和问题 |
C 语言家族(C、C++、Java、C# 等)开发的程序需要 main() 函数来指定执行的开始位置。然而,由于 Python 是一种解释型语言,也可以在交互式 shell 中使用,因此没有这样的东西……
阅读 3 分钟
机器学习是一门对计算机进行编程的科学,通过这种编程,计算机可以从不同类型的数据中学习。根据阿瑟·塞缪尔对机器学习的定义——“一个让计算机有能力在没有明确编程的情况下学习的研究领域”。机器学习的概念...
阅读 12 分钟
在本教程中,我们将学习 Python 中的 currying,这是一个在 Python 中比较新的概念。大多数开发者可能不熟悉这个主题。我们将解释 currying 的概念、它的用例以及如何在 Python 中实现它。让我们开始……
阅读 6 分钟
介绍 在本文中,我们将讨论。由于测试人员普遍认为移动自动化入门很难。我们坚信测试人员应该具备广泛的能力。您不需要成为这些方面的专家...
阅读 6 分钟
什么是 Matplotlib?在 Python 中,我们有很多内置库,它们有很多有用的内置函数,我们可以通过导入这些库来使用。Matplotlib 是 Python 中最重要的库之一,用于绘制图形和图表...
阅读 3 分钟
在我们开始使用 Python 编程语言构建区块链之前,让我们回到最初。2008 年,一位(或多位)作者以中本聪的笔名发布了一篇白皮书,描述了一种纯粹的点对点电子现金版本。独家介绍...
阅读 13 分钟
几乎所有数值模拟领域都使用线性和多项式方程。但在工程学中,它们最自然地用于线性方程组的分析领域。结构、弹性物质、热通量、电磁学、电路等等都属于一般……
阅读 6 分钟
在本教程中,我们正在讨论如何使用 Python 进行 Web 开发。Python 是一门可爱的语言。它易于学习且有趣,其语法(规则)简单明了。Python 是初学者的首选;但仍然强大且...
阅读 6 分钟
无论是哪种编程语言,参数(Arguments)和形参(Parameters)这两个词都会给程序员带来很多困惑。有时,这两个词会互换使用,但实际上,它们有两个不同但相似的含义。本教程解释了这两个词之间的区别以及...
阅读 6 分钟
? Python 是当前最流行和多功能的语言。Python 在 Windows 中不提供预打包,但这并不意味着 Windows 用户不能灵活使用 Python。一些操作系统(如 Linux)带有可以运行 Python 包管理器...
阅读1分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India