数据结构与算法-线性结构:串、数组和广义表

4.0内容总览

对于整体知识架构比较重要的概念:
数据结构与算法-线性结构:串、数组和广义表_第1张图片
的元素只能是字符;
数组中的元素是线性表;
广义表中的元素又是广义表。
严格来说,数组广义表不是线性结构,他们是线性结构的推广。

4.1串

4.1.1串的基本概念

数据结构与算法-线性结构:串、数组和广义表_第2张图片
数据结构与算法-线性结构:串、数组和广义表_第3张图片

数据结构与算法-线性结构:串、数组和广义表_第4张图片
数据结构与算法-线性结构:串、数组和广义表_第5张图片

4.1.2串的实际应用

在这里插入图片描述

4.1.3串的类型定义、存储结构及运算

数据结构与算法-线性结构:串、数组和广义表_第6张图片

4.1.3.1串的顺序存储结构

由于串很少进行插入和删除操作,所以顺序存储结构更常用
数据结构与算法-线性结构:串、数组和广义表_第7张图片

4.1.3.2串的链式存储结构

数据结构与算法-线性结构:串、数组和广义表_第8张图片
数据结构与算法-线性结构:串、数组和广义表_第9张图片
注:的英文单词为chunk.

4.1.3.3串的模式匹配算法——BF

由于串的算法在高级语言中都学过,下面主要讲解串的模式匹配算法.
数据结构与算法-线性结构:串、数组和广义表_第10张图片
模式(子串)匹配BF算法
数据结构与算法-线性结构:串、数组和广义表_第11张图片
举例说明
数据结构与算法-线性结构:串、数组和广义表_第12张图片
注意:串结构中的数组的[0]位置并没有存储元素,而是从[1]位置开始存储的,所以这里的i和j都是从1开始。
回溯匹配失败后,i=i-j+2,可以分为两步理解,首先是i-j-1让i退回到刚才起点的位置,然后+1,是到刚才起点的下一个位置。
数据结构与算法-线性结构:串、数组和广义表_第13张图片
数据结构与算法-线性结构:串、数组和广义表_第14张图片
算法思想总结

数据结构与算法-线性结构:串、数组和广义表_第15张图片
算法描述
数据结构与算法-线性结构:串、数组和广义表_第16张图片

串结构中的数组的[0]位置并没有存储元素,而是从[1]位置开始存储的,所以这里的i和j都是从1开始。
数据结构与算法-线性结构:串、数组和广义表_第17张图片
如果需要从任意位置pos开始查找
数据结构与算法-线性结构:串、数组和广义表_第18张图片
疑问倒数第二行代码if语句中是否不用加=号?
解答:书上代码没有加=号,按理说不需要加。

时间复杂度分析
最好时m,最坏是n*m,分析如下:
数据结构与算法-线性结构:串、数组和广义表_第19张图片

4.1.3.3串的模式匹配算法——KMP

数据结构与算法-线性结构:串、数组和广义表_第20张图片
数据结构与算法-线性结构:串、数组和广义表_第21张图片
数据结构与算法-线性结构:串、数组和广义表_第22张图片
举例说明next[j]的情况
数据结构与算法-线性结构:串、数组和广义表_第23张图片
KMP算法描述
数据结构与算法-线性结构:串、数组和广义表_第24张图片
其中,T代表模式串S代表主串
数据结构与算法-线性结构:串、数组和广义表_第25张图片

上面没看懂 老师说的是:该算法比较难理解,能看懂,会用就行。
可以看一下B站视频讲解再进行理解。

4.2数组

4.2.1数组的基本概念

数据结构与算法-线性结构:串、数组和广义表_第26张图片
数据结构与算法-线性结构:串、数组和广义表_第27张图片
数据结构与算法-线性结构:串、数组和广义表_第28张图片

数据结构与算法-线性结构:串、数组和广义表_第29张图片

4.2.2 数组的顺序存储结构

数据结构与算法-线性结构:串、数组和广义表_第30张图片
一维数组的存储方式和地址
数据结构与算法-线性结构:串、数组和广义表_第31张图片
二维数组的存储方式和地址
数据结构与算法-线性结构:串、数组和广义表_第32张图片
数据结构与算法-线性结构:串、数组和广义表_第33张图片
数据结构与算法-线性结构:串、数组和广义表_第34张图片
数据结构与算法-线性结构:串、数组和广义表_第35张图片
数据结构与算法-线性结构:串、数组和广义表_第36张图片
数据结构与算法-线性结构:串、数组和广义表_第37张图片
例题
数据结构与算法-线性结构:串、数组和广义表_第38张图片

