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实现Linux下守护进程的编写方法
Aug 22 Python
python中的hashlib和base64加密模块使用实例
Sep 02 Python
python实现图片变亮或者变暗的方法
Jun 01 Python
python实现颜色空间转换程序(Tkinter)
Dec 31 Python
获取Django项目的全部url方法详解
Oct 26 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
Nov 08 Python
python3连接MySQL数据库实例详解
May 24 Python
Python实现使用dir获取类的方法列表
Dec 24 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 Python
使用python自动追踪你的快递(物流推送邮箱)
Mar 17 Python
Python3.7 读取音频根据文件名生成脚本的代码
Apr 07 Python
Python 实现键盘鼠标按键模拟
Nov 18 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
E路文章系统PHP
2006/12/11 PHP
php MsSql server时遇到的中文编码问题
2009/06/11 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
JS和jquery获取各种屏幕的宽度和高度的代码
2013/08/02 Javascript
JavaScript splice()方法详解
2020/09/22 Javascript
通过JS动态创建一个html DOM元素并显示
2014/10/15 Javascript
jquery事件preventDefault()方法用法实例
2015/01/16 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
JavaScript实现简单获取当前网页网址的方法
2015/11/09 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
实例解析jQuery中proxy()函数的用法
2016/05/24 Javascript
基于Turn.js 实现翻书效果实例解析
2016/06/20 Javascript
Javascript函数中的arguments.callee用法实例分析
2016/09/16 Javascript
JS日程管理插件FullCalendar中文说明文档
2017/02/06 Javascript
小程序实现选择题选择效果
2018/11/04 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
微信小程序-form表单提交代码实例
2019/04/29 Javascript
Node 搭建一个静态资源服务器的实现
2019/05/20 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
nodejs简单抓包工具使用详解
2019/08/23 NodeJs
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
详解python的四种内置数据结构
2019/03/19 Python
使用Keras中的ImageDataGenerator进行批次读图方式
2020/06/17 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
俄罗斯优惠券网站:BIGLION
2017/05/21 全球购物
论语读书笔记
2015/06/26 职场文书
企业文化学习心得体会
2016/01/21 职场文书
面试必问:圣杯布局和双飞翼布局的区别
2021/05/13 HTML / CSS
Anaconda配置各版本Pytorch的实现
2021/08/07 Python