将名称有序列表转换为等级有序列表

时间:2014-06-10 12:51:26

标签: algorithm sorting data-structures asymptotic-complexity

这是一个面试问题。

提供实现此目标的最佳解决方案:
输入:学生记录列表,按名称排序 输出:学生记录列表,按年级排序,然后按名称分类 等级可以是'A','B','C','D','E'

示例输入

Name | Grade  
Adam | B  
Ashley | C  
Boxer | A  
Britney | A
Caroline | E  
David | B  

示例输出

Name | Grade  
Boxer | A  
Britney | A
Adam | B  
David | B  
Ashley | C  
Caroline | E 

我提出了这个解决方案:

  1. 将列表插入到地图
  2. 哈希地图有5个桶,每个等级一个
  3. 将共享相同成绩的学生插入一个桶中。
  4. 链接用于管理碰撞
  5. 为避免O(n2)插入的复杂性,我将最后一个节点指针存储在存储桶中,这实现了O(1)随机插入复杂度。
  6. 我的问题是我的解决方案是否正确? 如果是,可以改进什么? 如果不是,可以使用哪种其他数据结构来实现这一目标?

1 个答案:

答案 0 :(得分:0)

您的方法是O(n)时间,O(n)额外空间,基本上是Bucket Sort的变体(可能是采访者想要听到的内容)。

就时间复杂度而言 - 这是您可以实现的最佳渐近复杂度,因为输出大小本身为O(n)

请注意,您实际上并不需要哈希映射,您可以只拥有一个链接列表数组,其中A级映射到数组的第一个条目,B级映射到第二个条目,依此类推。 ..


然而,一个小优化实际上是一种权衡:

你可以O(n)时间O(1)空间 - 通过每个可能的等级迭代一次,使你的时间更糟糕的常数:

for each grade (descending order):
   for each student in list:
       if student.grade == grade: 
           print student

这将是O(G*n)时间,其中G是可能等级的数量,但由于它是常量 - 它会衰减到O(n)时间,O(1)空间,但是说 - 这不是免费的午餐 - 这里的常数要差得多。