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 open读写文件实现脚本
Sep 06 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
Sep 19 Python
Python 数据结构之堆栈实例代码
Jan 22 Python
python flask中静态文件的管理方法
Mar 20 Python
对Python多线程读写文件加锁的实例详解
Jan 14 Python
Python多线程原理与用法实例剖析
Jan 22 Python
详解python读取image
Apr 03 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
Jun 19 Python
用sqlalchemy构建Django连接池的实例
Aug 29 Python
Python values()与itervalues()的用法详解
Nov 27 Python
Python装饰器原理与基本用法分析
Jan 07 Python
Python调用shell命令常用方法(4种)
May 11 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
做网页的一些技巧
2007/02/01 Javascript
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
2012/05/23 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
2013/04/09 Javascript
javascript实现div浮动在网页最顶上并带关闭按钮效果实例
2013/08/13 Javascript
利用原生JavaScript获取元素样式只是获取而已
2014/10/08 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
2016/08/11 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
小程序实现分类页
2019/07/12 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
Vue组件为什么data必须是一个函数
2020/06/11 Javascript
区分vue-router的hash和history模式
2020/10/03 Javascript
[52:41]OG vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/20 DOTA
python字符串连接方式汇总
2014/08/21 Python
python实现提取百度搜索结果的方法
2015/05/19 Python
python实现各进制转换的总结大全
2017/06/18 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
2018/12/21 Python
python 实现矩阵上下/左右翻转,转置的示例
2019/01/23 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
Python循环结构的应用场景详解
2019/07/11 Python
python中Lambda表达式详解
2019/11/20 Python
Python数据可视化:泊松分布详解
2019/12/07 Python
使用HTML5的Notification API制作web通知的教程
2015/05/08 HTML / CSS
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
德国网上宠物店:Zoobio
2018/05/23 全球购物
高校毕业生登记表自我鉴定
2013/11/03 职场文书
制药工程专业个人求职自荐信
2014/01/25 职场文书
银行工作检查书范文
2014/01/31 职场文书
交通运输局四风问题对照检查材料思想汇报
2014/10/09 职场文书
2015员工年度考核评语
2015/03/25 职场文书
优秀学生主要事迹怎么写
2015/11/04 职场文书
幽默口才训练经典句子(48句)
2019/08/19 职场文书
python实现腾讯滑块验证码识别
2021/04/27 Python