记录一道面试题(哈希表 稀疏矩阵)

news/2024/10/10 10:52:33

题目:

有一个游戏中的三维地图,是由i,j,k三个轴组成的三维网络。每个立方体由不同的种类代表,比如空气,水,沙子,泥土。
地图上方的空气方块,不会经常变动且数量占大多数,下方是各种类型的方块,会经常相互转换(水变沙子,沙子变泥土等)。

问题:请你实现一个存储该地图的方案(地图方块和对应类型)。
要求:尽量减少内存空间占用,要支持高频查询。

思路:

1.首先要有整体意识,地图是一个三维坐标系,有三个轴。应该要想到用矩阵或者多维数组。

2.要注意要求中的“尽量减少内存空间占用”,由于空气多且不易变动,可以采用稀疏矩阵来存。相当于没数据的时候就是空气。

3.要支持高频查询,哈希表应该是最快的。

上代码:

blockmap.h

#ifndef BLOCKMAP_H
#define BLOCKMAP_H#include <unordered_map>/*
有一个游戏中的三维地图,是由ijk三个轴组成的三维网络。每个立方体由不同的种类代表,比如空气,水,沙子,泥土。
地图上方的空气方块,不会经常变动且数量占大多数,下方是各种类型的方块,会经常相互转换(水变沙子,沙子变泥土等)。问题:请你实现一个存储该地图的方案(地图方块和对应类型)。
要求:尽量减少内存空间占用,要支持高频查询。关键思路:
1.由于空气变动少且占用多,可以采用稀疏矩阵存储,节省内存资源。
2.用哈希表存储非空气块,方便快速查询。
*/// 方块类型:实际项目应该还会存储别的成员。比如颜色之类的。也可以用枚举定义类型
struct Block
{int type = 0; // 0-空气 1-水 2-泥土 3-沙子 4-树
};class BlockMap
{
private:std::unordered_map<long long, Block> blockMap; // 用哈希表存储非空气块,方便快速查询。const int airType = 0; // 空气类型为0long long encodeKey(const int& i, const int& j,const int& k) // 为了生成唯一的key,合并成一个long long
    {return (static_cast<long long>(i) << 40) | (static_cast<long long>(j) << 20) | k;}
public:BlockMap(){}//获取方块类型int getBlockType(const int& i, const int& j,const int& k){long long key = encodeKey(i,j,k);if(blockMap.find(key) != blockMap.end()){return blockMap[key].type;}else{return airType; // 找不到的时候,默认就是空气。
        }}// 设置方块类型void setBlockType(const int& i, const int& j,const int& k, const int& type){auto key = encodeKey(i,j,k);if(type == airType){return; // 不存空气。节省内存空间。
        }else{Block newbk;newbk.type = type;blockMap[key] = newbk;}}
};void BlockMapTest(); // 测试程序#endif // BLOCKMAP_H

测试:

#include "blockmap.h"
#include <qDebug> // Qt平台的头文件。非C++标准库void BlockMapTest()
{BlockMap mapTest;mapTest.setBlockType(1,1,1,1);mapTest.setBlockType(2,2,2,2);mapTest.setBlockType(3,3,3,3);qDebug() << "1,1,1 类型为:" << mapTest.getBlockType(1,1,1);qDebug() << "2,2,2 类型为:" << mapTest.getBlockType(2,2,2);qDebug() << "3,3,3 类型为:" << mapTest.getBlockType(3,3,3);qDebug() << "1,0,1 类型为:" << mapTest.getBlockType(1,0,1);
}

执行效果:

总结:

数据结构还是要多熟悉,自己写不出来的话要会选择最合适的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/69713.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

面试 - 补充 - HTML/CSS(可能问到的题目展示)

如何理解HTML语义化? 默认情况下,哪些元素是块级元素,哪些是内联元素? 盒模型宽度如何计算? margin纵向重叠的问题 margin负值的问题 BFC理解和应用 float布局的问题 flex画色子 absolute和relative依据什么定位? 居中对齐有哪些实现方式 line-height继承(有坑) rem是什…

【AI系统】AI系统的设计目标与挑战

在当今快速发展的人工智能领域,AI系统的设计目标和面临的挑战是多维度的。本文将探讨AI系统设计的核心目标以及为实现这些目标所面临的挑战。I. 引言 AI系统作为连接硬件和上层应用的桥梁,其设计目标直接影响着AI技术的发展和应用的广泛性。一个高效、灵活且稳定的AI系统是推…

题解:P7353 [2020-2021 集训队作业] Tom Jerry

Problem Link 思考 Tom 怎么获胜,有以下两种情况:Tom 不断限制 Jerry 的活动范围,直到困死。 ~Tom 瞎走都可以赢~,有一个点能让 Tom 必胜。对于(1),显然 Tom 需要不断走割点,由此想到圆方树。假设 Tom 在 \(a\),Jerry 在 \(d\),Jerry 能在 \(a\) 的子树里任意走,所以…

利用大模型设计测试用例

安装python 依赖 pip install torch transformers accelerate sentencepiece python代码,设计一个测试用例from transformers import AutoTokenizer, AutoModelForCausalLM import os import torch # 导入 torch 库# 设置 HTTP 和 HTTPS 代理(如果需要) os.environ[http_pr…

测试流程必须严格执行吗?

技术交流群有同学问了这样一个问题:公司有较为严格的测试流程和项目交付规范,但目前工期紧张且资源严重不足,是否还需要严格遵守流程规范。如果严格遵守流程规范则可能要延期交付,或者项目组的同学需要大量加班,有什么解决办法?该说不说,这确实是很头疼的问题。对项目管…

Semaphore源码简单解读

Semaphore源码解读 注意,阅读本文需要了解AQS,AQS采用了模板设计模式。后续本人会完善这篇文章 Semaphore的方法acquire() 阻塞获得一个许可,会阻塞,直到得到一个可用许可或被中断 重载版本 acquire(n) :尝试获取n个许可 acquireUninterruptibly() 类acquire,但不可中断 …

捕鱼船识别检测预警系统

捕鱼船识别检测预警系统通过图像识别和数据分析技术,捕鱼船识别检测预警系统实时监测水域中的捕鱼船活动,系统利用河道两岸的摄像头,对捕鱼船的外形、大小、航行轨迹等进行检测和识别。捕鱼船识别检测预警系统一旦系统识别到违规捕捞行为,立即发出预警信号,并通知相关部门…