4.2.3特殊矩阵的压缩存储

数据结构与算法-线性结构:串、数组和广义表_第39张图片
数据结构与算法-线性结构:串、数组和广义表_第40张图片
数据结构与算法-线性结构:串、数组和广义表_第41张图片
数据结构与算法-线性结构:串、数组和广义表_第42张图片
数据结构与算法-线性结构:串、数组和广义表_第43张图片
数据结构与算法-线性结构:串、数组和广义表_第44张图片
数据结构与算法-线性结构:串、数组和广义表_第45张图片
4.稀疏矩阵
数据结构与算法-线性结构:串、数组和广义表_第46张图片

三元组法

数据结构与算法-线性结构:串、数组和广义表_第47张图片
三元组法的特点:
数据结构与算法-线性结构:串、数组和广义表_第48张图片
三元组法缺点,不能随机存取,首先在存的时候只能顺序存入,没有存前面的元素,就不会知道现在这个元素应该存在哪儿。其次,在取值的时候,只能从头到尾的搜索该值的信息。

补充:随机存取、顺序存取
1、随机存取就是直接存取,可以通过下标直接访问到元素的位置,与存储位置无关,时间复杂度永远为O(1),例如数组。存取第N个数据时,不需要访问前(N-1)个数据,直接就可以对第N个数据操作 (array)。
2、顺序存取,不能通过下标访问,在存取第N个数据时,必须先访问前(N-1)个数据 ,例如链表。

十字链表

数据结构与算法-线性结构:串、数组和广义表_第49张图片
数据结构与算法-线性结构:串、数组和广义表_第50张图片
数据结构与算法-线性结构:串、数组和广义表_第51张图片
老师并没有讲代码,之后自己学习

4.3广义表

4.3.1广义表的基本概念

数据结构与算法-线性结构:串、数组和广义表_第52张图片
原子:单一元素
数据结构与算法-线性结构:串、数组和广义表_第53张图片
数据结构与算法-线性结构:串、数组和广义表_第54张图片
数据结构与算法-线性结构:串、数组和广义表_第55张图片
数据结构与算法-线性结构:串、数组和广义表_第56张图片
数据结构与算法-线性结构:串、数组和广义表_第57张图片
数据结构与算法-线性结构:串、数组和广义表_第58张图片

广义表通常用链表来存储

4.4案例:病毒感染

数据结构与算法-线性结构:串、数组和广义表_第59张图片
数据结构与算法-线性结构:串、数组和广义表_第60张图片
数据结构与算法-线性结构:串、数组和广义表_第61张图片
程序实现:

// 线性结构_串_模式(子串)匹配问题_病毒感染.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include 
#include
using namespace std;


typedef struct {
    char ch[11];
    int length;
}SString;

void CreatS(SString& S) {
    int i = 1;
    while(1) {
        cin >> S.ch[i]; //输入字符时,一定要用空格隔开,不然就是字符串了。
        i++;
        if (cin.get() == '\n') break;
    }
    S.length = i-1;
}

void DoubleS(SString& S) {
    for (int i = 1; i <= S.length; i++) {
        S.ch[i + S.length] = S.ch[i];
    }
    S.length = S.length * 2;
}

SString GetSS(SString& T, int n) {
    SString T_temp;
    for (int i = 1; i <= T.length/2; i++) {
        T_temp.ch[i] = T.ch[n];
        n++;
    }
    T_temp.length = T.length / 2;
    return T_temp;
}

bool index_BF(SString S, SString& T) {
    DoubleS(T);
    for (int n = 0; n < T.length / 2; n++) {
        SString T_temp = GetSS(T, n);
        int i = 1; int j = 1;
        while (i <= S.length && j <= T_temp.length) {
            if (S.ch[i] == T.ch[j]) {
                i++; j++;
            }
            else {
                i = i - j + 2; j = 1;
            }
        }
        if (j >= T_temp.length) {
            return true;
            break;
        }
    }
    return false;
}

void Show(SString S) {
    for (int i = 1; i <= S.length; i++) {
        cout << S.ch[i] << "  ";
    }
    cout << endl;
}

int main()
{
    SString S, T;
    CreatS(S);    
    CreatS(T);
    cout << "输入结果:" << endl;
    Show(S);
    Show(T);
    
    cout <<"是否感染:"<< index_BF(S, T);

}

你可能感兴趣的:(数据结构与算法,数据结构,字符串)