1. 数组(Array)
1. 数组(Array)
问题:需要按索引快速存取一组元素。
核心:元素在内存中连续存储,通过 基地址 + 索引 × 元素大小 直接算出地址,实现 O(1) 随机访问。
特点
- 内存连续分配
- 支持 O(1) 按索引访问
- 插入/删除需要移动元素,O(n)
优点
- 随机访问极快,缓存友好(CPU 预读连续内存)
- 实现简单,几乎所有语言内置
缺点
- 静态数组大小固定,动态数组扩容需要复制
- 中间插入/删除 O(n),效率低
- 需要大块连续内存,分配可能失败
// JS 的 Array 就是动态数组
const arr = [1, 2, 3, 4, 5];
// O(1) 随机访问
console.log(arr[2]); // 3
// O(1) 尾部插入(均摊)
arr.push(6);
// O(n) 中间插入
arr.splice(2, 0, 99); // [1, 2, 99, 3, 4, 5, 6]
// O(n) 删除
arr.splice(2, 1);package main
func main() {
// Go 切片 = 动态数组
arr := []int{1, 2, 3, 4, 5}
// O(1) 随机访问
_ = arr[2] // 3
// O(1) 尾部插入(均摊)
arr = append(arr, 6)
// O(n) 中间插入
arr = append(arr[:2], append([]int{99}, arr[2:]...)...)
// [1 2 99 3 4 5 6]
// O(n) 删除(删除索引2)
arr = append(arr[:2], arr[3:]...)
}JS 的
Array底层在 V8 中是动态数组(类似std::vector);Go 的切片也是动态数组,append超过容量时会自动扩容。