ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

数据结构初学,算法与线性表

2020-03-27 09:52:38  阅读:197  来源: 互联网

标签:后缀 线性表 nextval ++ next int 初学 数据结构 前缀


一. 思维导图

二. 重要概念的笔记

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回溯的次数.相当于标记模式串中相邻元素相等的关系

标签:后缀,线性表,nextval,++,next,int,初学,数据结构,前缀
来源: https://www.cnblogs.com/tylk/p/12579229.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有