讲课手稿-1

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

算法 数据结构 问题 程序的关系

  问题由模型作为内核,用替换方式将抽象概念具体化,形成描述来包装内核
  模型由数据和解决方法构成,每个问题不同情况的表现组成成数据,通过统一的解决方法得到解决
  算法是解决问题的一般化方法
  数据结构是数据的组织形式
  程序是用计算机语言,在数据结构上操作算法,利用计算机解决问题

数据结构
  数据结构是独立于数据而存在,具有一定逻辑结构,支持在上面进行被允许的操作,如插入、删除、查找等

  主要有 单元节点、散列、线性表、树、图

单元节点/元素
  最基本元素,储存数据的直接单位

散列
  元素相互独立,没有直接关系的结构 集合
  唯一关系 元素在集合内

  操作 插入 删除 查找某元素
  集合的实现 数组 BST

  Hash表
    考虑集合的数组表示a[x]为x是否在集合中,这是一一对应的关系
    Hash表将x用特征值t来表示 对于不同的x可能对应同一个t(即冲突),根据t来查找x
    f(x) = t 的函数是hash函数, t为x的hash值
    因为可能存在冲突 有不同的处理方法 通常用链表来存储不同的x
    操作 插入 删除 查找
    先计算f(x) 在对应的链表中操作, 好的hash函数可以让链表尽可能短, 达到理想效果

    典型应用:记录庞大数字、字符串等,字典的实现

线性表
  线性表中,元素线性排列,相邻元素有前驱后继的关系

  操作 插入 删除 查找某元素 遍历 查找第k小
  线性表实现 数组 链表

  有序表
    元素顺序排列,可以用二分查找某个元素,可以直接获取第k小,插入删除困难,适用于排序之后的静态操作

  栈
    先进后出,用于人工模拟递归操作,表达式处理,递归过程中获取解答和模拟类题目

  队列
    先进先出,用于宽度优先搜索

  映射
    在线性表上加以集合构造 a[]是一个数组,已经具备某种逻辑关系A。
    b[i]表示b[]第i个元素在a中的位置,初始b[i]=i,通过对a[b[i]]的排序得到对应数组a’[]具有逻辑关系B,a[]中元素位置未改变过

  指针操作
    对于一个序列,在上面进行简单的指针移动,获得完全遍历求最优解

字符串
  匹配
    RK 将模式串用数字表示(hash),然后通过移动将当前匹配单位的hash值计算出来,相等的时候,逐个判断
   
    KMP P为模式串 S为正文,用R[p]表示最大的k 使得P[1..k] = P[m-k+1..m],这样如果在p+1处匹配失败,可以直接移动k个单位,匹配的过程实际为O(n+m)
        获得R[]的过程,对于R[p],k = R[p-1]+1 如果P[k]不等于P[p],k移动到R[k-1]上,继续匹配,否则R[p]=k,k右移

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

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

1 对0..65535范围内的数字进行O(N)复杂度的排序

  用t[i]表示等于i的元素有多少个 从0开始往后数即可

2 有一串数,找到两个的商最接近t的

  将数排序之后 用两个指针l, r 如果a[l]/a[r] < t, 那么a[l+1]/a[r]可能更接近t, 至少比a[l]/a[r+1]接近;
  反之亦然。最后l和r从1遍历到n之后,中途遇到的最优解即可

3 表达式处理

  表达式 = 表达式 符号 表达式。只有当表达式为优先级最高的时候,才能把它转化为数字,替换,这个就是典型递归过程,
  但是串的处理是顺序的,所以用栈操作,每次判断新压入栈的符号是否更高级,如果更高级 将前面的基础表达式计算。

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

Hash
  f_hash(x: dataType): int;
 
  find(x: dataType): node;
  {
    t = f_hash(x);
    s = hash[t];
    while (s.data <> x)
    {
      s = s.next;
      if (s = nil)
        return nil;
    }
    return s;
  }

  ins(x: dataType);
  {
    t = f_hash(x);
    s = hash[t];
    if (s = nil)
    {
      new(hash[t]);
      hash[t].data = x;
      hash[t].next = nil;
      return;
    }
    while (s.next <> nil)
      s = s.next;
    new(s.next);
    s = s.next;
    s.next = nil;
    s.data = x;
  }

  del(x: dataType);
  {
    if (find(x) = nil)
      return;
    t = f_hash(x);
    s = hash[t];
    if (s.data = x)
    {
      hash[t] = s.next;
      return;
    }
    p = s;
    s = s.next;
    while (s.data <> x)
    {
      p = s;
      s = s.next;
    }
    p.next = s.next;
    delete(s);
  }

RK
  RK(p:string, s:string): int;
  {
    pt = 0;
    m[0] = 1;
    for i <- 1 to p.len do
    {
      pt = (pt*26+p[i]) mod 29999;
      m[i] = m[i-1]*26;
    }
    st = 0;
    for i <- 1 to p.len do
    {
      st = (st*26+s[i]) mod 29999;
    }
    for i <- p.len+1 to s.len do
    {
      st = ((st - m[p.len]*s[i-p.len])*26+s[i]) mod 29999;
      if (st = pt)
      {
        check one by one;
        if ok
          return i;
      }
    }
    return -1;
  } 

KMP
  pre(p: string);
  {
    j = 1;    k = 0;    next[1] = 0;
    while (j < p.len)
    {
      if (k = 0 or p[j] = p[k])
      {
         j+1; k+1;
         if (p[j] <> p[k])
           next[j] = k
         else
           next[j] = next[k];
      }
      else
        k = next[k];
    }
  }

  KMP(p: string, s: string);
  {
    i = 1;  j = 1;
    while (j <= p.len and i <= s.len)
    {
      if (j = 0 or s[i] = p[j])
      {
        i+1; j+1;
      }
      else
        j = next[j];
    }
    if (j > t.len)
      return i;
    else
      return -1;
  }

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

Comments are closed.

© 2008 Vain.Thunder’s Blog[CN]
Magic Vision | Design: NET-TEC of Parkett. Coding: Kaminofen of Tischdekoration.