python第k序列元素查找_Python寻找第k小的元素

更多: http://my.oschina.net/u/438371/blog/131956

1.[代码][Python]代码

# -*- coding: utf-8 -*-

from random import randint

from math import ceil, floor

def _partition(A, l, r, i):

"""以A[i]为主元划分数组A[l..r],使得:

A[l..m-1] <= A[m] < A[m+1..r]

"""

A[i], A[r] = A[r], A[i] # i交换到末位r,作为主元

pivot = A[r] # 主元

m = l # 索引标记

for n in xrange(l, r): # l..r-1

if A[n] <= pivot:

A[m], A[n] = A[n], A[m] # 交换

m += 1 # 后移

A[m], A[r] = A[r], A[m] # 主元到m位

return m

def _rand(A, l, r):

"""随机划分主元"""

return randint(l, r) # A[l..r]随机取一个

def _select(A, l, r, k, pivot_selector = _rand):

"""利用快排,得A[l..r]中第k小的数,k in [l+1,r+1]:

其尾递归方式,伪码如下:

SELECT(A, l, r, k)

1 while true:

2 i ← ? // 划分主元位置

3 m ← PARTITION(A, l, r, i) // 数组划分

4 n ← m - l + 1 // A[l..m]元素个数

5 if k = n // 检查A[m]是否是第k小的元素

6 then return A[m]

7 elseif k < n // 左划分区

8 r = m - 1

9 else // 右划分区

10 k = k - n

11 l = m + 1

Args:

pivot_selector(Function): 主元选取方法,默认随机方式

"""

if not A:

return None

if l == r:

return A[l]

while True:

i = pivot_selector(A, l, r)

m = _partition(A, l, r, i)

n = m - l + 1

if k == n:

return A[m]

elif k < n:

r = m - 1

else:

k = k - n

l = m + 1

def rand_select(A, k):

"""默认随机划分主元方式,k in [1, len(A)]

E[T(n)] = O(n)

"""

return _select(A, 0, len(A) - 1, k);

def _median(A, l, r):

"""对A[l..r]插入排序(原地)后选取其中位数位置"""

for j in xrange(l, r + 1):

k = A[j]

i = j

while i > l and A[i-1] > k:

A[i] = A[i-1]

i -= 1

A[i] = k

return l + int((r - l) * 0.5) # 下中位数

def _medianOfMedians(A, l, r):

"""中位数的中位数方式:

1. 划分为floor(n/5)个5元组,剩下(n%5)组成最后一组。

2. 找出ceil(n/5)个组各自的中位数。先对每组插入排序,再从中选出中位数。

3. 对第2步中找出的ceil(n/5)个中位数重复上述操作,直到仅有一个中位数。

"""

if l == r:

return l

n = r - l + 1 # 元素个数

m = int(ceil(n / 5.0)) # 划分组数,每组5个元素

for i in xrange(m):

# 每组起始位和结束位

sub_l = l + i * 5

sub_r = sub_l + 4

if sub_r > r:

sub_r = r

# 对每组元素插入排序后,选取中位数

sub_m = _median(A, sub_l, sub_r) # 中位数索引

# 交换中位数到前几位

j = l + i

A[j], A[sub_m] = A[sub_m], A[j]

return _medianOfMedians(A, l, l + m - 1) # 中位数的中位数

def bfprt_select(A, k):

"""中位数的中位数方式(BFPRT算法)

T(n) = O(n)

"""

return _select(A, 0, len(A) - 1, k, _medianOfMedians);

def _median3(A, l, r):

"""三数中位数方式,取l,r,(l+r)/2三数中位数"""

c = (l + r) / 2

keys = [l, c, r]

i = _median(keys, 0, 2)

return keys[i]

def median_select(A, k):

"""三数中位数方式,以消除最坏情况"""

return _select(A, 0, len(A) - 1, k, _median3);

if __name__ == '__main__':

import random, time

from copy import copy

print('preparing data...')

n = 1000000

nums = range(n)

random.shuffle(nums)

print('ready go!')

def timeit(fnc, *args, **kargs):

print('%s starts processing' % fnc.__name__)

begtime = time.clock()

retval = fnc(*args, **kargs)

endtime = time.clock()

print('%s takes time : %f' % (fnc.__name__, endtime - begtime))

return retval

test_methods = [rand_select, bfprt_select, median_select]

k = random.randrange(n) + 1

dashes = '---' * 10

for test in test_methods:

print(dashes)

nums_new = copy(nums)

result = timeit(test, nums_new, k)

print('the %dth smallest element: %d' % (k, result))

# 了解更多:

# http://blog.csdn.net/v_JULY_v/article/details/6370650

# http://en.wikipedia.org/wiki/Selection_algorithm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

原创:PHP内核研究:HASH表和变量

PHP HASH表 在PHP中,所有的数据 无论变量,常量,类,属性 都用Hash表来实现. 先要说说 HASH表 [c]typedef struct bucket { ulong h; /* Used for numeric indexing */ uint nKeyLength; //key长度 void *p…

Windows 11 小技巧- 安装

Windows 11 依赖于TPM 2.0&#xff0c;什么是TPM呢?TPM技术旨在提供基于硬件的与安全性相关的功能。TPM芯片是⼀个安全的加密处理器&#xff0c;有助于执⾏⽣成、存储和限制加密密钥的使用等操作。TPM芯片包含多重物理安全机制&#xff0c;具有防篡改功能&#xff0c;恶意软件…

如何判断一个人是不是值得深入交流?

全世界只有3.14 % 的人关注了爆炸吧知识每次翻看刚加好友的朋友圈时&#xff0c;都会对 ta 产生直观的判断。如果朋友圈很丰富&#xff0c;往往会觉得 ta 很有趣&#xff0c;会迫切想要和 ta 链接&#xff0c;而看到某些很单调的朋友圈&#xff0c;根本就没有深入沟通的欲望。真…

python 逆向生成正则表达式_用Python中的正则表达式生成lis

我有一个小脚本&#xff0c;用来产生一个预定义的字体和文本图像。我想将其更改为使用多种字体来呈现相同的文本&#xff0c;例如字母A以5种字体呈现。我将我的字体列表定义为&#xff1a;fonts [ Georgia, Consolas, Arial]然后我把它用在&#xff1a;for item in enumerate(…

Restive.js – 轻松让网站变成响应式和自适应

Restive.js 是一个 jQuery 插件&#xff0c;可以帮助您轻松快捷地添加响应式功能到你网站&#xff0c;适应几乎所有拥有 Web 功能的设备。使用设备检测&#xff0c;高级管理断点&#xff0c;以及方向管理的组合&#xff0c;Restive.js 会给你的网站提供一种不可思议的能力。 在…

消息分发的同步均衡策略

2019独角兽企业重金招聘Python工程师标准>>> TimeTunnel在做消息分发时有这样一个场景: A类消息需要做实时分析, 且量很大, 故它的消费者不会只是一台机器, 而是一组机器, 并要求这组中每台机器收到的消息量应该平均的, 即A消息在某个时刻有100条, 若有4台机器消费…

ssh长时间不操作便断开_连接SSH长时间不操作断开解决办法

经常连接ssh长时间不操作就断开&#xff0c;实在忍无可忍&#xff0c;每次都想解决这个问题&#xff0c;但是就是懒得搞&#xff0c;这次必须得一刀解决。解决方法一&#xff1a;服务器配置1、 连接SSHssh root192.168.0.1复制代码2、编辑sshd_configvim /etc/ssh/sshd_config复…

当下流行的直播技术demo演示

nginx-http-flv-module&#xff08;更新不是很频繁&#xff09; SRS: https://ossrs.net/lts/zh-cn/&#xff08;独立官网&#xff0c;目前最新稳定版version5&#xff09; 基于SRS搭建直播demo演示&#xff1a; 一、搭建流媒体服务器 参见官网&#xff1a;https://ossrs.ne…

SQL复制表

View Code --创建test_employee_info临时表结构&#xff0c;不保留关联关系select * into test_employee_info from employee_info where 1<>1;declare num intset num1while num<6begininsert into test_employee_info select employee_codepcast(num as varchar(1)…

Workflow Core + asp.net core 5.0 实现简单审批工作流

我们知道企业业务系统到处都可以审批工作流的&#xff0c;但也很少有像OA系统一样复杂多级多条件的审批工作流需要设计&#xff0c;所以我们需要一个轻量级的容易上手的workflow框架&#xff0c;通过GitHub,我发现danielgerlag/workflow-core 就非常合适&#xff0c;我下面我通…

python解析xml文件选用模块_python解析xml模块封装代码

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

超1亿人选择朋友圈三天可见,背后的原因值得深思

全世界只有3.14 % 的人关注了爆炸吧知识每次翻看刚加好友的朋友圈时&#xff0c;都会对 ta 产生直观的判断。如果朋友圈很丰富&#xff0c;往往会觉得 ta 很有趣&#xff0c;会迫切想要和 ta 链接&#xff0c;而看到某些很单调的朋友圈&#xff0c;根本就没有深入沟通的欲望。真…

基于HTML5手机上下滑动翻页特效

基于HTML5手机上下滑动翻页特效。这是一款手机移动端触屏滑动翻页代码下载。效果图如下&#xff1a; 在线预览 源码下载 实现的代码。 html代码&#xff1a; <section class"u-alert"><img style"display:none;" src"images/loading_larg…

在Centos中yum安装和卸载软件的使用方法

在Centos中yum安装和卸载软件的使用方法安装方法安装一个软件时yum -y install httpd安装多个相类似的软件时yum -y install httpd*安装多个非类似软件时yum -y install httpd php php-gd mysql卸载一个软件时yum -y remove httpd卸载多个相类似的软件时yum -y remove httpd*卸…

.NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计

几年前&#xff0c;我写过两篇关于用C#开发Linux守护进程的技术文章&#xff0c;分别是《.NET跨平台实践&#xff1a;用C#开发Linux守护进程.NET跨平台实践&#xff1a;再谈用C#开发Linux守护进程 — 完整篇这就是本文的初衷。关于Linux Daemon程序的原理之类的&#xff0c;已经…

代码优化从数据库里查数据

今天写了几行代码&#xff0c;都是从一个表里查数据。而我却查了三次数据库&#xff0c; 代码例子如下&#xff1a; dalclass.GetLie("userName","Student","userId"id); dalclass.GetLie("userClass","Student","user…

一寸照纯红色底图片_和记场下载

新能的事普及棘手源汽依然情车的是件&#xff0c;为王花燃油但和比车相&#xff0c;为王花底解电池和记场下载在没决续基础建设高额问题航、有彻以及前充电成本&#xff0c;它的体量不大依旧&#xff0c;新能形成正在逐渐之势推广尽管局部源汽全球车的所以。第一直接兼老个家话…

学点css基础

中午时间学点css&#xff0c;附带http://www.w3cschool.cc/css/css-tutorial.html这个链接&#xff01; 中午的时间学了这些东西&#xff01;如下图: 附带代码&#xff1a; 1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset&quo…

套套原来是这样装袋的,40个机械动图看懂好像并不容易。。。

今天咱们来多方位的展示机械的魅力1、真在的柔性自动包装线&#xff0c;可以同时实现一条线上多种不同物体的包装&#xff1a;好强大&#xff0c;美中不足的是没有防震包装&#xff0c;容易压坏商品。另外从视频上可以看出来纸板和物品一块出来&#xff0c;纸板出来时已经裁剪好…

python运算符号输入_【Python】【运算符】

【取模】所谓取模运算&#xff0c;就是计算两个数相除之后的余数&#xff0c;符号是%。如a % b就是计算a除以b的余数。用数学语言来描述&#xff0c;就是如果存在整数n和m&#xff0c;其中0 < m < b&#xff0c;使得a n * b m&#xff0c;那么a % b a - n * b m.取模…