大话数据结构-时间复杂度,线性表,栈,队列

算法时间复杂度,空间复杂度计算log2n,常数阶,线性阶,对数阶(count*2),平方阶,指数阶
算法设计要求:正确性,可读性,高效率,低存储量,健壮性。事前估算方法,

线性表,前驱,后继,有限集合--顺序存储结构,链式存储结构
顺序存储结构,写入,读取时间复杂度O(1),但是插入(线性表是否已满,位置是否符合,在长度范围内),删除(线性表是否为空,位置是否符合,删除位置不是最后位置)是O(n)。
学会设计的思路:各种判断,合不合理,是不是在范围内,是否是后继插入等等,,if(L->length>MAXSIZE)   if(i<1 || i>L->length+1) if(i<=L->length)

头结点和头指针的区别,无论链表是否为空,头指针必须存在,且不为空,头结点则可有可无。

单链表在第i位置之前插入元素e,代码算法如下:
Status ListInsert(Linklist *L , int i,ElemType e)
{
    int j=1;
    LinkList p,s;
    p=*L;
    if(p && j<i){
       p=p->next;
       ++j;
    }
    if(!p || j>i){
       return ERROR;
    }
  s=(LinkList)malloc(sizeof(Node));
  s->data = e;
  s->next=p->next;
  p->next=s;
  retrun Ok;
}
删除操作要注意内存的释放 free(结点)
顺序存储优点在于查找和读取速度快,插入和删除性能差,而链表插入和删除性能良好,所以说顺序和链式的比较,要看具体功能要求需求
链式存储结构有---单链表,循环链表(头尾相连,两条表合并,要注意删除一个头结点,还有顺序问题,p=rearA->next;raerA->next=rearB->next->next;rearB->next=p;free(p);),双链表(引入前驱后继两个指针,prior和next ,s->prior=p;s->next=p->next;p->next->prior=s;p->next=s;这是用空间换取时间),以及不使用指针处理的链表结构,静态链表结构

栈和队列
栈(Stack)是限定仅在表尾进行插入和删除的线性表,属于后进先出型。顺序栈和数组性质形似,也是存储空间大小不能确定,解决方式就是两栈共享空间,及一个数组存储两个栈,一个从0开始,逐加,一个从n开始,逐减。栈满的标志就是top1+1=top2;栈空的标志就是top1=-1或者top2=MAXSIZE;缺点,无法确定长度,容易内存浪费,优点,存取定位方便。链式栈:缺点,都有指针域,内存开销增大,优点,长度不限制,灵活性好。

栈的应用--递归,栈的引入简化程序设计的问题,更加聚焦问题的核心。递归例子:斐波那契数列(Fib)兔子繁殖的例子。定义:一个直接调用自己程序或者通过一系列间接调用自己的函数方法。
int fib(int i){
  if(i<2){
    return i==0?0:1;
  }
  return fib(i-1)+fib(i-2);
}
int main(){
   int i;
   for(i=0;i<40;i++){
     System.out.println(fib(i));
   }
  return 0;
}


递归和迭代的区别:
递归是选择结构,能使程序简洁,清晰,但是大量递归调用会建立函数副本,耗费大量的时间和内存
迭代是循环结构,不需要反复调用函数和占用额外的内存。

栈的应用2--四则运算,一般看到的是中缀表达式,我们要改成机器识别的后缀表达式。
9+(3-2)x3+10%2--->9 3 1 - 3 * + 10 2 / +

队列(Queue):是允许一端进行插入,一端进行删除操作的线性表。是先进先出型FIFO,顺序结构的循环队列,头尾相接,这里用到模的运算%。。一般用于求余操作,比如,60个数分行打印,if(i%10==0){换行},循环队列用它来判断队列是否已满,(rear+1)%MAXSIZE==front  ,其队列为空判断是  Q.rear== Q.front
队列长度的求值表达式为(rear-front+MAXSIZE)%MAXSIZE;

顺序结构后移一位是+1,,链式结构后移一位是  ->next;
链队列虽然申请和释放结点存在一些时间开销,但是长度上比较灵活。
循环队列有存储元素个数和空间浪费问题。所以在可以确定空间最大长度值时用循环链表,若无法预估长度,建议用链队列方式。

总结栈和队列:
栈和队列都有线性表中顺序和链式的弊端,对于栈,如两个相同数据类型栈,可以用数组的两端放栈低,共享数据,最大化利用数组空间。队列则为了避免数组插入和删除时移动数据,引入循环队列,解决了移动数据的时间损耗,时间复杂度为O(1)。

学习了短路与和短路或的区别
短路与&&,第一个判断为FALSE,则返回FALSE(就是条件同时成立则行),短路或||,第一个判断为TRUE,则返回TRUE(条件有一条成立就行)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值