标准库 之 nth_element

STL库中实现了nth_element函数,实现的功能是 “返回n个元素中的第k小的元素”。

首先,头脑风暴一下“返回n个元素中的第k小的元素”的算法:

1  
 排序 ,首选快排  O(n*logn),取出第k个即可。

2
其次,是维护一个大小为k的数组,找出数组中的最大值kmax,然后依次遍历剩下的 n-k 个元素,如果小雨kmax,则替换掉kmax

元素,然后再找出其中的最大值,重复上述过程,时间复杂度为 O(n*k)。

3
对2的改进,使用大小为k个大顶堆,时间复杂度为 O(n*logk),代码实现如下。

上述函数实现的是返回前k小的元素。

4
便是此处要提到的STL库中的nth_element函数的实现了。

原理:

在STL库中,nth_element的实现是基于快速排序的partition的过程。

0)分两种,第一,如果处理的元素的个数小于某一个阈值(此处为3)。那么使用插入排序,否则,转1)

1)选出pivot,使用的是first,last,以及中间元素的中间值,(其实,在快速排序中,这样选择pivot可能导致最坏时间复杂度的

概率已经是可以忽略不计了),根据该pivot的值将数组进行划分,得到A[ first ,.... ,cut] , 与 A[cut  ... last]

2) 如果小于pivot的元素个数已经是K,直接返回。

3) 如果小于pivot的元素小于K,那么在 大于pivot的部分寻找第K - ( cut - first +1 ) 大的元素。转入1),递归即可。

4) 如果小于pivot的元素大于K,那么在 小于pivot的部分继续寻找第 K大 的 元素。转入1),转入1),递归即可。

模拟实现:

下面是自己实现的代码:

上述函数只想完成之后,返回的数组的前K个元素就是最小的K个元素,并且第K小的元素在其位置上。

源码剖析:

代码为:

上述的STL库中的代码,显得很繁琐,其实主要是都是模板函数。原理其实很简单。

其实,归根结底,就以下几点:

如果元素个数比较多的时候,那么利用快排的partition的思想,就可以将问题的规模降低。

如果元素个数比较少的时候,那么直接使用插入排序,是很好的选择, 在数组元素个数比较少或者是数字基本有序的时候,插入排

序是很好的选择。

标准库 之 nth_element,布布扣,bubuko.com

时间: 2024-10-15 09:37:53

标准库 之 nth_element的相关文章

3.2 标准库类型string(上)

#include <string> #include <iostream> using std::string; using std::cin; using std::cout; using std::endl; //string定义在命名空间std中 int main() { /**************3.2.1 定义和初始化string*****************/ string s1; //默认初始化,S1是一个空字符串 string S2 = s1; //S2时S

Obstack是C标准库里面对内存管理的GNU扩展

Obstack介绍 Obstack初始化 在Obstack中申请对象 释放对象 申请growing object 获取Obstack状态 数据对齐 以下是来自wiki对obstack的介绍: Obstack是C标准库里面对内存管理的GNU扩展(实际上就是GNU C library了).Obstack===Object stack.没错,Obstack就是一个栈,栈里面的元素是对象object(不是面向对象的对象哦,这里的对象单指数据元素).这些数据是动态的,也就是使用的是动态内存.这种内存管理技

C++温习-标准库-set

set,就是集合,其满足唯一性, C++中的标准库set是一个类模板, template < class T, // set::key_type/value_type class Compare = less<T>, // set::key_compare/value_compare class Alloc = allocator<T> // set::allocator_type > class set; 正常使用需要提供类别参数如 set<string>

Django的标准库django.contrib包介绍

前面我们激活了 Django 后台,我们要使用自动化的站点管理工具(django.contrib.admin),所以最好对Django.contrib进行了解,它是啥?它是一个强大的功能包,是Django的标准库. Django的标准库存放在 django.contrib 包中.每个子包都是一个独立的附加功能包. 这些子包一般是互相独立的,不过有些django.contrib子包需要依赖其他子包. 在 django.contrib 中对函数的类型并没有强制要求 .其中一些包中带有模型(因此需要你

一、Python的标准库String

一.Python的标准库String 1.查看武器 a. help(type()) name = "jane"print(help(type(name))) b. capitalize() name = "jane" print(name.capitalize()) 效果:Jane c. center() name = "jane" print(name.center(50, '-')) 效果:-----------------------jan

介绍下Python的两个标准库 os 和 sys

import sysprint(sys.path) #python 2 中报错 ....,打印的是绝对路径(***\\python\\lib\\site-packages# 第三方库,后退一级为标准库) '''import osos_sys = os.system("dir")print("---->",os_sys) #执行命令,不保存结果os.popen("dir").read #os.popen 打印的为对象地址,加上read 取出结

STL标准库-容器-list

摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. list 表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前和向后两个方向进行遍历.在list 的任意位置插入和删除元素的效率都很高. 它的结构 一 定义 头文件 #include <vector> #include <iostream> #include <list> using namespace std; int main(int argc, const c

python MultiProcessing标准库使用Queue通信的注意要点

今天原本想研究下MultiProcessing标准库下的进程间通信,根据 MultiProcessing官网 给的提示,有两种方法能够来实现进程间的通信,分别是pipe和queue.因为看queue顺眼,就想着拿queue实现,后来,被坑了....于是有了这篇文章.我按照 python标准库之MultiProcessing库的研究 (1) 里面的代码来的,结果就是不断的出错,死过就是不出结果,看看程序: from multiprocessing import Pool, queues impor

python标准库Beautiful Soup与MongoDb爬喜马拉雅电台的总结

Beautiful Soup标准库是一个可以从HTML/XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式,Beautiful Soup将会节省数小时的工作时间.pymongo标准库是MongoDb NoSql数据库与python语言之间的桥梁,通过pymongo将数据保存到MongoDb中.结合使用这两者来爬去喜马拉雅电台的数据... Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是