Python 我应该使用两个Hashmap来快速查找两个实体,而不是线性搜索一个Hashmap吗?
我遇到了一个面试问题,我被要求做出一个优化的解决方案,在两个实例上实现搜索:学号和班级(每个学生只有一个)。Python 我应该使用两个Hashmap来快速查找两个实体,而不是线性搜索一个Hashmap吗?,python,algorithm,search,data-structures,hashmap,Python,Algorithm,Search,Data Structures,Hashmap,我遇到了一个面试问题,我被要求做出一个优化的解决方案,在两个实例上实现搜索:学号和班级(每个学生只有一个)。 sn\u to\u class()应返回学生编号的班级。另外,class\u sns()应该返回给定班级的学生编号列表 我的第一个解决方案是使用hashmapsn\u-to-u-class\u-map(数字作为键,学生编号作为数据)和hashmapclass\u-to-u-sns\u-map(班级作为键,学生编号作为数据)。因此,搜索将最小化为O(1),但数据将增加 伪代码: sn\u
sn\u to\u class()
应返回学生编号的班级。另外,class\u sns()
应该返回给定班级的学生编号列表
我的第一个解决方案是使用hashmapsn\u-to-u-class\u-map
(数字作为键,学生编号作为数据)和hashmapclass\u-to-u-sns\u-map
(班级作为键,学生编号作为数据)。因此,搜索将最小化为O(1)
,但数据将增加
伪代码:
sn\u map=dict()
cl_map=dict()
有趣的学生(sn、cl):
sn_映射[sn]=cl
cl#U映射[cl]。添加(序号)#列表
趣味学生(cl)
返回cl_映射[cl]
趣味班(sn)
返回序号映射[sn]
我的方法正确吗?并非总是可以优化所有内容;在时间和空间之间,一致性和可用性之间,或者一个操作所需的时间和另一个操作所需的时间之间,经常会有一个折衷 在您的情况下,您被要求制定一个“优化”的解决方案,您面临这样一个权衡:
- 如果您保留从学生编号到班级的映射,则
和getClass
的速度很快,并且您只使用该空间表示数据,但是addStudents
的速度较慢,因为它需要读取整个映射getStudents
- 如果您保留了从类到学生编号列表的映射,并且不担心这些列表中的学生编号顺序,那么
和getStudents
速度很快,并且您只使用该空间表示数据,但是addStudents
速度较慢,因为它需要读取整个映射getClass
- 如果你保留了一个从班级到学生编号排序列表的映射,那么
速度快,getStudents
比未排序列表快一点(它需要检查映射中的每个班级,但至少它可以在每个列表中进行二进制搜索),并且你只使用空间来表示数据,但是如果班级规模较小,getClass
仍然相对较慢,而getClass
则明显较慢,因为将学生插入列表可能需要很多时间addStudents
- 如果按照您的建议保留两个映射,那么所有操作都会非常快,但现在您需要两个数据表示的空间
所以在你描述的面试情况下,最好的方法是描述多种选择,解释权衡,解释为什么你会选择其中一种,并有选择地解释为什么双映射解决方案在实际程序中可能是最好的,但最后一部分并不是IMHO最重要的部分。从代码方面向我们展示您的两种解决方案您可以使用具有两个(或更多)索引的哈希映射,这至少会在一定程度上减少内存负担,虽然索引结构本身的开销通常是有限的。请注意,严格来说,字典最糟糕的时间复杂度仍然是O(n)。“我被要求制定一个优化的解决方案”--我想一个明显的问题是:为什么而优化?@DeveshKumarSingh添加了伪代码您想在什么上优化?