左神算法基础班5_1设计RandomPool结构
时间:2019-06-12
本文章向大家介绍左神算法基础班5_1设计RandomPool结构,主要包括左神算法基础班5_1设计RandomPool结构使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Problem:
设计RandomPool结构
【题目】 设计一种结构,在该结构中有如下三个功能:
insert(key):将某个key加入到该结构,做到不重复加入。
delete(key):将原本在结构中的某个key移除。
getRandom():等概率随机返回结构中的任何一个key。
【要求】 Insert、delete和getRandom方法的时间复杂度都是O(1)
Solution:
使用两个hash表,一个是记录标号,一个记录关键词
这里有个关键之处就是,等概率返回一个关键词
若简单使用用哈希表来进行存储,那么有个问题,当删除数据时,会使得哈希表中间产生空白数据
最好的避免中间产生空数据的方法就是将要删除数据的与表中末尾的数据进行交换
然后直接删除最后的数据,故需要使用两个哈希表
Code:
1 #pragma once 2 #include <iostream> 3 #include <hash_map> 4 #include <string> 5 #include <time.h> 6 #include <stdlib.h> 7 8 using namespace std; 9 10 template<class T> 11 class RandomPool 12 { 13 public: 14 void insert(T key); 15 void del(T key); 16 T getRandom(); 17 void getPrint(T key); 18 void getPrint(int index); 19 20 private: 21 hash_map<T, int>KeyMap; 22 hash_map<int, T>IndexMap; 23 int size = 0; 24 }; 25 26 27 template<class T> 28 void RandomPool<T>::insert(T key) 29 { 30 if (KeyMap.find(key) == KeyMap.end()) 31 { 32 KeyMap[key] = this->size; 33 IndexMap[this->size] = key; 34 ++(this->size); 35 cout << "add succeed!" << endl; 36 } 37 else 38 cout << "add filed!" << endl; 39 } 40 41 42 template<class T> 43 void RandomPool<T>::del(T key) 44 { 45 auto ptr = KeyMap.find(key); 46 if (ptr == KeyMap.end()) 47 { 48 cout << "delete filed! there is not exsite the key!" << endl; 49 return; 50 } 51 //交换查找到元素与最后一个元素 52 T temp = IndexMap[--(this->size)];//最后一个元素的关键词,同时将hash表中的元素删除了 53 int index = KeyMap[key];//要删除元素的位置 54 KeyMap[temp] = index; 55 IndexMap[index] = temp;//将最后一个元素替换要删除元素的位置 56 //正式删除 57 KeyMap.erase(ptr); 58 IndexMap.erase(IndexMap.find(index)); 59 } 60 61 template<class T> 62 T RandomPool<T>::getRandom() 63 { 64 if (this->size == 0) 65 { 66 cout << "the map is empty!" << endl; 67 } 68 else 69 { 70 int index = (int)((rand() % (99 + 1) / (double)(99 + 1))*(this->size));//随机生成一个位置 71 return IndexMap[index]; 72 } 73 } 74 75 template<class T> 76 void RandomPool<T>::getPrint(T key) 77 { 78 if (KeyMap.find(key) == KeyMap.end()) 79 cout << "the key is not exsite!" << endl; 80 else 81 cout << KeyMap[key] << endl; 82 } 83 84 template<class T> 85 void RandomPool<T>::getPrint(int index) 86 { 87 if (IndexMap.find(index) == IndexMap.end()) 88 cout << "the key is not exsite!" << endl; 89 else 90 cout << IndexMap[index] << endl; 91 } 92 93 94 void Test() 95 { 96 srand((unsigned)time(NULL)); 97 RandomPool<string>map; 98 map.insert("zz"); 99 map.insert("zw"); 100 map.insert("ww"); 101 map.insert("wz"); 102 103 cout << map.getRandom() << endl; 104 map.getPrint(2); 105 map.getPrint("ww"); 106 map.del("zw"); 107 map.getPrint("zw"); 108 }
原文地址:https://www.cnblogs.com/zzw1024/p/11009839.html
- 有趣的linux命令总结(78天)
- 生产环境sql语句调优实战第七篇(r2笔记99天)
- 一个普通数据库用户所能查到的"意料之外"的信息(r2笔记98天)
- 查看并行进程的一些简单信息(r3笔记第17天)
- 多行数据的批处理之bulk collect(r3笔记第16天)
- pl/sql中错误的异常处理 (r3笔记第15天)
- 关于session leak的问题分析(r3笔记第13天)
- 执行计划的偏差导致的性能问题(r3笔记第12天)
- 关于评审开发人员的sql语句(r3笔记第11天)
- 性能下降的不定时炸弹_过旧的sql_profile(r3笔记第9天)
- 关于抓取session信息的一个脚本(r3笔记第8天)
- oracle PL/SQL中的重载 (r3笔记27天)
- 使用Python进行描述性统计
- 关于修改分区表的准备和操作细则(r3笔记26天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Docker】项目实战,部署自己的APP
- 用云开发快速构建最美AI毕业照小程序
- 13-2 vi-启动和退出
- Java中四种引用类型:强引用,软引用,弱引用,虚引用
- docker-compose搭建redis集群之哨兵模式
- docker-compose搭建redis集群之主从复制
- c/c++补完计划(七): 哨兵节点
- ASP.NET Core 奇技淫巧之接口代理转发
- SpringBoot 通过注解的方式整合 Mybatis + PageHelper 分页显示
- 将BX中的数以二进制形式在屏幕上显示出来。
- String及StringTable(二):java中的StringTable
- 设在起始地址为STRING的存储空间存放了一个字符串(该串已存放在内存中,无需输入,且串长不超过99),统计字符串中字符“A”的个数,并将结果显示在屏幕上。
- Docker容器ElasticSearch-Head创建索引无响应406
- springboot监控&springboot配置https
- 面试中最长常问到的 HashMap,你都知道多少?