数据结构

线性 #

列表(list)
    数组(array)
        # 相同数据类型元素的序列,下标(index)访问
        low high
        字符串
            二进制串(binary string)
                # 位串(bit string)
    链表(linked list)
        节点(node)
            指针(pointer)
        表头(header)
        单链表(singly linked list)
        双链表(doubly linked list)
    栈(stack)
        # 插入和删除只能在端部进行的列表,应用于递归
        栈顶(top)
        LIFO last-in-first-out
    队列(queue)
        队头(front)
        队尾(rear)
        入队(enqueue)
        FIFO first-in-first-out
        优先队列(priority queue)
            # 数据项多来自于全序域(常整数或实数)
            查找最大元素,删除最大元素,插入新元素
            堆(heap)实现

散列表 #

介绍
    有序输入时,树效率低,如果不要求查找有序结果,可以用散列
概念
    hash table
    hashing(散列)
    item(项)
    key(关键字)
        # 项中某部分
    hash function(散列函数)
        # 映射函数
    collsion(冲突)
        # 多个关键字散列到同项的状况
    load factor(装填因子)
        # λ 元素个数对表长度的比,
        # 如果散列是均匀的,表示了一个项中关键字的平均长度
        # 一次成功查找要遍历约1 + (λ / 2)个链,1表示被匹配的项
    rehashing(再散列)
        一半时进行
        直到插入失败再进行
        middle-of-the-road
            # 到达某load factor时进行
    caching the hash code(闪存散列代码)
算法
    separate chaining(分离链接法)
        # 解决冲突
    probing hash table(探测散列表)
        线性探测法
            primary clustering(聚集)
                # 线性探测法中形成数据区块
        平方探测法
            secondary clustering(二次聚集)
                # 模拟结果指出,对每次查找,会引起另外的少于一半的探测
        double hashing(双散列)
            # 模拟表明, 两个散列都mod质数时,探测次数几乎和随机冲突解决方法相同
    extendible hashing(可扩散列)
        D directory(目录)
            # 一个分区中bit的个数,所以M最多2^D
        性质
            # 基于位模式(bit patterm)是均匀分布的事实, 是"分支系数(branch factor)", N 是记录总数(随时间变化)
            树叶期望个数为(N/M)log(2)(e)
                所以平均树叶满的程度为ln2 = 0.69, 同B树
            目录期望大小为O(N^(1 + 1 / M) / M)
        叶子可以指向实际记录的链表(内存装不下太大目录时),这样得到实际数据就需要第二次磁盘访问

队列 #

介绍
    queue 先进先出
概念
    enqueue(入队)
    dequeue(出队)
    priority queue(优先队列)
        insert
        deleteMin
    binomial queue(二项队列)
        merge, insert, deleteMin 最坏时间为O(logN), 插入花费常数时间
        堆序树(二项树)的森林实现
        B0 = 2^0, B1 = 2^1, B2 = 2^2 ...
        Bn = B0 + B1 + ... B(n-1)

集合 #

概念
    set(集合),互不相同项的无序组合(可空)
    element(元素)
    dictionary(字典),能够查找,增加,删除元素的集合
        # 实现时要达到效率的平衡
    set union problem(集合合并问题)
        # 动态地把n个元素集合划分为一系列不相交的子集
    ADT abstract data type(抽象数据类型)
        # 由表示数据项的抽象对象集合和一系列对它的操作构成
实现
    universal set(通用集合)
        通用集合的子集,用长度为n(通用集合的长度)的位向量(bit vector)表示
            # 占用大量存储空间
    线性列表
        # 去除包含的重复元素
        # 列表是有序的,但这差别并不重要
        多重集(multiset)、包(bag)
            # 可重复项的无序组合

表示
    S = {2, 3, 5, 7}
    S = {n: n 为小于0的质数}

#

概念
    tree
    free tree(自由树),连通无回路的图
    full tree(满树),所有节点要么是树叶,要么是两个儿子
    forest(森林),无回路但不一定连通的图
    root
    rooted tree(有根树),确定根的树,常简称为树
    node
    ancestor(祖先),顶点本身也作为自己的祖先
        proper ancestor(真祖先),除了自己的祖先
    parent(父母)
    child(子女)
    sibling(兄弟)
    leaf(叶节点), 没有子女的顶点
    parental(父节点),至少有一个子女的顶点
    descendant(子孙),以v为祖先的所有节点,包含v
        proper descendant(真子孙),不包含本身
    subtree(子树) 

    depth(深度),从根到v简单路径的长度
        height depth 树中结点的最大级数
    rank(秩)
        # 子女数
    height(高度),从根到叶节点最长简单路径的长度
        # 按树的层的数量定义时,高度增加1
    degree(度,一个节点子树的数目) 
    level(root为1级, 结点为p级时,儿子在p+1级)

    state-space tree(状态空间树),可用于分析回溯和分支界限
    ordered tree(有序树),有根树的每个顶点,所有子女有序
        first child-next sibling representation(先子女后兄弟表示法)
            # 子女数不定,父节点只存第一个子女,该子女存兄弟链表
            ## 以一种高效方式将有序树改造成关联二叉树
            ## 关联二叉树中,左指针表示下层,右指针表示兄弟节点
    binary tree(二叉树),属于有序树
        left child(左子女)
        right child(右子女)
        左(右)子树
            # 二叉树可以递归定义,所有可以用递归算法
        binary search tree(二叉查找树),父母顶点比左子树中所有数字大,右子树中小
            效率,多取决于高度
                logn <= h <= n - 1
                    # h 为高度, n为顶点数
    multiway search tree(多路查找树)
        B树, B+树, B-树
边
    树向边
    回边
    前向边
        # 顶点到非子孙
    交叉边
        # 非前三都是交叉边
性质
    |E| = |V| - 1
        # 树的边数总比顶点数小1
        # 图变树的必要不充分条件,连通图变树的必要充分条件
    任意两个顶点间总存在简单路径,任选顶点可作根

二叉树 #

介绍
    binary tree
    常用顺序表或链表存储
概念
    full binary tree(满二叉树)
        # 满子节点,且子节点在同一层上
    heap(堆)
        # 根向下从大到小排序
    binary search tree(二分检索树)
        # 左子节点小于父节点小于右子节点
    left child(左子女)
    right child(右子女)
    左(右)子树
        # 二叉树可以递归定义,所有可以用递归算法

    complete binary tree(完全二叉树)
        # 只有最大层节点不满且连续集中在左边
        高是logN
        可以用数组实现(从index = 1开始存储)
            左儿子在2i, 右儿子在2i + 1, 父亲在i / 2
    perfect binary tree(理想二叉树)
        # 满节点二叉树
    full binary tree(满二叉树)
        # 同理想二叉树
    skewed tree(斜树)        
        # 一个节点不断左斜是左斜树,相反为右斜树
    binary search tree(二叉查找树)
        # 父母顶点比左子树中所有数字大,右子树中小
    AVL tree(Adelson-Velskii-Landis tree)
        # 带有平衡条件(balance condition)的二叉查找树
        平衡条件: 左右子树最多差1
            # 节点中存储高度信息
    splay tree(伸展树)
        # 分析树的一种

效率,多取决于高度
    logn <= h <= n - 1
        # h 为高度, n为顶点数
树转换二叉树

#

