这是一个面试问题。
提供实现此目标的最佳解决方案:
输入:学生记录列表,按名称排序
输出:学生记录列表,按年级排序,然后按名称分类
等级可以是'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
我提出了这个解决方案:
O(n2)
插入的复杂性,我将最后一个节点指针存储在存储桶中,这实现了O(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)
空间,但是说 - 这不是免费的午餐 - 这里的常数要差得多。