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 相关文章推荐
pyside写ui界面入门示例
Jan 22 Python
python实现udp数据报传输的方法
Sep 26 Python
python框架django基础指南
Sep 08 Python
python中文乱码不着急,先看懂字节和字符
Dec 20 Python
VSCode下配置python调试运行环境的方法
Apr 06 Python
解决python字典对值(值为列表)赋值出现重复的问题
Jan 20 Python
Django页面数据的缓存与使用的具体方法
Apr 23 Python
记录Python脚本的运行日志的方法
Jun 05 Python
python 实现将多条曲线画在一幅图上的方法
Jul 07 Python
python实现12306登录并保存cookie的方法示例
Dec 17 Python
python numpy生成等差数列、等比数列的实例
Feb 25 Python
python使用bs4爬取boss直聘静态页面
Oct 10 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
全国FM电台频率大全 - 30 宁夏回族自治区
2020/03/11 无线电
thinkphp分页集成实例
2017/07/24 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
2019/10/08 PHP
很多人都是用下面的js刷新站IP和PV
2008/09/05 Javascript
javascript 模拟JQuery的Ready方法实现并出现的问题
2009/12/06 Javascript
checkbox选中与未选中判断示例
2014/08/04 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
jquery radio的取值_radio的选中_radio的重置方法
2016/09/20 Javascript
用js写的一个路由(简单实例)
2016/09/24 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
vue.js使用代理和使用Nginx来解决跨域的问题
2018/02/03 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
.vue文件 加scoped 样式不起作用的解决方法
2018/05/28 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
React项目动态设置title标题的方法示例
2018/09/26 Javascript
ES6学习笔记之let与const用法实例分析
2020/01/22 Javascript
python利用标准库如何获取本地IP示例详解
2017/11/01 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
OpenCV 边缘检测
2019/07/10 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
今天学到的CSS最新技术(与图片背景相关)
2012/12/24 HTML / CSS
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
英国手机零售商:Carphone Warehouse
2018/06/06 全球购物
电子商务专业个人的自我评价分享
2013/10/29 职场文书
超市促销活动总结
2014/07/01 职场文书
干部作风整顿自我剖析材料和整改措施
2014/09/18 职场文书
地方课程教学计划
2015/01/19 职场文书
求职自我推荐信
2015/03/24 职场文书
小型企业的绩效考核制度模板
2019/11/21 职场文书
浅谈mysql返回Boolean类型的几种情况
2021/06/04 MySQL
python数字图像处理实现图像的形变与缩放
2022/06/28 Python