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中的输入和输出功能进行读取和写入的教程
Apr 14 Python
Python中List.index()方法的使用教程
May 20 Python
初学python的操作难点总结(新手必看篇)
Aug 03 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
Jan 09 Python
对numpy Array [: ,] 的取值方法详解
Jul 02 Python
Python中的heapq模块源码详析
Jan 08 Python
python中实现控制小数点位数的方法
Jan 24 Python
Python 实现遥感影像波段组合的示例代码
Aug 04 Python
Python3.7+tkinter实现查询界面功能
Dec 24 Python
基于pygame实现童年掌机打砖块游戏
Feb 25 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
Dec 14 Python
python 基于opencv实现图像增强
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实现适用于自定义的验证码类
2016/06/15 PHP
PHP的AES加密算法完整实例
2016/07/20 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
jQuery UI Dialog控件中的表单无法正常提交的解决方法
2010/12/19 Javascript
jQuery.getScript加载同域JS的代码
2012/02/13 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
2013/02/05 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
2016/08/25 Javascript
关于vue.js弹窗组件的知识点总结
2016/09/11 Javascript
简单实现JavaScript图片切换效果
2016/11/28 Javascript
简单实现jQuery上传图片显示预览功能
2020/06/29 jQuery
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
微信小程序多音频播放进度条问题
2018/08/28 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
2019/09/18 Javascript
使用rst2pdf实现将sphinx生成PDF
2016/06/07 Python
Python 对象中的数据类型
2017/05/13 Python
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
python db类用法说明
2020/07/07 Python
python Zmail模块简介与使用示例
2020/12/19 Python
CSS3 简写animation
2012/05/10 HTML / CSS
CSS3实现swap交换动画
2016/01/19 HTML / CSS
德国隐形眼镜店:LuckyLens
2018/07/29 全球购物
文员自我评价怎么写
2013/09/19 职场文书
车工岗位职责
2013/11/26 职场文书
应届专科生个人的自我评价
2014/01/05 职场文书
庆八一活动方案
2014/01/25 职场文书
母校寄语大全
2014/04/10 职场文书
领导欢迎词致辞
2015/01/23 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
搬迁通知
2015/04/20 职场文书
幼儿园六一主持词开场白
2015/05/28 职场文书
导游词之南京夫子庙
2019/12/09 职场文书
详解Node.js如何处理ES6模块
2021/05/15 Javascript
粗暴解决CUDA out of memory的问题
2021/05/22 Python