python 实现在无序数组中找到中位数方法


Posted in Python onMarch 03, 2020

一、问题描述

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的Flask框架中@app.route的用法教程
Mar 31 Python
基于Python实现的微信好友数据分析
Feb 26 Python
Python处理中文标点符号大集合
May 14 Python
解决tensorflow模型参数保存和加载的问题
Jul 26 Python
python操作日志的封装方法(两种方法)
May 23 Python
Python实现生成密码字典的方法示例
Sep 02 Python
Python实现线性插值和三次样条插值的示例代码
Nov 13 Python
Python argparse模块应用实例解析
Nov 15 Python
python文件及目录操作代码汇总
Jul 08 Python
pytorch DataLoader的num_workers参数与设置大小详解
May 28 Python
利用python做数据拟合详情
Nov 17 Python
python游戏开发Pygame框架
Apr 22 Python
python的列表List求均值和中位数实例
Mar 03 #Python
基于Python数据分析之pandas统计分析
Mar 03 #Python
python 的numpy库中的mean()函数用法介绍
Mar 03 #Python
Python统计学一数据的概括性度量详解
Mar 03 #Python
python多维数组分位数的求取方式
Mar 03 #Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
Mar 03 #Python
python Plotly绘图工具的简单使用
Mar 03 #Python
You might like
php将数据库中的电话号码读取出来并生成图片
2008/08/31 PHP
PHP用身份证号获取星座和生肖的方法
2013/11/07 PHP
PHP实现linux命令tail -f
2016/02/22 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
2016/03/01 PHP
Yii中CGridView禁止列排序的设置方法
2016/07/12 PHP
jQuery fadeTo方法调整图片的透明度使用介绍
2013/05/06 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
深入理解js数组的sort排序
2016/05/28 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
微信小程序富文本渲染引擎的详解
2017/09/30 Javascript
JS实现仿微信支付弹窗功能
2018/06/25 Javascript
Vue-不允许嵌套式的渲染方法
2018/09/13 Javascript
React 组件中的 bind(this)示例代码
2018/09/16 Javascript
在vue中使用setInterval的方法示例
2019/04/16 Javascript
详解node登录接口之密码错误限制次数(含代码)
2019/10/25 Javascript
vue中axios封装使用的完整教程
2021/03/03 Vue.js
[04:41]2014DOTA2国际邀请赛 Liquid顺利突围晋级正赛
2014/07/09 DOTA
Django学习教程之静态文件的调用详解
2018/05/08 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
Python高级property属性用法实例分析
2019/11/19 Python
python的Jenkins接口调用方式
2020/05/12 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
HTML5页面直接调用百度地图API获取当前位置直接导航目的地的实现代码
2018/03/02 HTML / CSS
Internet体系结构
2014/12/21 面试题
群众路线教育实践活动方案
2014/02/02 职场文书
应届毕业生如何写求职信
2014/02/16 职场文书
秋季校运动会广播稿
2014/02/23 职场文书
小学生学习雷锋倡议书
2014/05/15 职场文书
家长会标语
2014/06/24 职场文书
乡镇安全生产目标责任书
2014/07/23 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
雷锋之歌观后感
2015/06/10 职场文书
运动会100米广播稿
2015/08/19 职场文书
2016年春季开学典礼新闻稿
2015/11/25 职场文书
用Python爬虫破解滑动验证码的案例解析
2021/05/06 Python