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 28 Python
Python处理CSV与List的转换方法
Apr 19 Python
django加载本地html的方法
May 27 Python
使用Scrapy爬取动态数据
Oct 21 Python
Python实例方法、类方法、静态方法的区别与作用详解
Mar 25 Python
Pandas库之DataFrame使用的学习笔记
Jun 21 Python
安装好Pycharm后如何配置Python解释器简易教程
Jun 28 Python
对Django 转发和重定向的实例详解
Aug 06 Python
pyspark给dataframe增加新的一列的实现示例
Apr 24 Python
在服务器上安装python3.8.2环境的教程详解
Apr 26 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
Nov 30 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
Feb 26 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
抓取YAHOO股票报价的类
2009/05/15 PHP
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
2014/10/14 PHP
一个可绑定数据源的jQuery数据表格插件
2010/07/17 Javascript
jquery中实现简单的tabs插件功能的代码
2011/03/02 Javascript
js控制table合并具体实现
2014/02/20 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
node.js中的fs.fchown方法使用说明
2014/12/16 Javascript
浅析javascript中的DOM
2015/03/01 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
2016/04/17 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
2016/10/19 Javascript
JavaScript基于扩展String实现替换字符串中index处字符的方法
2017/06/13 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
CentOS环境中MySQL修改root密码方法
2018/01/07 Javascript
小程序组件之仿微信通讯录的实现代码
2018/09/12 Javascript
JavaScript代码调试方法实例小结
2019/01/05 Javascript
微信小程序 select 下拉框组件功能
2019/09/09 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
基于javascript实现贪吃蛇小游戏
2019/11/25 Javascript
JavaScript仿京东秒杀倒计时
2020/03/17 Javascript
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
使用Python的判断语句模拟三目运算
2015/04/24 Python
在Django框架中伪造捕捉到的URLconf值的方法
2015/07/18 Python
python中lambda()的用法
2017/11/16 Python
Python进阶之递归函数的用法及其示例
2018/01/31 Python
Python之使用adb shell命令启动应用的方法详解
2019/01/07 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
pytorch 模拟关系拟合——回归实例
2020/01/14 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
python实现简单猜单词游戏
2020/12/24 Python
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
投资合作协议书范本
2014/04/17 职场文书
学生安全责任书范本
2014/07/24 职场文书
2015年学校管理工作总结
2015/07/20 职场文书
科普 | 业余无线电知识-波段篇
2022/02/18 无线电