python 实现在无序数组中找到中位数方法
一、问题描述 1、求一个无序数组的中位数, (若数组是偶数,则中位数是指中间两个数字之和除以2,若数组是奇数,则中位数是指最中间位置。要求:不能使用排序,时间复杂度尽量低 2、例如: lists = [3, 2, 1, 4] , 中位数为 = (2+3)/2 = 2.5 lists = [3, 1, 2] , 中位数为 2 3、算法思想: 利用快速排序思想(但是并不是全部使用):任意挑选一个元素,以该元素为key, 划分数组为两个部分,如果左侧数组长度刚好为(n-1)/2, 那么key就为中位数, 若左侧数组长度 < (n-1)/2 , 那么中位数点在右侧,反之,中位数在左侧。然后进入相应 【Python 实现在无序数组中找到中位数的方法】 在Python编程中,寻找无序数组的中位数是一项常见的任务,特别是在数据分析和算法设计中。中位数是将一组数值按大小顺序排列后位于中间位置的数,对于偶数个数值,中位数是中间两个数的平均值。在不使用排序的情况下,可以采用类似于快速排序的思想来高效地找到中位数。 1. **问题描述** - 要求找到一个无序数组的中位数,不使用排序操作,尽可能降低时间复杂度。 - 当数组长度为偶数时,中位数为中间两个数的和除以2;当数组长度为奇数时,中位数是中间的那个数。 - 示例:对于列表`[3, 2, 1, 4]`,中位数是`(2+3)/2=2.5`;对于列表`[3, 1, 2]`,中位数是2。 2. **算法思想** - 基于快速排序的灵感,但并不完全执行完整的排序过程。 - 选取一个元素作为基准(key),通过遍历数组将元素分为两部分,使得一部分的元素小于key,另一部分的元素大于或等于key。 - 如果左侧数组的长度刚好为`(n-1)/2`,其中n是数组长度,那么key就是中位数;否则,根据左侧数组长度与`(n-1)/2`的关系,确定中位数在右侧还是左侧,并在相应一侧继续查找,直至找到中位数。这种方法的平均时间复杂度为O(n)。 3. **程序实现** - 定义一个名为`Solution`的类,其中包含一个`findmedian`方法用于找到中位数。 - `findmedian`方法首先检查输入数组是否为空,然后根据数组长度的奇偶性决定如何查找中位数。 - 使用`partition`辅助方法,以基准元素划分数组,返回中位数所在位置。 - 在`partition`方法中,通过双指针(left和right)进行迭代,不断调整数组元素的位置,直到找到目标位置。 ```python class Solution(object): def findmedian(self, lists): if not lists or len(lists) == 0: return [] n = len(lists) if n % 2 == 0: a = self.partition(lists, n/2, 0, n-1) b = self.partition(lists, n/2-1, 0, n-1) mid = (lists[a]+lists[b]) / (2 * 1.0) return mid else: mid = self.partition(lists, n/2, 0, n-1) return lists[mid] def partition(self, lists, k, start, end): key = lists[start] left, right = start, end while left < right: while left < right and lists[right] > key: right -= 1 lists[left] = lists[right] while left < right and lists[left] < key: left += 1 lists[right] = lists[left] lists[left] = key if left == k: return left elif left > k: return self.partition(lists, k, start, left-1) else: return self.partition(lists, k, left+1, end) if __name__ == "__main__": sol = Solution() lists = [2, 5, 4, 9, 3, 6, 8, 7, 1] # lists = [1, 2] data = sol.findmedian(lists) print("中位数 = %s" % data) ``` 4. **知识补充:Python Streaming 实现某个字段的排序** - Hadoop Streaming 默认情况下,以`\t`作为字段分隔符,第一列作为key,其余列为value。 - 可以通过设置Hadoop Streaming的相关参数来改变字段分隔符和排序方式,例如`-D stream.map.output.field.separator`、`-D num.key.fields.for.partition`等。 - 在Python中实现流式处理,可以通过处理输入和输出流,自定义比较函数来实现特定字段的排序。 通过以上方法,我们可以高效地在无序数组中找到中位数,而无需对整个数组进行排序,这在处理大数据集时尤其有用。同时,了解如何在Python Streaming中实现字段排序,有助于在分布式计算环境中进行数据处理。