在leetcode上刷339题Evaluate Division(https://leetcode.com/problems/evaluate-division/#/description)时在脑中过了一遍想法,大概是生成26棵树,每棵树又有26个子节点,子节点下方对应其父节点与祖父节点相除的结果.
使用树结构进行存储、再通过问题给出的字母利用DFS进行搜索。
觉得实现起来比较费键盘就没有继续写下去,跑到discuss区看大神的写法。
在ycf303(以下简称y神)的答案中第一次接触到unordered_map这一结构。
unordered_map是C++11特性,利用hash表实现,查找效率极高。
y神代码如下:

 1 class Solution {
2 public:
3 vector<double> calcEquation(vector<pair<string, string>> equations,
4 vector<double>& values, vector<pair<string, string>> query)
5 {
6 unordered_map<string,unordered_map<string, double>> m;
7 vector<double> res;
8 for (int i = 0; i < values.size(); ++i)
9 {
10 m[equations[i].first].insert(make_pair(equations[i].second,values[i]));
11 if(values[i]!=0)
12 m[equations[i].second].insert(make_pair(equations[i].first,1/values[i]));
13 }
14
15 for (auto i : query)
16 {
17 unordered_set<string> s;
18 double tmp = check(i.first,i.second,m,s);
19 if(tmp) res.push_back(tmp);
20 else res.push_back(-1);
21 }
22 return res;
23 }
24
25 double check(string up, string down,
26 unordered_map<string,unordered_map<string, double>> &m,
27 unordered_set<string> &s)
28 {
29 if(m[up].find(down) != m[up].end()) return m[up][down];
30 for (auto i : m[up])
31 {
32 if(s.find(i.first) == s.end())
33 {
34 s.insert(i.first);
35 double tmp = check(i.first,down,m,s);
36 if(tmp) return i.second*tmp;
37 }
38 }
39 return 0;
40 }
41 };

花了一个多小时对unordered_map进行研究和总结,发现相较于我利用树对题中数据进行存储的方式,unordered_map更加快捷,而且只有实际存在的数据才会进行插入,不用造成不必要的内存开销,是我这种内存强迫症患者的福音。
至于时间复杂度方面,unordered_map查找的时间复杂度O(1)和我的森林相同,但写起来要快捷的多,以后再遇到此类问题需要打表存储,都会尽量使用unordered_map。

利用unordered_map维护关联数据的更多相关文章

  1. J2EE进阶(七)利用SSH框架根据数据表建立model类

    J2EE进阶(七)利用SSH框架根据数据表建立model类 前言 在利用SSH框架进行项目开发时,若将数据库已经建好,并且数据表之间的依赖关系已经确定,可以利用Hibernate的反转功能进行mode ...

  2. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  3. EF里单个实体的增查改删以及主从表关联数据的各种增删 改查

    本文目录 EF对单个实体的增查改删 增加单个实体 查询单个实体 修改单个实体 删除单个实体 EF里主从表关联数据的各种增删改查 增加(增加从表数据.增加主从表数据) 查询(根据主表找从表数据.根据从表 ...

  4. Entity Framework Code First实体关联数据加载

    在项目过程中,两个实体数据之间在往往并非完全独立的,而是存在一定的关联关系,如一对一.一对多及多对多等关联.存在关联关系的实体,经常根据一个实体的实例来查询获取与之关联的另外实体的实例. Entity ...

  5. Android利用Fiddler进行网络数据抓包

    最新最准确内容建议直接访问原文:Android利用Fiddler进行网络数据抓包 主要介绍Android及IPhone手机上如何进行网络数据抓包,比如我们想抓某个应用(微博.微信.墨迹天气)的网络通信 ...

  6. MagicalRecord 多表关联数据操作

    最近在使用MagicalRecord做数据持久层CoreData的操作库,今天做了一个多表关联数据的操作,整理了一个demo,特此记录一下. 关于如何使用Cocopads 和 MagicalRecor ...

  7. 机器学习实战 - 读书笔记(13) - 利用PCA来简化数据

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第13章 - 利用PCA来简化数据. 这里介绍,机器学习中的降维技术,可简化样品数据. ...

  8. ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK

    看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, 加入一个表10W数据,另一个表也是10万数据,当你用linq建立一个连接查询 ...

  9. Contoso 大学 - 6 – 更新关联数据

    原文 Contoso 大学 - 6 – 更新关联数据 By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Microsoft's ...

随机推荐

  1. 2021.11.4测试T1-妹子

    题目 今天测试,直接挂完了 写了四个小时,最后发现自己题目理解错误了 有两个区间,在输入了 \(l\) 和 \(r\) 以后,进行查询 \[ min(max(a_1,a_2,...a_p,b_{p+1 ...

  2. Redis源码分析(skiplist)

    源码版本: redis-4.0.1 源码位置: server.h :zskiplistNode和zskiplist的数据结构定义. t_zset.c: 以zsl开头的函数是SkipList相关的操作函 ...

  3. MySQL基础学习——SQL对数据库进行操作、对数据库的表进行操作

    1.SQL对数据库进行操作: 创建数据库: 语法: create database 数据库名称 [character set 字符集 collate 字符集校对规则];字符集校对规则即所用字符集的数据 ...

  4. STC单片机控制28BYJ-48步进电机

    STC单片机4*4按键控制步进电机旋转 28BYJ-48型步进电机说明 四相永磁式的含义 28BYJ-48工作原理 让电机转起来 最简单的电机转动程序 电机转速缓慢的原因分析 便于控制转过圈数的改进程 ...

  5. 大爽Python入门教程 0-1 安装python

    大爽Python入门公开课教案 点击查看教程总目录 一 如何找到下载地址并下载 下面展示找到下载地址的方法步骤 嫌步骤太慢可直接跳到第4步, 查看详细下载地址 使用搜索引擎搜索python 打开搜索结 ...

  6. 「期末」一文带你系统回顾C 语言

    超详细 c 语言回顾 前言 c 语言是一种底层语言,是一种系统底层级的语言,例如Windows.Linux.Unix等操作系统就是使用c语言编写的.所以由此看来,不论是火爆了25年的Java,还是近年 ...

  7. Excel 读取写入数据库

    // Excel 读取写入数据库 // 3.8版本的poi  4.0 可以不用写  parseCell  这个方法,可以直接赋值 STRING 类型 import org.apache.poi.hss ...

  8. 数字逻辑实践3->EDA技术与Verilog设计

    本文属于EDA技术概述类文章 1 EDA技术及其发展 概念 EDA(Electronic Design Automation),指的是以计算机为工作平台,以EDA软件工具为开发环境,以PLD期间或者A ...

  9. RocketMq报错 Java HotSpot(TM) Server VM warning:

    Java HotSpot(TM) Server VM warning: Using the DefNew young collector with the CMS collector is depre ...

  10. 直接插入100w数据报错

    ### Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (77,600 ...