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] 问题介绍 这是个超级超级经典的分治算法!!这个 ...
随机推荐
- 通过Cacti监控windows资源
前提条件 一.已安装好Cacti:ubuntu下cacti安装配置 二.准备好以下安装文件: Cacti_SNMP_Informant_Standard_Metrics_v13.zip(该cacti监 ...
- 【NOIP2015】子串
题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新的字符串,请问 ...
- Maya零基础新手入门教程第一部分:界面
第1步:菜单 如果您曾经使用过一个软件,那么您将习惯菜单!在Maya中,菜单包含用于在场景中工作的工具和操作.与大多数程序一样,主菜单位于Maya窗口的顶部,然后还有面板和选项窗口的单独菜单.您还可以 ...
- python selenium之Xpath定位
属性描述 XPath 语法支持节点描述,节点描述为一个逻辑真假表达式,任何真假判断表达式都可在节点后方括号里表示,这条件必须在XPath处理这个节点前先被满足.在某一步骤可有多少个描述并没有限制. 对 ...
- java集合之Stack栈基础
Stack堆栈: 是后进先出(LIFO)的对象堆栈,继承Vector—AbstractList--AbstractCollection类,底层是通过数组实现, boolean empty() 判断堆栈 ...
- SpringBoot:2.SpringBoot整合Thymeleaf模板引擎渲染web视图
在Web开发过程中,Spring Boot可以通过@RestController来返回json数据,那如何渲染Web页面?Spring Boot提供了多种默认渲染html的模板引擎,主要有以下几种: ...
- php函数分为哪两种?
PHP的真正威力源自于它的函数.函数分为内置函数和自定义函数. 内置函数 所谓PHP内置函数,就是在php程序的库里面已经定义了的函数,比如echo,mysql_connect,include_onc ...
- JS单例对象与构造函数对象的区别
JavaScript对象有几种: 内置对象如Global,Math对象等等. 本地对象如Object.Function.Array.String.Boolean.Number.Date.RegExp. ...
- linux 中 NTP 对时过程记录
1.连接需要对时的服务器 $: ntpdate -u 服务器ip地址 2.写对时任务的脚本 #:crontab -e 选择 2(nano编辑): 59 23 * * * /usr/sbin/ntpda ...
- GCC常用参数详解
转载:http://www.cnblogs.com/zhangsir6/articles/2956798.html 简介gcc and g++现在是gnu中最主要和最流行的c & c++编译器 ...