用vector或者set删除一亿个数里的奇数

如何用vector或者set删除一亿个数里的奇数

先说说VECTOR怎么删除指定的元素,因为VECTOR有迭代器失效的问题,一般人都会写这么样的一个函数

for(vector<int>::itertor it=a.begin();it!=a.end();)
{
	if(a[i]%2==1)
		it=a.erase(it);
	else
		it++;
}

这样的函数如果数据量很小的话基本没有什么问题,但是如果数据量是1个亿,那么你得要运行1天的时间才能完全删除掉,这是因为VECTOR要动态调整,还要收缩容量。

最好的方法是erase-remove方法,这样的话就得使用remove_if的方法来完成删除,这种方法只需要O(N)的时间复杂度.一亿个数,扫描一遍就可以了。

#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;

bool badValue(unsigned int x)
{
	if(x%2==1)
		return true;
	else
		return false;
}

void main()
{
	vector<unsigned int> a(100000000,1);
	for(unsigned int i=0;i<100000000;i++)
		a[i]=i;

	a.erase(remove_if(a.begin(),a.end(),badValue) , a.end());
}

差不多1S的时间就删除掉了所有的奇数。。

remove的原理是把旧容器满足条件的值一个一个复制到新容器中,返回最后一个满足条件值的下一个位置,并且新容器和旧容器其实是同一个容器。

如果是SET的话用上面的方法也完全可以,因为set是一颗红黑树,删除效率为O(logN),比使用remove方法的vector还要快。

时间: 2024-10-18 16:33:01

用vector或者set删除一亿个数里的奇数的相关文章

面试题-10亿个数中找出最大的10000个数(top K问题)

一个较好的方法:先拿出10000个建立小根堆,对于剩下的元素,如果大于堆顶元素的值,删除堆顶元素,再进行插入操作,否则直接跳过,这样知道所有元素遍历完,堆中的10000个就是最大的10000个.时间复杂度: m + (n-1)logm = O(nlogm) 优化的方法:可以把所有10亿个数据分组存放,比如分别放在1000个文件中(如果是字符串hash(x)%M).对每个文件,建立大小为10000的小根堆,然后按有序数组的合并合并起来,取出最大的10000个即是答案. top K问题 在大规模数据

给40亿个不重复的unsigned int的数,没排序,然后再给一个数,如何快速间断这个数是否在那40亿个数中

40亿个数,如果用无符号的long long数组来存,那么使用数组里的每一个元素的每一位代表一个数,具体为: a[0]  ---- 0~63 a[1]  ---- 64~127 a[2]  ---- 128~190 ... 那么,40亿 bit/64 = 6.25*107 *8 byte = 500MB , 内存就满足了. #include <iostream> #include <bitset> #include <cstring> #include <vect

统计字符串中的删除的单词个数

public class Demo24 { public static void main(String[] args) { String s = "woaijavahahajavaaiwo"; //原来字符串的长度 int length = s.length(); //删除后的长度 int replace = s.replace("java", "").length(); //删除的总长度 int x =length-replace; //单个

C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法

C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法. C++ 中std::remove()并不删除元素,因为容器的size()没有变化,只是元素的替换. 1.std::vector::erase() 函数原型:iterator erase (iterator position); //删除指定元素 iterator erase (iterator first, iterator last); //删除指定范围内的元素 返回值:指向删除元素(或

Quick-Select 1亿个数快速求第K小的数 分治法

Quick-Select  1亿个数快速求第K小的数  分治法 利用快速排序的思想,一开始选取中枢元,然后左右调整,接着比对中枢元p和K的大小,如果 p+1 = k (数组从0开始), 那么a[p] 就是答案,因为在p之前的,肯定都是小于a[p]的, 在p之后的,肯定大于p, 所以 a[p] 就是第 p+1 小.假如 p+1 不等于K, 那么根据大小,进行左右调整.调整过程中,理想状态下,每次都砍掉一半,数组的起始坐标要进行调整. 代码: // 快速排序法的修改 #include <iostre

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。

思路:回文串的特点是,逆序输出和正序输出是一样的.所以这道题可以从这方面来考虑.如果将此字符串逆序输出,那么两个字符串的最长公共子序列将是最长的回文字符串,那么剩余的值将是要删除的字符个数. 求LCS的方法可以在csdn中找到. import java.util.*; public class Main{ public static void main(String[] args){ Scanner scan = new Scanner(System.in); while(scan.hasNex

构造回文 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。

输入描述: 输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000. 输出描述: 对于每组数据,输出一个整数,代表最少需要删除的字符个数. 输入例子: abcda google 输出例子: 2 2 给出c++代码: #include <iostream>#include <string>#include <algorithm>using namespace std;int LCS(const string &str1,con

利用最小堆找出10亿个数中最大的10000个数

最小堆 最小堆是一种完全二叉树,特点是根节点比两个子节点都小(或者根节点比子节点都大) 过程 先找10000个数构建最小堆 依次遍历10亿个数,如果比最小堆的最小值大,则替换这个最小值,并重新构建最小堆 最后输入10000个值 时间复杂度 构建最小堆的复杂度为 logn,求出最大m个数会构建m次最小堆,时间复杂度为 m logm, 这里m为10000 进行n次时间复杂度为n,这里n为10亿,总时间复杂度为 n m logm,即10亿 10000 log 10000 其他算法 将十亿个数排序,找出

100w 个整数里取出最大的 500 个, 可以转换为 n 个数里取出最大的 m 个

/** * 100w 个整数里取出最大的 500 个: * 可以转换为 n 个数里取出最大的 m 个,其中 m < n,采用堆排序实现,时间复杂度为 n + nlogm * 举例:12 20 9 18 7 14 几个数中取出最大的三个: * 做法:遍历所需计算的整数.创建一个节点数为3的最小堆,当堆装满后,再来的数与根节点对比,如果比根节点大,替换,然后再走到根节点相应的位置,图例如下: * (0) (1) (2) (3) (4) (5) (6) (7) (8) * 12 12 12 12 9