关联式容器,海量数据问题,位图

C++11底层是哈希结构的关联式容器?
什么是关联式容器?
KV模型,或者K模型

KV模型
给一个文件:存储IP地址,找出出现次数对做的前K条IP地址,也就是top k问题
1.统计每个ip地址出现的次数-----><IP,出现次数>键值对
2.优先级队列创建的是小堆。

K模型
给一个英文词典,检测一个单词是否拼写正确
1.将词典中的单词存储
2.在存储的单词集合中找待检测的单词是否存在

C++11中提供的四种底层是哈希桶的关联式容器
unordered_map:K-V类型的键值对,并且K是不能重复的
unordered_set:元素类型K,并且key不能重复
unordered_multimap:元素类型K-V键值对,K是可以重复
unordered_multiset:元素类型K,并且K可以重复

#include<iostream>
#include<unordered_map>
#include<unordered_multimap>
#include<string>
using namespace std;
void func()
{
	unordered_map<string, string> m;
	m.insert(pair<string, string>("及时雨", "松江"));
	m.insert(make_pair("及时雨2", "宋江"));

	//查看元素个数
	cout << m.size() << endl;

	//查看桶的个数
	cout << m.bucket_count() << endl;
	
	//查看第0号桶中的元素个数
	cout << m.bucket_size(0) << endl;

	//查看及时雨在哪个桶中
	cout << m.bucket("及时雨") << endl;
	cout << m.bucket("及时雨2") << endl;


	//试试随机访问运算符[]
	cout << m["及时雨"] << endl;
	cout << m.size() << endl;

	//[]:如果key不存在,<key,默认value>构建一个键值对,然后将其插入到容器中,返回默认的value,vs2013返回空
	cout << m["董晨辉"] << endl;
	cout << m.size() << endl;




}
void func2()
{
	unordered_multimap<string, string> m;
}

int main()
{
	//func();
	func2();

	return 0;
}

如果有一个场景就是,查询的次数比较多的话,可以考虑unordered系列,因为unordered查询效率比较高。

在这里插入图片描述

迭代器的分类:
遍历的方向:正向迭代器,反向迭代器:对正向迭代器的一种适配
元素修改:普通迭代器----》可以通过迭代器修改迭代器对应的数据,const类型的迭代器不可以通过迭代器修啊该迭代器对应的数据。
实现本质:原生态的指针(要想使用原生态的指针,底层必须是连续的空间) ---->比如vector,string

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1G = 10亿字节
海量数据题2
在这里插入图片描述
注意字节是从0号字节开始计数的。
在这里插入图片描述
40亿整形数据映射到为题里面后有多大?
2^32 / 8 * 1024 * 1024 = 512 M

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
用位图排序要求数据中不能有重复的数据
1.把数据映射到位图,然后有数据的位置为1,否则为0
2.遍历位图,进行输出
在这里插入图片描述
上面的问题大概需要512 * 2 = 1024 M

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值