讲课手稿-2

文章来源: http://thunderfyc.wordpress.com.cn


  一个结点对多个结点的结构,具有清晰的偏序关系

  多叉树 好多孩子
  二叉树 最多俩孩子

  无根树 没有固定的根的树 形态不固定 边无向
  有根树 有固定根的树 节点之间有确定的父子关系

  互相转化
    多叉树->二叉树 左儿子 右兄弟
    无根树->有根树 确定根之后 遍历

  遍历
    前序 中序 后序 宽度优先

  BST
    左孩子比根小 根比右孩子小
    易退化 为深度很深的树
    解决办法
      打乱顺序 将输入的数据随机排列之后建树
      线段树   输入数据排序之后 把看作长度为0的线段插入 或者已知数据范围 进行操作
      Treap 随机一个rank 使rank满足堆的性质 元素满足BST性质
      红黑树 节点为红或黑 总有两孩子 红节点的孩子为黑 每条路径上黑节点个数相同
      AVL   用d表示左子树和右子树深度差 维持在-1 0 1之间

  并查集
    将一些元素归类 选出一个代表元素 指向这个代表元素
    典型树结构 但是用数组实现 只记录节点父亲

  堆
    根比儿子小的二叉树 用数组实现,dad*2 = leftson, dad*2+1 = rightson
    能够迅速获取最小或者最大

  Huffman树
    编码树 对于给定的文章 对字符重新编码 使得总长度最小
    到左儿子标记为0 到右儿子标记为1 访问次数越少的字符深度越大

================================================================================

1 在0..65535范围内的数 插入 删除 可询问小于某个数的个数
  BST或者线段树

2 不停的插入删除数 求第k小的数
  BST或者线段树 或者堆
  维护一个容量为K的堆大根堆 每次讯问的时候 返回堆顶;
  读入一个数 如果比堆顶小 就把堆顶弹出 插入新数
  如果比堆顶大 就无视

文章来源: http://thunderfyc.wordpress.com.cn

================================================================================

线段树
  BuildTree(l, r, t: int);
  {
    L[t] = l; R[t] = r; C[t] = 0;
    if (l == r)
      return;
    BuildTree(l, (l+r) div 2, t*2);
    BuildTree((l+r)div2 +1, r, t*2+1);
  }

  Ins(x, t: int);
  {
    if (L[t] = R[t])
    {
      C[t]+1;
      return;
    }
    if (x <= L[t*2])
      Insert(x, t*2);
    else
      Insert(x, t*2+1);
  }

  Del(x, t: int);
  {
    if (L[t] = R[t])
    {
      C[t]-1;
      return;
    }
    if (x <= L[t*2])
      Del(x, t*2);
    else
      Del(x, t*2+1);
  }

  Find(k, l, r, t: int): int;
  {
    if (r <= R[t*2])
      return Find(k, l, R[t*2], t*2);
    if (l >= L[t*2+1])
      return Find(k, L[t*2+1], r, t*2+1);
    if (k <= C[t*2])
      return Find(k, l, R[t*2], t*2);
    if (k > C[t*2])
      return Find(k-C[t*2], L[t*2+1], r, t*2+1);
  }

并查集
  Find(x: int): int;
  {
    if (sets[x] = x)
      return x;
    tmp = Find(sets[x]);
    return Find(sets[x]);
  }

  Union(x: int, y: int);
  {
    t = Find(x);
    s = Find(y);
    if (Rank[t] < Rank[s])
      sets[t] = s
    else
      sets[s] = t;
  }


  Del()
  {
    data[1] = data[n];
    n-1;
    dad = 1; son = 2;
    while (true)
    {
      if (son+1 <= n and data[son] > data[son+1])
        son+1;
      if (data[dad] > data[son])
        swp(data[dad], data[son]);
      dad = son;
      son = son*2;
      if (son > n)
        break;
    }
  }

  Ins(x: int)
  {
    n+1; data[n] = x;
    son = n; dad = n div 2;
    while (data[dad] <= data[son])
    {
      if (data[dad] > data[son])
        swp;
    }
  }

文章来源: http://thunderfyc.wordpress.com.cn

Comments are closed.

© 2008 Vain.Thunder’s Blog[CN]
Magic Vision | Design: NET-TEC of Nahrungsergänzung. Coding: Aloe Vera of Damenmode.