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 相关文章推荐
Python2和Python3中print的用法示例总结
Oct 25 Python
python3写的简单本地文件上传服务器实例
Jun 04 Python
python退出命令是什么?详解python退出方法
Dec 10 Python
Python画图高斯分布的示例
Jul 10 Python
使用pyshp包进行shapefile文件修改的例子
Dec 06 Python
python中图像通道分离与合并实例
Jan 17 Python
使用Tensorflow实现可视化中间层和卷积层
Jan 24 Python
Python3使用腾讯云文字识别(腾讯OCR)提取图片中的文字内容实例详解
Feb 18 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
May 11 Python
keras中模型训练class_weight,sample_weight区别说明
May 23 Python
python 管理系统实现mysql交互的示例代码
Dec 06 Python
Anaconda安装pytorch和paddle的方法步骤
Apr 03 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下连接mssql2005的代码
2011/01/17 PHP
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
PHP基于回溯算法解决n皇后问题的方法示例
2017/11/07 PHP
php支付宝APP支付功能
2020/07/29 PHP
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
基于jQuery的日期选择控件
2009/10/27 Javascript
扩展jQuery 键盘事件的几个基本方法
2009/10/30 Javascript
javascript 计算两个整数的百分比值
2009/12/26 Javascript
javascript 模式设计之工厂模式详细说明
2010/05/10 Javascript
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
JS实现OCX控件的事件响应示例
2014/09/17 Javascript
jquery实现动态改变div宽度和高度
2015/05/08 Javascript
JS中字符串trim()使用示例
2015/05/26 Javascript
基于jquery实现轮播焦点图插件
2016/03/31 Javascript
vue-ajax小封装实例
2017/09/18 Javascript
vue页面跳转后返回原页面初始位置方法
2018/02/11 Javascript
Node.js应用设置安全的沙箱环境
2018/04/23 Javascript
vue指令做滚动加载和监听等
2019/05/26 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
基于JavaScript实现简单扫雷游戏
2021/01/02 Javascript
python实现zencart产品数据导入到magento(python导入数据)
2014/04/03 Python
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
2018/11/16 Python
用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)
2019/01/08 Python
Python CVXOPT模块安装及使用解析
2019/08/01 Python
python 三元运算符使用解析
2019/09/16 Python
python实现udp传输图片功能
2020/03/20 Python
Python多线程通信queue队列用法实例分析
2020/03/24 Python
Python APScheduler执行使用方法详解
2020/12/10 Python
H5混合开发app如何升级的方法
2018/01/10 HTML / CSS
美国电视购物:QVC
2017/02/06 全球购物
2014年党员整改措施
2014/10/24 职场文书
公司与个人合作协议书
2016/03/19 职场文书
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android
漫画「狩龙人拉格纳」公开TV动画预告图
2022/03/22 日漫