美文网首页
数据结构1--时间空间复杂度、线性表

数据结构1--时间空间复杂度、线性表

作者: 陪伴你的大数据 | 来源:发表于2020-06-08 09:28 被阅读0次

    时间效率高 存储低、

    算法效率因素
    1.算法
    2.编译产生的代码质量--高级语言转二进制
    3.输入规模
    4.机器速度

    2.衡量算法的几个维度

    时间复杂度和空间复杂度 与最高次项的n的阶数,不需要关心乘数和加数
    2.1时间复杂度:执行次数=监禁时间复杂度=时间复杂度O(n)

    攻略

    1.常熟1取代运行时间中所有常数
    2.只保留最高阶
    3.最高阶存在,不是1,去除这个项的常数,2n O(n)
    常数阶 for()
    平方阶for(for()) O(n^2)
    for(int i=0;i<n;i++)(for(j=i;j<n;j++))() O(n^2)
    对数阶2^x=n x =log(2)n O(logn)
    嵌套函数 O(n) *O(n)=O(n^2)

    常见时间复杂度
    常数 O(1)
    线性 O(n)
    平方O(n^2)
    对数O(logn) 3log(2)n+4
    nlogn阶O(nlong) 3nlog(2)n
    立方O(n^3)
    指数 O(2^n)
    平均运行时间
    最坏运行时间
    2.2空间复杂度:
    时间换空间,空间换时间
    S(n)=O(f)(n))

    一般算复杂度一般是时间复杂度

    3.线性表

    List:由0个或多个数据元素组成的有限序列
    特点:有序,1前驱1后继元素,普通元素有1前驱1后继,元素有限

    3.1线性表顺序存储结构--数组

    内存空间中,依次放入数据。
    根据下标就可以获取元素,获取元素的时间复杂度O(1)
    线性存储也是随机存储结构
    增删改的伪代码
    删除的最后的时间复杂度O(1),最坏的时间复杂度O(n)所有的线性表都移动

    线性表 增删 时间复杂度O(n)
    改查 时间复杂度O(1)

    线性表顺序存储结构结论:线性表适合元素个数固定,不要经常插入和删除元素,更多的操作是存取数据

    线性表顺序存储优缺点:

    优点:无需为元素之间逻辑关系增加存储空间;可以快速读取表中任意位置元素
    缺点:增删元素需要移动大量数据;难以确定线性表顺序存储结构的容量;容易造成存储空间碎片

    3.2链式存储结构

    链式存储结构需要存储元素的数据域,还需要一个紧接着的位置存储后继位置,即指针域
    两部分信息组成数据元素成为存储映像,称为结点。
    n个结点连接成一个链表,即为线性表的链式存储结构。此链表的每个节点只包含一个指针域,称为单链表。
    头指针:指向链表第一个节点的指针(可能是头结点,也可能是第一个数据节点),可以给链表冠名,链表必须有头指针。
    头节点:链表第一个节点,数据域不存储数据,但可以存放链表长度(可选),不是必备节点。
    最后一个节点,指针域为空

    3.2.1单链表的读取

    时间复杂度O(n),核心思想:工作指针右移。

    3.2.2单链表插入

    链表中i位置插入节点思路:
    创建节点指向链表头结点。j<1开始遍历链表;
    若遍历结束没有i,报错,
    若找到第i个节点p(i),创建一个新节点s,将数据e放入s->data(e),
    s->next =p->next
    p->next=s

    3.2.3单链表删除

    找到要删除的i节点,p(i-1)指针改为p(i)指针
    单链表的增删节点时间复杂度O(1)(不考虑遍历的情况)
    查找时间复杂度O(n)

    头插法 尾插法

    线性表总结

    数组:增删不多,元素节点固定。内存整块申请,查找快O(1),增删慢O(n)
    单链表:节点变化多,不固定长度。增删块O(1),查找慢O(n)

    单链表增删快,可能需要遍历,然后找到某个节点,所以要注意应用场景。

    4.静态链表

    用数组来代替链表


    image.png

    游标的屁股指向头,头部指向尾。
    游标的MAXSIZE-1指向,第一个有数据的下标
    游标的头指向,最后一个有数据的下标
    游标指向下一个有数据的节点。

    4.1静态链表插入

    需求:在A后边加上B元素
    首先找到游标的第一个,指向的是最后一个元素,
    然后再最后一个元素后插入新元素
    修改:找到A后,修改A的游标指向
    修改游标第一位为B的下标。

    4.2静态链表删除

    需求:刚插入的B后边删除C,C回收作为备用链表
    首先,C的游标给B,C的数据清空,C的游标赋值为第一个游标,第一个游标赋值为删除C的下标。

    优点:插入删除,只需要修改游标,改进了线性表顺序存储结构需要大量移动元素的缺点。
    缺点:没有解决长度难以确定的问题
    失去了顺序存储的索引优势。

    题目:快速找到未知长度单链表的中间长度

    普通题解:遍历一遍,长度L,在遍历一遍到2/L,O(L+1/2L)=O(3/2L)

    快慢指针:两个指针,快的指针是慢的指针移动两倍,开始两个指针都指向链表头部。
    O(1/2L)

    5.循环链表

    最后一个节点的指针指向头结点的索引。
    循环 空链表:头结点的指针指向自己

    6.约瑟夫问题

    5.1判断单链表是否有环

    1590978941(1).jpg

    思路1:快慢指针,如果两个指针到同一个节点步数不相同,则有环
    思路2:双指针,双遍历,如果到同一个节点

    7.双向链表

    双向链表比单向链表多了一个prior指针,一个数据域,两个指针域。

    节点b,的next指针域指向c节点data,节点b的prior指向a的data

    8.双向循环链表

    相关文章

      网友评论

          本文标题:数据结构1--时间空间复杂度、线性表

          本文链接:https://www.haomeiwen.com/subject/shrfzhtx.html