MST

星途 面试题库

面试题:Go语言复杂嵌套Map数据结构设计与优化

设计一个复杂的嵌套Map数据结构来模拟一个学校的课程管理系统。外层Map的键是年级(整数类型),值是另一个Map,这个Map的键是班级编号(字符串类型),值是一个切片,切片中每个元素又是一个Map,该Map的键是学生姓名(字符串类型),值是一个包含学生各科成绩(键为科目名称,值为成绩,成绩为浮点数)的Map。要求实现以下功能:1. 编写一个函数添加新学生及其成绩;2. 编写一个函数计算并返回某个班级某科目的平均成绩;3. 分析该数据结构在内存占用和查询效率方面的优缺点,并提出优化建议。
33.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
	"fmt"
)

// 定义课程管理系统的数据结构
type CourseManagementSystem map[int]map[string][](map[string]map[string]float64)

// 添加新学生及其成绩的函数
func (cms CourseManagementSystem) AddStudent(grade int, class string, student string, scores map[string]float64) {
	if _, ok := cms[grade];!ok {
		cms[grade] = make(map[string][](map[string]map[string]float64))
	}
	if _, ok := cms[grade][class];!ok {
		cms[grade][class] = make([]map[string]map[string]float64, 0)
	}
	studentInfo := make(map[string]map[string]float64)
	studentInfo[student] = scores
	cms[grade][class] = append(cms[grade][class], studentInfo)
}

// 计算并返回某个班级某科目的平均成绩的函数
func (cms CourseManagementSystem) CalculateAverage(grade int, class string, subject string) float64 {
	if _, ok := cms[grade];!ok {
		return 0
	}
	if _, ok := cms[grade][class];!ok {
		return 0
	}
	total := 0.0
	count := 0
	for _, studentInfo := range cms[grade][class] {
		for _, scores := range studentInfo {
			if score, ok := scores[subject]; ok {
				total += score
				count++
			}
		}
	}
	if count == 0 {
		return 0
	}
	return total / float64(count)
}

// 分析该数据结构在内存占用和查询效率方面的优缺点,并提出优化建议
// **优点**:
// - **内存占用**:结构清晰,层级明确,只有在实际添加数据时才会分配相应层级的内存空间,避免了预分配过多内存的浪费。
// - **查询效率**:在已知年级、班级、学生姓名和科目时,可以较为直接地定位到具体成绩,查询效率相对较高。

// **缺点**:
// - **内存占用**:嵌套的Map和切片结构会产生较多的指针和元数据开销,特别是当数据量较大时,内存占用会显著增加。
// - **查询效率**:如果需要进行复杂查询,例如统计全校某科目平均成绩,需要遍历所有年级、班级和学生,时间复杂度较高。

// **优化建议**:
// - **内存占用**:可以考虑使用数组代替某些层级的Map,前提是知道年级、班级等的范围,这样可以减少指针开销。
// - **查询效率**:可以预先计算并存储一些常用统计数据,如每个班级、每个年级的各科平均成绩等,这样在查询时可以直接获取,提高查询效率。

func main() {
	cms := make(CourseManagementSystem)
	cms.AddStudent(1, "1班", "小明", map[string]float64{"数学": 85, "语文": 90})
	cms.AddStudent(1, "1班", "小红", map[string]float64{"数学": 92, "语文": 88})
	fmt.Println(cms.CalculateAverage(1, "1班", "数学"))
}