数据结构(部分)

1、KMP字符串模式匹配算法
核心思想是:当前位置的字符失配时,模式字符串应该移动到哪个下标位置。这只与模式字符串有关。
(1)

int KmpSearch(char* s, char* p)  
{  
    int i = 0;  
    int j = 0;  
    int sLen = strlen(s);  
    int pLen = strlen(p);  
    while (i < sLen && j < pLen)  
    {  
        //①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++      
        if (j == -1 || s[i] == p[j])  
        {  
            i++;  
            j++;  
        }  
        else  
        {  
            //②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]      
            //next[j]即为j所对应的next值        
            j = next[j];  
        }  
    }  
    if (j == pLen)  
        return i - j;  
    else  
        return -1;  
}  

void Getnext(string needle,vector<int> &next){
        int j=0,k=-1;
        next[0]=-1;
        while(j<needle.size()-1){
            if(k==-1||needle[j]==needle[k]){
                j++;
                k++;
                next[j]=k;
            }
            else k=next[k];
        }
    }

(2)next数组求法:
先求出各个前缀后缀的最大公共元素长度:
在这里插入图片描述
将上面求得的数组向右移一位正好可以得到next数组,首位补位-1;
在这里插入图片描述

2、二叉树概念

平衡二叉树:一棵空树或左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是平衡二叉树。(注意:实际应用中很少有不是二叉搜索树的平衡二叉树,所以很多语境下平衡二叉树即指平衡二叉搜索树,但本文中不使用这样的简称)
完全二叉树:设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层从右向左连续缺若干结点。(完全二叉树是特殊的平衡二叉树)
满二叉树:深度为k,且有2的(k)次方-1个节点——每一层上的结点数都是最大结点数。(此为国内定义)(满二叉树是特殊的完全二叉树)
二叉搜索(查找 / 排序)树BST:左子树上的值都小于根结点的值,右子树上的值都大于根结点的值,且左右子树都是二叉排序树。
平衡二叉搜索树AVL:一棵空树或它的左右两个子树的高度差的绝对值不超过1,左子树上的值都小于根结点的值,右子树上的值都大于根结点的值,且左右两个子树都是一棵平衡二叉树。常用算法有红黑树、AVL、Treap、伸展树等。(注意:AVL可以表示算法也可以表述树,二者不是一件事)
哈夫曼树 相关概念:(1)节点的带权路径长度:从该节点到树根之间的路径长度与节点上权的乘积。(2)树的带权路径长度:树中所有叶子节点的带权路径长度之和。

3、图
顶点的度:无向图中为与该顶点关联的边的数目。有向图中为出度与入度之和。
连通性:无向图中,从任一顶点到另一顶点存在路径,则称任意两点是连通的,称该图为连通图。有向图中,从任一顶点到另一顶点存在路径,且反向也能到达该顶点,则称其为强连通。

求最短路径:
迪杰斯特拉算法(Dijkstra):Dijkstra算法按最短路径长度递增的次序求任意给定的某顶点(作为始点)到其它的n-1个顶点的最短路径。若需要求出全部顶点对间的最短路径,必须以每个顶点为源点应用Dijkstra算法n次。
算法步骤:
a. 初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。
b. 从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
c. 以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。
d. 重复步骤b和c直到所有顶点都包含在S中。
详细算法:https://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html

弗洛伊德算法(Floyd):是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为O(N2)。
核心代码:

for(k=1;k<=n;k++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(e[i][j]>e[i][k]+e[k][j])
                     e[i][j]=e[i][k]+e[k][j];

详细算法:
https://wiki.jikexueyuan.com/project/easy-learn-algorithm/floyd.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值