您的位置:首页 > 理论基础 > 数据结构算法

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

2014-11-23 21:50 183 查看
算法时间复杂度,空间复杂度计算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(条件有一条成立就行)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: