📜  数据结构概述 |第 1 组(线性数据结构)

📅  最后修改于: 2022-05-13 01:57:14.690000             🧑  作者: Mango

数据结构概述 |第 1 组(线性数据结构)

数据结构是在计算机中组织数据以便有效使用数据的一种特殊方式。这个想法是为了减少不同任务的空间和时间复杂性。下面是一些流行的线性数据结构的概述。

1.数组
2. 链表
3. 堆栈
4. 排队

大批

数组是一种数据结构,用于在连续位置存储同构元素。在存储数据之前必须提供数组的大小。
Let size of array be n.
Accessing Time: O(1) [This is possible because elements
                      are stored at contiguous locations]   
Search Time:   O(n) for Sequential Search: 
               O(log n) for Binary Search [If Array is sorted]
Insertion Time: O(n) [The worst case occurs when insertion 
                     happens at the Beginning of an array and 
                     requires shifting all of the elements]
Deletion Time: O(n) [The worst case occurs when deletion 
                     happens at the Beginning of an array and 
                     requires shifting all of the elements]


示例:例如,假设我们要存储一个班级中所有学生的分数,我们可以使用一个数组来存储它们。这有助于减少变量数量的使用,因为我们不需要为每个主题的标记创建单独的变量。只需遍历数组即可访问所有标记。

链表

链表是一种线性数据结构(如数组),其中每个元素都是一个单独的对象。列表的每个元素(即节点)由两项组成——数据和对下一个节点的引用。

链表类型:
1.单向链表:在这种类型的链表中,每个节点都存储列表中下一个节点的地址或引用,最后一个节点的下一个地址或引用为NULL。例如 1->2->3->4->NULL

2.双向链表:在这种类型的链表中,每个节点有两个引用,一个引用指向下一个节点,一个引用指向前一个节点。这种数据结构的优点是我们可以在两个方向上遍历,并且对于删除我们不需要显式访问前一个节点。例如。 NULL23->NULL

3.循环链表:循环链表是所有节点连接起来形成一个圆圈的链表。最后没有NULL。循环链表可以是单循环链表或双循环链表。这种数据结构的优点是任何节点都可以作为起始节点。这对于在链表中实现循环队列很有用。例如。 1->2->3->1 [最后一个节点的next指针指向第一个]

Accessing time of an element : O(n)
Search time of an element : O(n)
Insertion of an Element : O(1) [If we are at the position 
                                where we have to insert 
                                an element] 
Deletion of an Element : O(1) [If we know address of node
                               previous the node to be 
                               deleted] 

示例:考虑前面的示例,其中我们制作了一系列学生的分数。现在,如果在课程中添加了一个新主题,它的分数也将添加到分数数组中。但是数组的大小是固定的,它已经满了,所以它不能添加任何新元素。如果我们创建的数组的大小远大于主题的数量,则该数组的大部分可能会保持为空。我们减少了空间浪费,链表的形成只有在引入新元素时才添加节点。使用链表,插入和删除也变得更加容易。
链表的一大缺点是不允许随机访问。使用数组,我们可以在 O(1) 时间内访问第 i 个元素。在链表中,需要 Θ(i) 时间。


堆栈或 LIFO(后进先出)是一种抽象数据类型,用作元素的集合,具有两个主要操作:推送,将元素添加到集合中,弹出,删除添加的最后一个元素.在堆栈中,push 和 pop 的操作都发生在堆栈顶部的同一端。它可以通过使用数组和链表来实现。
Insertion : O(1)
Deletion :  O(1)
Access Time : O(n) [Worst Case]
Insertion and Deletion are allowed on one end. 

示例:堆栈用于维护函数调用(最后调用的函数必须先执行完),我们总是可以借助堆栈来消除递归。堆栈还用于我们必须反转单词、检查括号是否平衡的情况以及在使用撤消操作时最后输入的单词是第一个被删除的编辑器中。同样,在 Web 浏览器中实现返回功能。

队列

队列或FIFO(先进先出)是一种抽象数据类型,充当元素的集合,主要有两个操作:入队,向集合中添加元素的过程。(元素从后面添加) 和出队,删除添加的第一个元素的过程。 (元件从正面移除)。它可以通过使用数组和链表来实现。
Insertion : O(1)
Deletion  : O(1)
Access Time : O(n) [Worst Case]

示例:队列顾名思义就是根据公交车站或火车的队列构建的数据结构,其中站在队列前面(站立时间最长)的人是第一个拿到票的人。因此,资源在多个用户之间共享并以先到先得的服务器为基础提供服务的任何情况。示例包括 CPU 调度、磁盘调度。队列的另一个应用是在两个进程之间异步传输数据(数据不一定以与发送相同的速率接收)。示例包括 IO 缓冲区、管道、文件 IO 等。

循环队列这种数据结构的优点是减少了数组实现时的空间浪费,因为第(n+1)个元素的插入是在第0个索引处为空。

数据结构概述 |设置 2(二叉树、BST、堆和哈希)