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 set集合类型操作总结
Nov 07 Python
python获取远程图片大小和尺寸的方法
Mar 26 Python
python查找目录下指定扩展名的文件实例
Apr 01 Python
Python中的super用法详解
May 28 Python
改进Django中的表单的简单方法
Jul 17 Python
Python编码爬坑指南(必看)
Jun 10 Python
python采集微信公众号文章
Dec 20 Python
Python实现查找字符串数组最长公共前缀示例
Mar 27 Python
Python装饰器使用你可能不知道的几种姿势
Oct 25 Python
python的等深分箱实例
Nov 22 Python
python_mask_array的用法
Feb 18 Python
Python+unittest+requests+excel实现接口自动化测试框架
Dec 23 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网页后退不再出现过期
2007/03/08 PHP
php中的一些数组排序方法分享
2012/07/20 PHP
PHP 魔术变量和魔术函数详解
2015/02/25 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
2016/07/01 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
2016/11/25 PHP
php实现base64图片上传方式实例代码
2017/02/22 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
javascript 动态设置已知select的option的value值的代码
2009/12/16 Javascript
js 数据类型转换总结笔记
2011/01/17 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
2013/08/27 Javascript
js中自定义方法实现停留几秒sleep
2014/07/11 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
2015/08/11 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
解决vue-cli项目webpack打包后iconfont文件路径的问题
2018/09/01 Javascript
使用electron将vue-cli项目打包成exe的方法
2018/09/29 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
python返回昨天日期的方法
2015/05/13 Python
Python实现两款计算器功能示例
2017/12/19 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
Python3 chardet模块查看编码格式的例子
2019/08/14 Python
python tkinter图形界面代码统计工具(更新)
2019/09/18 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
Python模块常用四种安装方式
2020/10/20 Python
Dr. Martens马汀博士德国官网:马丁靴鼻祖
2019/12/26 全球购物
公司员工的自我评价范例
2013/11/01 职场文书
入党思想汇报
2014/01/05 职场文书
办公室主任主任岗位责任制
2014/02/11 职场文书
办公室主任竞聘演讲稿
2014/05/15 职场文书
建设工程授权委托书
2014/09/22 职场文书
污染环境建议书
2015/09/14 职场文书