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 05 Python
Python实现字符串匹配算法代码示例
Dec 05 Python
python提取具有某种特定字符串的行数据方法
Dec 11 Python
python从子线程中获得返回值的方法
Jan 30 Python
Python2和Python3的共存和切换使用
Apr 12 Python
python验证身份证信息实例代码
May 06 Python
python增加图像对比度的方法
Jul 12 Python
Python 中由 yield 实现异步操作
May 04 Python
Python新手学习raise用法
Jun 03 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
Dec 01 Python
Python实现淘宝秒杀功能的示例代码
Jan 19 Python
Python pandas读取CSV文件的注意事项(适合新手)
Jun 20 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 读取文件的正确方法
2009/04/29 PHP
php实现的简单检验登陆类
2015/06/18 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
php安装dblib扩展,连接mssql的具体步骤
2017/03/02 PHP
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
javascript五图轮播切换实用版
2012/08/17 Javascript
JS中Iframe之间传值的方法
2013/03/11 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
详解AngularJS中的表格使用
2015/06/16 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
Google 地图获取API Key详细教程
2016/08/06 Javascript
原生JS实现轮播效果+学前端的感受(防止走火入魔)
2016/08/21 Javascript
关于JS中二维数组的声明方法
2016/09/24 Javascript
JavaScript定时器实现的原理分析
2016/12/06 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
node.js express框架简介与实现
2019/07/23 Javascript
vue获取form表单的值示例
2019/10/29 Javascript
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
python映射列表实例分析
2015/01/26 Python
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
python实现词法分析器
2019/01/31 Python
解决python中导入win32com.client出错的问题
2019/07/26 Python
Python通过cv2读取多个USB摄像头
2019/08/28 Python
selenium+python实现基本自动化测试的示例代码
2021/01/27 Python
使用SVG实现提示框功能的示例代码
2020/06/05 HTML / CSS
JDK安装目录下有哪些内容
2014/08/25 面试题
yy结婚证婚词
2014/01/10 职场文书
善意的谎言事例
2014/02/15 职场文书
2015年会计人员工作总结
2015/05/22 职场文书
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
2021/06/05 Python