数据结构,算法及线性表总结

て烟熏妆下的殇ゞ 提交于 2020-03-28 20:44:20

1.思维导图

2.重要概念笔记

1.数据结构

1.数据结构定义
-我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对元素进行排序等)而执行的相应操作,这个相应的操作也叫算法。
2.算法
-衡量算法的标准:
-时间复杂度:程序大概要执行的次数,而非执行的时间
-空间复杂度:程序执行过程中大概所占用的最大内存空间
-难易程度:用易懂,避免过于复杂
-健壮性
3.连续存储【数组】
-什么叫数组:元素类型相同,大小相等
-数组的优缺点
--优点:存取速度很快
--缺点:插入删除元素很慢
4.离散结构【链表】
-定义:n个节点离散分配,彼此通过指针相连,每个节点只有一个前驱节点同时每个节点只有一个后续节点,首节点没有前驱节点,尾节点没有后续节点
-专业术语
--首节点:存放第一个有效数据的节点
--尾节点:存放最后一个有效数据的节点
--头结点:位于首节点之前的一个节点,头结点并不存放有效的数据,加头结点的目的主要是为了方便对链表的操作
--头指针:指向头结点的指针变量
--尾指针:指向尾节点的指针变量
-确定一个链表需要几个参数:只需要一个头指针参数,因为我们通过头指针可以推算出链表的其他所有信息
-分类:
--单链表:每一个节点只有一个指针域
--双链表:每一个节点有两个指针域
--循环链表:能通过任何一个节点找到其他所有的节点
--非循环链表:不能通过任何一个节点找到其他所有的节点
-优缺点
--优点:空间没有限制,插入和删除元素很快
--缺点:存取速度很慢

2. 线性结构

1.栈
-分类:静态栈;动态栈。
-算法:压栈;出栈。
-应用:函数调用;中断;表达式求值;内存分配;缓冲处理;迷宫
2.队列
-分类
--链式队列——用链表实现
--静态队列——用数组实现
-队列的具体应用:
--所有和时间有关的操作都与队列有关
3.串
-串的表示和实现:
--定长顺序存储表示。静态存储分配的顺序表
--堆分配存储表示。存储空间是在程序执行过程中动态分配而得。所以也称为动态存储分配的顺序表
--串的链式存储结构
-串的模式匹配算法
-BF算法:
--核心思想:有两个字符串S和T,长度分别为N和M。首先S[1]和T[1]比较,若相等,则再比较S[2]和T[2],一直到T[M]为止;若S[1]和T[1]不等,则T向右移动一个字符位置,与S[2]进行比较,而后再依次进行比较
--该算法最坏情况下要进行M(N-M+1)次比较,时间复杂度为O(MN),效率低下
---(注:在这里S为主串,T为子串,这种子串的定位操作通常称作串的模式匹配)
  存在回溯,需要重头来过,效率低下。
-KMP算法:
--kmp算法理解的精要在于要判断它前缀和后缀是否有相同的片段,如果有相等的片段那么则在相等的片段下一个字符开始比较,要是没有,就重新从模式串的第一个字符开始比较,并且前两个next[j]的值都为0和1
--给模式匹配串添加个k数组(即next数组)
--k数组元素:k[1]=0,k[2]=1,然后从不匹配元素位置开始往前查看,探讨其前缀与后缀相同元素个数,k[i]即相同元素个数+1
--KMP算法的优点:不需回溯。这对于从外设读入的庞大文件很有效,可以边读入边匹配,无须回头重读。
---(解读next数组:当模式匹配串T失配的时候,next数组对应的元素指导应该用T串的哪个元素进行下一轮的匹配)
---(注:模式匹配串和目标串的下标都是从1开始,0下标存储串的长度)

3.非线性结构

1.数组
-数组的顺序存储:行优先顺序;列优先顺序
注:数组中的任一元素可以在相同的时间内存取,即顺序存储的数组是一个随机存取结构
2.广义表
-结论:
--广义表的元素可以是子表,而子表的元素还可以是子表。由此,广义表是一个多层次的结构,可以用图形象地表示
--广义表可为其它表所共享。例如在上述例4中,广义表A,B,C为D的子表,则在D中可以不必列出子表的值,而是通过子表的名称来引用
--广义表的递归性

4.疑难问题及解决方案

1.
Q:使用栈将上述递归程序转换乘非递归程序
对于如下代码

void test(int &sum)
{
    int x;
    cin >> x;
    if (x == 0)
        sum = 0;
    else
    {
        test(sum);
        sum += x;
    }
    cout << sum;
}

A:

void test(int& sum) {
    int x;
    stack<int>s1;
    do {
        cin >> x;
        s1.push(x);
    } while (x);
    while (!s1.empty()) {
        sum += s1.top();
        s1.pop();
    }
}

2.
Q:PTA7-7银行业务对列简单模拟
A:要考虑A窗户口出1个客人之后就没客人了,得马上轮到B窗口出客人
正确代码展示:

#include<iostream>
#include<queue>
#define Maxsize 1000
using namespace std;
int main() {
    queue<int>q1;
    queue<int>q2;
    int num[Maxsize];
    int n, i;
    cin >> n;
    for (i = 0; i < n; i++) {
        cin >> num[i];
    }
    for (i = 0; i < n; i++) {
        if (num[i] % 2 == 1) {
            q1.push(num[i]);
        }
        else {
            q2.push(num[i]);
        }
    }
    i = 0;
    while (!q1.empty() && !q2.empty()) {
        if (i++)cout << " ";
        cout << q1.front();
        q1.pop();
        if (q1.empty())break;
        cout << " ";
        cout << q1.front();
        q1.pop();
        cout << " ";
        cout << q2.front();
        q2.pop();
    }
    while (!q1.empty()) {
        if (i++)cout << " ";
        cout << q1.front();
        q1.pop();
    }
    while (!q2.empty()) {
        if (i++)cout << " ";
        cout << q2.front();
        q2.pop();
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!