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的类方法和静态方法
Dec 13 Python
讲解Python中运算符使用时的优先级
May 14 Python
Python基于pygame模块播放MP3的方法示例
Sep 30 Python
彻底理解Python list切片原理
Oct 27 Python
微信跳一跳自动运行python脚本
Jan 08 Python
Python基于csv模块实现读取与写入csv数据的方法
Jan 18 Python
Python3利用print输出带颜色的彩色字体示例代码
Apr 08 Python
基于python的ini配置文件操作工具类
Apr 24 Python
Django使用模板后无法找到静态资源文件问题解决
Jul 19 Python
python如何通过pyqt5实现进度条
Jan 20 Python
python输出第n个默尼森数的实现示例
Mar 08 Python
基于Python模拟浏览器发送http请求
Nov 06 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入门之连接mysql数据库的一个类
2012/04/21 PHP
php中spl_autoload详解
2014/10/17 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
ThinkPHP进程计数类Process用法实例详解
2015/09/25 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
通过Mootools 1.2来操纵HTML DOM元素
2009/09/15 Javascript
探讨js中的双感叹号判断
2013/11/11 Javascript
JS和函数式语言的三特性
2014/03/05 Javascript
javascript关于继承解析
2016/05/10 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
ReactNative短信验证码倒计时控件的实现代码
2017/07/20 Javascript
js单页hash路由原理与应用实战详解
2017/08/14 Javascript
详解在vue-cli项目中使用mockjs(请求数据删除数据)
2017/10/23 Javascript
详谈js中标准for循环与foreach(for in)的区别
2017/11/02 Javascript
webpack中如何使用雪碧图的示例代码
2018/11/11 Javascript
原生js实现抽奖小游戏
2019/06/27 Javascript
electron实现静默打印的示例代码
2019/08/12 Javascript
vue 项目@change多个参数传值多个事件的操作
2021/01/29 Vue.js
python实现的防DDoS脚本
2011/02/08 Python
Python中基础的socket编程实战攻略
2016/06/01 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
python中的常量和变量代码详解
2018/07/25 Python
python机器学习之神经网络实现
2018/10/13 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
Python+OpenCv制作证件图片生成器的操作方法
2019/08/21 Python
PyQt5-QDateEdit的简单使用操作
2020/07/12 Python
Python爬虫实例——爬取美团美食数据
2020/07/15 Python
Python模拟登录和登录跳转的参考示例
2020/10/30 Python
不同浏览器对CSS3和HTML5的支持状况
2009/10/31 HTML / CSS
语文高效课堂实施方案
2014/05/03 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
自强之星事迹材料
2014/05/12 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
光荣之路观后感
2015/06/12 职场文书
小学教师教育随笔
2015/08/14 职场文书
openstack中的rpc远程调用的方法
2021/07/09 Python