概念
    binary heap(二叉堆、堆)
        # 一棵完全二叉树
        结构性
        heap-order property(堆序性)
            heap-order tree(堆序树)
            已证明,平均一次插入需要2.607次比较,所以上移1.607层
    d-堆
        # 二叉堆是2-堆
        deleteMin为时间为O(dlog(d)(N))
        实践中
            插入次数比deleteMin次数多(可加速)
            主存不够时如B树使用
            4-堆胜过二叉堆
    leftist heap(左式堆)
        不是理想平衡(perfectly balanced)的,实际趋向于不平衡
        具有堆序性
        npl(X) null path length 零路径长
            # X到一个不具有两个儿子节点的最短路径。到本身npl(X) = 0。npl(null) = -1
        o(N)时间处理一个merge
        定义
            堆中每个节点,左儿子的npl >= 右儿子的npl
        操作
            merge
            insert
            deleteMin
        性质
            左儿子npl >= 右儿子npl
    skew heap(斜堆)
        有堆序性
        定义
            不维护npl
            每次合并都交换左右(只有左儿子的除外)
            其它同左式堆
        性质
            任意M次连续操作, 总的最坏情况运行时间为O(MlogN), 每次摊开销为O(logN)
        操作
            merge
            insert
            deleteMin
    binomial queue(二项树)
        B(k) 由B(0), B(1), ... B(k - 1)连接根组成
        有2^k个节点, k为高度
    pairing heap(配对堆)
    fibonacci heap(斐波那契堆)
算法
    heapsort(堆排序)
    merge(合并)

#

概念
    graph
    vertices(结点)
    edge(边)
        # 是结点对偶的集合
    endpoint(端点)
        # 边(u, v)的端点u, v
    incident(关联)
        # u, v和边(u, v)关联
    尾(tail)头(head)
        # 边(u, v)离开u进入v, u是尾, v是头
    loop(环)
        # 连接顶点自身的边,只考虑不含圈的图
    cycle(圈)
        # 长至少1的路径
    acycle(无圈的)
    DAG(无圈图)
    adjacent(邻接)
        # (i, j)则i, j邻接

    directed(图是有向的)
        # 对偶<i, j>与对偶<j, i>不同
    digraph(有向图)
    undirected(无向的)
        # 边表示为(i, j)

    network(网络)
        # 边上有成本的图
    weighted graph(加权图)
        # weighted digraph(加权有向图)相同
        weight(权重)
        cost(成本)

    度
        # 点的邻接点的数目
    出度
        # 有向图中,用该点作为第一个成分的边数目
    path(路)
        # 结点序列
        cycle(环、回路)
            # 首尾相同的简单路
        acyclicity(无环性)

        connected(连通的)
            # 每一对结点间存在一条路
        connectivity(连通性)
        connected component(连通分量)
            # 非连通图中包含的连通部分
        underlying graph(基础图)
            # 有向图去掉方向
        strongly connected(强连通的)
            # 有向图中, 一对结点都存在互相连通的路,则两点强连能
        weakly connected(弱连通的)
            # 有向图的基础图是连通的
        strongly connected graph(强连通图)
            # 所有结点对强连通
        strongly connected components(强连通分量)
            # 极大强连通子图
    length(路的长度)
        # 路的边数
    simple path(简单路)
        # 除首尾结点外,所有结点不同的路
    directed path(有向路经)

    complete(完全的)
        # 任意两个顶点之间都有边相连,表示为K|V|
    dense(稠密)
        # 缺少边较少
    connected(连通的)
    biconnected(双连通的)
        # 不存在割点(articulation point)
表示
    V = {a, b, c, d, e, f}, E = {(a, c), (a, d), (b, c), (b, f), (c, e), (d, e), (e, f)}
    |E|
        # 边的数量
    |V|
        # 顶点的数量
    adjacency matrix(邻接矩阵)
        # 图的顺序表示法
        无向图的邻接矩阵总是对称的
        稠密图,邻接矩阵占空间小
        weight matrix(权重矩阵)、cost matrix(成本矩阵)
    adjacency list(邻接表)
        # 图的链接表示法
        稀疏图,邻接表占空间小
公式
    0 <= |E| <= |V|(|V| - 1) / 2
        # 无圈无向图,可能包含边的数量
算法
    critical path analysis(关键路径分析法)
应用
    activity-node graph(动作节点图)
    event-node graph(事件节点图)
        slack time(松弛时间)
        critical path(关键路径)