一、问题描述

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 , 那么中位数点在右侧,反之,中位数在左侧。然后进入相应的一侧继续寻找中位

平均时间复杂度为O(n)

二、程序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 = right - 1

lists[left] = lists[right]

while left < right and lists[left] < key:

left = 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)

知识补充:python streaming 实现某个字段排序

一,hadoop streaming默认情况

1,在hadoop streaming的默认情况下,是以\t作为分隔符的,标准输入时,每行的第一个\t之前的内容作为key,第一个\t之后的内容作为value。注意,如果一个\t字符都没有,那么整行作为key。

2,streaming的一些参数如下:

-D stream.map.output.field.separator :设置map输出中key和value的分隔符

-D stream.num.map.output.key.fields : 设置map程序分隔符的位置,该位置之前的部分作为key,之后的部分作为value

-D map.output.key.field.separator : 设置map输出中key内部的分割符

-D num.key.fields.for.partition : 指定分桶时,key按照分隔符切割后,其中用于分桶key所占的列数(配合-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner 使用)

-D stream.reduce.output.field.separator:设置reduce输出中key和value的分隔符

-D stream.num.reduce.output.key.fields:设置reduce程序分隔符的位置

二,python streaming 实现某个字段的排序

1, 输入数据: cat data.txt (中间是tab键)11 2

11 3

11 4 1

11 1

11 12 22

2,streaming程序如下:

vim sorted.sh#!/bin/bash

export CURRENT=/home/chunhe.liao/hadoop_streaming/sort

/usr/local/hadoop-2.6.3/bin/hadoop jar /usr/local/hadoop-2.6.3/share/hadoop/tools/lib/hadoop-streaming-2.6.3.jar \

-D stream.map.output.field.separator='\t' \

-D stream.num.map.output.key.fields=3 \

-D mapreduce.job.output.key.comparator.class=org.apache.hadoop.mapreduce.lib.partition.KeyFieldBasedComparator \

-D mapreduce.partition.keycomparator.options=-k3,3nr \ # 按照第三列逆序排列,可以根据想要的第几段来选择。

-input "/user/test/inputdata/datas3/data.txt" \

-output "/user/test/streaming/sorted_20180711" \

-mapper "python mapper.py" \

-reducer "python reducer.py" \

-file "$CURRENT/mapper.py" \

-file "$CURRENT/reducer.py"

(2) mapper.py# -*- coding: utf-8 -*-

import sys

for line in sys.stdin:

line = line.strip()

print('{0}'.format(line))

(3) reducer.py# -*- coding: utf-8 -*-

import sys

for line in sys.stdin:

line = line.strip()

print("{0}".format(line))

运行命令:bash sorted.sh

运行结果:hdfs dfs -cat /user/test/streaming/sorted_20180711/part-00000

11 12 22

11 3

11 2

11 4 1

11 1

以上这篇python 实现在无序数组中找到中位数方法就是小编分享给大家的全部内容了,希望能给大家一个参考。

python求无序列表中位数_python 实现在无序数组中找到中位数方法相关推荐

  1. 求两个有序数组中的中位数和第k小的元素

    我们首先来看一下这一类题算法的原型: 对应牛客网链接: https://www.nowcoder.com/practice/08588d568e164e0a9958b5d6a3c351f5?tpId= ...

  2. java有序数组找中位数_有序数组中找中位数

    题目:两个有序数组A和B,大小都是n,寻找这两个数组合并后的中位数.时间复杂度为O(logn). 中位数:如果数组的个数是奇数,那么中位数的值就是有序时处于中间的数:如果数组个数是偶数的,那么就是有序 ...

  3. rstudio中位数的公式_如何在R中找到中位数

    rstudio中位数的公式 In this tutorial, let's learn how we can find the median in R. Median is defined as th ...

  4. python使用numpy的np.float_power函数计算numpy数组中每个数值的指定幂次(例如平方、立方)、np.power函数默认返回整数格式、np.float_power函数返回浮点数

    python使用numpy的np.float_power函数计算numpy数组中每个数值的指定幂次(例如平方.立方).np.power函数默认返回整数格式.np.float_power函数默认返回浮点 ...

  5. python使用numpy的np.power函数计算numpy数组中每个数值的指定幂次(例如平方、立方)、np.power函数默认返回整数格式、np.float_power函数默认返回浮点数

    python使用numpy的np.power函数计算numpy数组中每个数值的指定幂次(例如平方.立方).np.power函数默认返回整数格式.np.float_power函数默认返回浮点数 目录

  6. C语言试题三十七之求除一个2×m整型二维数组中最大元素的值,并将此值返回调用函数。

    1. 题目 请编写一个函数function,它的功能是:求除一个2×m整型二维数组中最大元素的值,并将此值返回调用函数. 2 .温馨提示 C语言试题汇总里可用于计算机二级C语言笔试.机试.研究生复试中 ...

  7. 求出首地址为DATA的字数组中的最小偶数,并将它放在AX中

    ;求出首地址为DATA的字数组中的最小偶数,并将它放在AX中 DATAS SEGMENT DATA DW 1 DUP(1,1,1,1,1,2)   ;随便设置的数据,可换为其他数据 COUNT DW ...

  8. 定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个数组中并输出。

    定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数:然后按顺序每五个数求出一个平均值,放在另一个数组中并输出. var arr = [];for (var i = 1; i <= 6 ...

  9. python求n项和_python 输入一个数n,求n个数求乘或求和的实例

    python 输入一个数n,求n个数求乘或求和的实例 求和 try: while True: n=input() s=1 for x in raw_input().split(): s=s+int(x ...

最新文章

  1. git学习指南_几十张动图告诉你 Git到底是怎么玩的
  2. golang 读取文件
  3. 创建一个存储函数,返回指定员工的姓名,薪水和年收入
  4. 反思转变:多努力以积累  多动脑以应变
  5. Python学习——import语句导入模块顺序
  6. 文件描述符、函数open和openat
  7. caffe新手常遇到的三个问题
  8. 关于静态成员变量的谈论
  9. java server.xml_tomcat配置文件server.xml详解
  10. HDU1003:Max Sum(简单dp)
  11. sqoop导出数据时:ERROR tool.ExportTool: Error during export: Export job failed!解决
  12. 非关系数据库-NoSQL探讨
  13. 第十一课:(2)在MINST-FASHION上实现神经网络的学习流程
  14. vue项目开发--网页小图标修改、封装导航栏
  15. 软件开发人才级别的划分
  16. 零基础学习 iOS 开发?如何系统学习 iOS ?
  17. win7系统设置无线临时(计算机到计算机)网络 手机,Win7无线临时网络允许移动WIFI和“启用Internet连接共享”...
  18. 如何更好地学习新概念英语
  19. 深入理解CSS margin折叠
  20. 管理书单 | 10本经典的管理学书籍推荐

热门文章

  1. 【numpy学习笔记】数组的创建和基本运算
  2. arXiv爆款:想了解Attention就看它!
  3. 这三所985,博士生毕业,可能不再要求发表论文!
  4. MIT霸气护学生:你换导师,我替你买单!
  5. 北京搜狗已签算法30W,西安银行总包20W,要不要毁约去银行?
  6. 10年读4个博士学位的“神之子”创办「莆田系」AI顶会,骗欧美学术精英,收报名费3688元...
  7. 90后教授:回国是用数学计算出的“最优解”
  8. linux查看服务器外网ip方法
  9. 欢迎来到美多商城!-项目准备之项目介绍-项目需求分析-项目架构设计
  10. ATM高层定义了4类业务,压缩视频信号的传送属于______。B