数据结构学习笔记

数据结构是计算机科学的基础。

线性结构

按顺序存储的数据结构。

数组

固定大小的连续内存。

特点

  • 随机访问 O(1)
  • 插入删除 O(n)
  • 内存连续

实现

arr := [5]int{1, 2, 3, 4, 5}
slice := []int{1, 2, 3}

链表

节点通过指针连接。

单链表

type Node struct {
    Value int
    Next  *Node
}

双链表

type DNode struct {
    Value int
    Prev  *DNode
    Next  *DNode
}

后进先出(LIFO)。

type Stack struct {
    items []int
}

func (s *Stack) Push(item int) {
    s.items = append(s.items, item)
}

func (s *Stack) Pop() int {
    n := len(s.items)
    item := s.items[n-1]
    s.items = s.items[:n-1]
    return item
}

队列

先进先出(FIFO)。

普通队列

type Queue struct {
    items []int
}

优先队列

按优先级出队。

树形结构

层次化的数据结构。

二叉树

每个节点最多两个子节点。

type TreeNode struct {
    Value int
    Left  *TreeNode
    Right *TreeNode
}

遍历方式

  • 前序遍历:根-左-右
  • 中序遍历:左-根-右
  • 后序遍历:左-右-根
  • 层序遍历:按层从上到下

二叉搜索树

左子树 < 根 < 右子树。

平衡二叉树

AVL 树

严格平衡,高度差不超过 1。

红黑树

宽松平衡,查询性能稍差但插入删除更快。

B 树

用于数据库索引。

图结构

节点和边组成的网络。

表示方法

邻接矩阵

graph := [][]int{
    {0, 1, 0},
    {1, 0, 1},
    {0, 1, 0},
}

邻接表

graph := map[int][]int{
    0: {1},
    1: {0, 2},
    2: {1},
}

遍历算法

DFS 深度优先

func dfs(node int, visited map[int]bool, graph map[int][]int) {
    if visited[node] {
        return
    }
    visited[node] = true
    for _, neighbor := range graph[node] {
        dfs(neighbor, visited, graph)
    }
}

BFS 广度优先

func bfs(start int, graph map[int][]int) {
    queue := []int{start}
    visited := map[int]bool{start: true}
    
    for len(queue) > 0 {
        node := queue[0]
        queue = queue[1:]
        for _, neighbor := range graph[node] {
            if !visited[neighbor] {
                visited[neighbor] = true
                queue = append(queue, neighbor)
            }
        }
    }
}

哈希表

键值对存储,O(1) 查找。

实现原理

  • 哈希函数
  • 冲突解决(链地址法、开放寻址法)

使用场景

  • 缓存
  • 去重
  • 计数

总结

掌握数据结构是编程的基础,不同场景选择合适的数据结构。