数据结构-第一阶段学习线性表的总结

前言

为了五月底的学位考,疯狂复习(学习)。都怪自己网课不认真听(有部分根本没听),少壮不努力,考试徒伤悲。文中涉及到的代码使用语言为JavaScript ,数据结构线性表的完成代码见 传送门
在这里插入图片描述

线性表

线性表包含顺序存储和链式存储两种存储方式,如下图:
在这里插入图片描述
区别如下图:
在这里插入图片描述
从时间复杂性来说:
1、当需要进行频繁的查找检索操作时,建议使用顺序表存储。因为顺序表可以使用下标很方便的进行查找,而链表需要循环遍历整个链表,直至找到目标。
2、当需要进行频繁的插入删除操作时,建议使用链表存储。因为链表插入删除操作只需要改变指针的指向即可,而顺序表插入删除时,目标位置后的其他元素都要进行移动

从空间复杂性来说:
1、当线性表的元素个数变化较大或不确定时,建议使用链表。
2、当线性表的元素个数明确时,建议使用顺序存储

总结:
此处关于数组扩容的说法基于C#,原文 传送门
而JS有其独特的机制见 传送门
联想到实现顺序表时,用到了Array,那为什么数组在声明时,既可以声明大小,又可以不声明呢,查阅大佬博客之后发现,如果不声明数组大小的话,Array的默认大小是4,那么当添加第5个元素时,数组就会自动扩容。Array的自动扩容分以下步骤:

1、分配一个新数组,长度是原来长度加1

2、将原数组的数据copy到新数组中。

3、将新数组地址赋值给旧数组的引用,生成一个新的数组。

这么看来,Array的自动扩容其实也不简单,数据量小的时候你可能感觉不到延时,当数组中存储了1个G的数据的时候,这个时候再扩容,那这个时间上的消耗就大了。所以这就要求我们在声明Array时尽量为其定义好大小。
总结之后看起来,顺序表和链表其实各有优缺点,那么有没有一个完美的存储方式,插入删除和查询都很快呢,那就是Hash表,想想还很激动呢,后面就要学到了(其实树和图我能不能搞懂我都不知道)。

栈和队列

栈和队列属于特殊的线性表,他们各自限制了插入和删除点。

如下图,栈是先入后出的,可以把栈想象成弹夹,装弹的时候把子弹一个一个从弹夹顶部压入,子弹击发的时候从弹夹的顶部击发,直到弹夹打完。
在这里插入图片描述
如下图,队列是先进先出的,我们可以把队列想象成早上去网红小吃店吃东西,由于人很多要排队,从店门口开始排,每当有人来就排在后面,不予许插队情况出现。而且也只能由队伍开头依次进店消费,然后前面的人消费完离开,后面的人依次轮流。
在这里插入图片描述
循环队列:
在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
在这里插入图片描述
循环队列是把普通队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。
队列为空是 front = rear = 0

// 队头的计算方式
 this.front= (this.front+ 1) % this.length

// 队尾的计算方式
 this.rear = (this.rear + 1) % this.length

// 入队操作
 enQueue(value: any) {
 		  // count指的是当前队列已入队数量,length为队列总长度
          if (this.count === this.length) {
              throw new Error('The queue is full!');
          }
          this.data[this.rear] = value;
          this.rear = (this.rear + 1) % this.length;
          this.count++;
        }
 // 出队操作
 deQueue() {
            if (this.count === 0) {
                throw new Error('The queue is empty!');
            }
            this.front = (this.front + 1) % this.length;
            this.count--;
        }

如下图,队列长度为8,队列已满,现在出队一个元素,front指向1。
如果是之前的普通队列,这时不允许做如入队操作,队列内的空间已经满了(因为即使0已经移除了,但是已经为他分配了空间)
但是按照循环队列的逻辑,入队操作
this.rear = (this.rear + 1) % this.length
也就是 rear = (7+1)%8 = 0
再做入队操作就是 this.data[0] = xxx;这时就不会再造成空间浪费
在这里插入图片描述
终于整理完了。
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章