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班", "数学"))
}