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] 问题介绍 这是个超级超级经典的分治算法!!这个 ...
随机推荐
- Vue入门教程 第三篇 (条件与循环)
v-if语法(条件) 符合条件时显示(渲染)某一元素. <div id="app"> <div v-if="ok"> <h1> ...
- QCustomPlot 基础
QCutomPlot简介 官网网址及介绍 https://www.qcustomplot.com/ QCustomPlot is a Qt C++ widget for plotting and da ...
- 部署主从dns
主机部署:yum安装DNS服务和依赖 [admin@haifly-bj-dns1 ~]$ sudo yum install bind-chroot启动named-chroot服务 [admin@hai ...
- Numpy数组操作
""" Numpy 数组操作 修改数组形状 函数 描述 reshape 不改变数据的条件下修改形状 flat 数组元素迭代器 flatten 返回一份数组拷贝,对拷贝所做 ...
- swap()函数的几种写法及优劣
试用几种方法实现swap函数,比较效率高低. 首先说结果,最快的是赋值交换. 原因分析 gcc开启O2优化后,三个函数的汇编代码一样.是的,除了第一行的文件名,一模一样. 附代码 void swap1 ...
- 玩转OneNET物联网平台之MQTT服务③ —— 远程控制LED(设备自注册)
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- 百万年薪python之路 -- 装饰器
装饰器 1.1 开放封闭原则 开放封闭原则具体定义是这样: 1.对扩展是开放的 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新 ...
- Kubernetes入门学习--在Ubuntu16.0.4安装配置Minikube
目 录 一. 安装minikube环境 1.1. 安装前准备 1.2. 安装Lantern 1.2.1. Lantern下载网站 1.2.2. Lantern下载地址 1.2.3. Lantern安装 ...
- OptimalSolution(4)--字符串问题(1)简单
一.判断两个字符串是否互为变形词 问题:给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样且每种字符出现的次数也一样,那么str1与str2互为变形词. 举例:str1=“1 ...
- SpringBoot1.x与监控(六)
由于2.x和1.x的监控不一样,此处先讲1.x 一 SpringBoot1.x监控 pom.xml <dependency> <groupId>org.springframew ...