Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我应该使用两个Hashmap来快速查找两个实体,而不是线性搜索一个Hashmap吗?_Python_Algorithm_Search_Data Structures_Hashmap - Fatal编程技术网

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()
应该返回给定班级的学生编号列表

我的第一个解决方案是使用hashmap
sn\u-to-u-class\u-map
(数字作为键,学生编号作为数据)和hashmap
class\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添加了伪代码您想在什么上优化?