map和set的使用及top K问题
1.map和set的应用和比较
map和set都是关联式容器,底层容器都是红黑树。
map以键值对的形式进行存储,方便进行查找,关键词起到索引的作用,值则表示与索引相关联的数据,以红黑树的结构实现,插入删除等操作都可以在O(log n)时间内完成。
- 所有元素都是键+值存在,key=value组成pair,是一组映射关系。
- 不允许键重复
- 所有元素是通过键进行自动排序的
- map的键是不能修改的,但是其键对应的值是可以修改的
#include<string>
#include<vector> //模拟pair和 make_pair的底层实现
//template<class K, class V>
//struct pair
//{
// K first;
// V second;
//
// pair(const K& key, const V& value)
// :first(key)
// , second(value)
// {}
//};
//template<class K, class V>
//pair<K, V> make_pair(const K& key, const V& value)
//{
// return pair<K, V>(key, value);
//} //vector<string> GetTopKF(const vector<string>& fruits)
//{
// vector<string> topk;
// typedef map<string, int> CountTop;
// typedef map<string, int>::iterator CountIt;
// CountTop counttop;
// for (size_t i = 0; i < fruits.size(); i++) {
// CountIt countit = counttop.find(fruits[i]);
// if (countit != counttop.end())
// (countit->second)++;
// else
// //counttop.insert(pair<string, int>(fruits[i], 1));
// counttop.insert(make_pair(fruits[i], 1));
// }
// return topk;
//}
vector<string> GetTopKF(const vector<string>& fruits)
{
vector<string> topk;
typedef map<string, int> CountTop;
typedef map<string, int>::iterator CountIt;
CountTop counttop;
for (size_t i = ; i < fruits.size(); i++) {
/*pair<CountIt, bool> retKV = counttop.insert(make_pair(fruits[i], 1));
if (retKV.second == false)
{
retKV.first->second++;
}*/
counttop[fruits[i]]++;
}
return topk;
} void MapTest()
{
typedef map<string, string> Dict;
typedef map<string, string>::iterator DictIt;
Dict dict;
dict.insert(pair<string, string>("right", "右边"));
dict.insert(pair<string, string>("left", "左边"));
dict.insert(pair<string, string>("世界", "你好"));
dict.insert(pair<string, string>("hello", "word"));
dict.insert(pair<string, string>("key", "键值")); DictIt dictit = dict.begin();
while (dictit != dict.end()) {
cout << (*dictit).first << " " << (*dictit).second << endl;
++dictit;
}
DictIt ret = dict.find("left");
if(ret != dict.end())
dict.erase(ret);
vector<string> v;
v.push_back("梨");
v.push_back("苹果");
v.push_back("西瓜");
v.push_back("香蕉");
v.push_back("西瓜");
v.push_back("香蕉");
v.push_back("菠萝");
v.push_back("西瓜");
v.push_back("草莓");
GetTopKF(v);
}
set支持高效的关键字查询操作---检查每一个给定的关键字是否在set中,也支持高效插入删除。
- 所得元素的只有key没有value,value就是key
- 不允许出现键值重复
- 所有的元素都会被自动排序
- 不能通过迭代器来改变set的值,因为set的值就是键
#pragma once
#include<iostream>
#include<set>
#include<map> using namespace std; void SetTest()
{
set<int> s1; //没有数据冗余
s1.insert();
s1.insert();
s1.insert();
s1.insert();
s1.insert();
s1.insert();
s1.insert();
s1.insert();
s1.insert();
s1.insert();
s1.insert();
s1.insert();
s1.insert(); //set的插入操作 set<int>::iterator ite = s1.begin();
//ite = 10;
while (ite != s1.end()) { //利用迭代器遍历打印数据
cout<<*ite<<" ";
ite++;
}
cout << endl;
set<int>::reverse_iterator ret1= s1.rbegin();
while (ret1 != s1.rend()) { //降序打印
cout << *ret1 << " ";
ret1++;
} set<int>::iterator ret = s1.find(); //
if (ret != s1.end()) //set的查找,如果没有找到不会报错
cout << "find it" << *ret << endl;
else
cout << "null" << endl; if (s1.count())//只判断是否存在14,返回1或0
cout << "find it" << endl;
else
cout << "null" << endl; ret = s1.find(); //find后删除
if (ret != s1.end())
s1.erase(ret);
set<int>::iterator last, first;
first = s1.lower_bound(); //返回8大的第一个数
last = s1.upper_bound(); //返回20大的第一个数
s1.erase(first, last);//删除这个范围的数据
s1.erase(); //有就删除,没有也不报错 set<int>::iterator ite1 = s1.begin();
while (ite1 != s1.end()) {
cout << *ite1 << " ";
ite1++;
}
}
void MultisetTest() {
multiset<int> s2; //允许数据冗余,其他操作同set
s2.insert();
s2.insert();
s2.insert();
s2.insert();
s2.insert();
s2.insert();
s2.insert();
s2.insert();
s2.insert();
s2.insert();
s2.insert();
s2.insert();
s2.insert();
multiset<int>::iterator mit = s2.begin();
while (mit != s2.end()) {
cout << *mit << " ";
mit++;
}
multiset<int>::iterator mIt = s2.find();
/*++mIt;
++mIt;
++mIt;
++mIt;*/
}
map的节点是一对数据,set的节点是一个数据。
2.扩展
map和set的使用及top K问题的更多相关文章
- 347. Top K Frequent Elements (sort map)
Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...
- 347. Top K Frequent Elements
Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...
- [LeetCode] Top K Frequent Words 前K个高频词
Given a non-empty list of words, return the k most frequent elements. Your answer should be sorted b ...
- 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些. 先拿10000个数建堆, ...
- 如何解决海量数据的Top K问题
1. 问题描述 在大规模数据处理中,常遇到的一类问题是,在海量数据中找出出现频率最高的前K个数,或者从海量数据中找出最大的前K个数,这类问题通常称为“top K”问题,如:在搜索引擎中,统计搜索最热门 ...
- [leetcode]692. Top K Frequent Words K个最常见单词
Given a non-empty list of words, return the k most frequent elements. Your answer should be sorted b ...
- [leetcode]347. Top K Frequent Elements K个最常见元素
Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...
- top k问题
1.top k问题 在海量数据处理中,经常会遇到的一类问题:在海量数据中找出出现频率最高的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题.例如,在搜索引擎中,统计搜索最 ...
- 【分步详解】两个有序数组中的中位数和Top K问题
(这也是一道leetcode的经典题目:<LeetCode>解题笔记:004. Median of Two Sorted Arrays[H] 问题介绍 这是个超级超级经典的分治算法!!这个 ...
随机推荐
- Android Studio 优秀插件:GsonFormat
作为一个Android程序猿,当你看到后台给你的json数据格式时: { "id":123, "url": "http://img.donever.c ...
- 阿里云服务器ecs + tomcat + 域名解析 部署web页面
1.购买ecs:https://www.aliyun.com/product/ecs?spm=5176.12825654.eofdhaal5.2.3bf92c4aYOB7gL&aly_as=A ...
- vue3.0 vue.config.js 配置实战
今天讲述一下vue-config.js配置,我们前面搭建好脚手架会发现,这个对比2.x版本少了很多东西,没有build的配置,也没有webpack的配置,那么问题来了,我们如何去开发我们的项目呢,比如 ...
- SQL SERVER数据库内,需要序列号进行排序时,排序方法
举例如下: SELECT ROW_NUMBER()OVER(ORDER BY (SELECT 0)) AS ROWNUM,* FROM YXHIS2018..TBMZGHMX201801 --不排序S ...
- springboot redis-cache 自动刷新缓存
这篇文章是对上一篇 spring-data-redis-cache 的使用 的一个补充,上文说到 spring-data-redis-cache 虽然比较强悍,但还是有些不足的,它是一个通用的解决方案 ...
- asp.net core 使用 AccessControlHelper 控制访问权限
asp.net core 使用 AccessControlHelper 控制访问权限 Intro 由于项目需要,需要在基于 asp.net mvc 的 Web 项目框架中做权限的控制,于是才有了这个权 ...
- linux服务器搭建--将win10换成linux
在这里说记录一下自己装linux的步骤,如果也有需要的朋友可以参看下: 1.目前win10的系统装成inux系统有3个解决办法: 第一:win10装linux子系统,网上已经有很多教程,步骤很简单 第 ...
- powershell下ssh客户端套件实现
有时会需要和Linux机器进行交互.所以这时就需要在Powershell中使用SSH. 0x01 查找Powershell中的SSH功能模块 如图,显示没有find-module的命令,需要安装Pac ...
- 渗透测试中Linux下反弹shell的认识
最近老是觉得自己白天工作累,晚上理应休息 堕落了几天才发觉自己真垃圾,加紧向前吧. 0x00 前言 在平时渗透还是工作中经常会遇到shell反弹的情况,网上一搜反弹shell都是一大堆,但是真正遇到反 ...
- phpstorm格式设置不同导致的Git代码无法正常比较
多人开发代码,使用Git作为管理工具,遇到一个问题是 : IDE的格式设置不一样导致的整个文件无法正常的比较. window 和 linux 以及 mac 不同平台的换行符是导致这一个问题比较常见的原 ...