zoukankan      html  css  js  c++  java
  • 数据结构初学,算法与线性表

    一. 思维导图

    二. 重要概念的笔记

    1,算法

    1. 评价算法的优劣:时间复杂度(T(n)=O(f(n)),n为问题规模)和空间复杂度(占用的额外存储空间随问题规模的变化)
    2. 栈的时间复杂度计算:1.分特殊情况和一般情况 2.将n拆成模块计算

    2, 普通线性表

    1. 头插法与尾插法

      注:头插法建立的表格元素顺序与输入元素顺序相反(可用于链表的逆序)

      s->next=L->next;
      L->next=s;
      
      r->next=s;
      r=s;
      
    2. 对于双向链表的插入操作

      1.注意前驱与后驱的断开与连接

    3. 有序链表的归并(设有L1,L2,L3链表)

      1.建立L1与L2中指向当前节点的指针,对L1与L2中的元素进行比较,并进行指针移动,复制节点到L3.若L1或L2中谁先为空,将L3的next指向剩下的链表中的当前指针

    3,栈与队列

    1. 栈:后进先出,栈的插入与删除在栈顶,插入要判断是否栈满,删除要判断是否栈空

    2. 队列:先进先出,队列的插入在队尾,删除在队首,插入要判断是否队满,删除要判断是否队空

    3. 循环队列:队空:

      r->rear==r->front;
      

      ​ 队满:

      (r->rear+1)%r->maxsize==r->front;
      

    4,串

    1. 串的操作对象为串的整体

    2. 每个元素为一个字符

    3. 串的模式匹配:BF算法,KMP算法(next函数,nextval函数)

      1.对于next函数的计算:当j从1开始,next[1]=0,next[j]=k,k-1=length(最大的前缀串与后缀串相等长度),其他情况next[j]=1;当j从0开始,next[0]=-1,next[1]=0,next[j]=k,k=length(最大的前缀串与后缀串相等长度)

      2.对于nextval函数的计算:当j从1开始,nextval[1]=0;当j从0开始,nextval[j]=-1,

    5,数组与广义表

    1. 矩阵为Amn中位于i行j列元素的地址,行优先:首地址+(im+j)k(k为单个元素所占的存储空间)

      列优先:首地址+(jn+i)k(k为单个元素所占的存储空间)

    三,疑难问题及解决方案

    1. 疑难问题:对于next数组和nextval数组的编程与理解(解决方案:实例分析及画图)

      void get_next(string t, int len, int next[])
      {
          int i = 0, j = 0;//j用来控制前缀串,i用来控制后缀串
          next[0] = -1;
          while (i < len - 1) {//注意此时合法的最大下标为len-1
              if (j = -1 || t[i] == t[j]) {
                  i++;
                  j++;
                  next[i]=j;//对相等的最长的前缀串和后缀串长度+1
              }
              else
              {
                  j = next[j];//对j的回溯
              }
          }
      }
      
      j 0 1 2 3 4
      T[j] a c a c b
      Next[j] -1 0 0 1 2
      1. 设next[j]=k

      2. a[0]=-1.i=1,j=0,若i与j相等,i++,j++,next[i]=j,即k=k+1;反之将j重新回到next[j]。若j为-1,对i进行移动i=i+1,j回到合法位置,相当于将寻找的最长的与前缀串相等的后缀串的起始位置向后移,前缀串的起始位置回到0;若此时我们得到的当前前缀串与后缀串比较相等,i++,j++,next[i]=j,即k=k+1;反之将j重新回到next[j]

    void get_nextval(string t, int len, int next[])
    {
        int i = 0, j = 0;
        next[0] = -1;
        while (i < len - 1) {
            if (j = -1 || t[i] == t[j]) {
                i++;
                j++;
                if (t[i] != t[j]) {
                    nextval[i] = j;
                }
                else {
                    nextval[i] = nextval[j];//与next[j]求解中不同的部分
                }
    
            }
            else
            {
                j = nextval[j];
            }
        }
    }
    
    j 0 1 2 3
    T[j] a a a b
    Next[j] -1 0 1 2
    Nextval[j] -1 -1 -1 2
    1. nextval[j]=-1,假如我们的主串为s串:aaaaaab,下标用i表示,当比对到s[2]和t[2]时,i++,j++,当s[3]与t[3]相等时若将nextval[i]=nextval[j],且由于我们在主串与模式串匹配失配时,我们要将j回溯到nextval[j]与s[i]进行比较,则如例子若用next数组,需将s[3]与t[2]比较后,又与t[1]、t[0]比较,若直接将s[3]与t[0]比较,减少j回溯的次数.相当于标记模式串中相邻元素相等的关系
  • 相关阅读:
    mailto 调用邮件客户端乱码问题的解决办法
    MySQL开启慢查询
    Java 模拟 Http Post
    使用XSLT转换XML2XML
    上传File时,浏览器总是添加<pre>的解决办法
    转:简单SQL语句小结
    我的crm报告竣工了!
    vs2005快捷键
    转:C# 参考之转换关键字:operator、explicit与implicit
    正值表达式2
  • 原文地址:https://www.cnblogs.com/tylk/p/12579229.html
Copyright © 2011-2022 走看看