什么是数据结构?

221 阅读5分钟

学习算法的敲门砖就是数据结构,你只有学会了数据结构,才能看懂算法题目的答案,你不懂数据结构,算法就无从谈起。
那么什么是数据结构呢? 引用自百度百科的解释[:](数据结构(计算机存储、组织数据方式)_百度百科 (baidu.com)) 点开自行阅读。
数据结构是计算机存储、组织数据的方式;通常情况下,数据结构可以带来更高的运行或者存储效率。数据结构的优良将直接影响着我们程序的性能;常用的数据结构有: 集合、线性结构、树形结构、图形结构等;
本文主要是对相关概念普及,详细的数据结构原理在后续文章中进行讲解\color{#CC0000}{本文主要是对相关概念普及,详细的数据结构原理在后续文章中进行讲解}
图形示意:

线性结构: 线性表、数组、链表、栈、队列、哈希表

image.png

线性表

具有多个相同类型的有限序列。 一般情况下,线性表都有索引。通过索引可以查找到对应的值。

image.png

数组(Array)

数组是一种顺序存储的线性表。在内存中的地址是连续的。 数组会为存储的元素都分配一个下标(索引),此下标是一个自增连续的,访问数组中的元素通过下标进行访问;数组下标从0开始访问;
图解:

image.png

特点:类型容量固定,不可以动态扩容,查询快,删除或者增加慢。因为内存地址为递增连续的,所以要调整所有元素的内存地址。

动态数组(Dynamic Array)

动态数组在Java中的典型代表就是 java.util.ArrayList 类.他来补充了Array的先天缺陷,大家感兴趣可以查看源码,很清晰。可以实现动态扩容及泛型的操作。但是他也存在着致命问题就是过量申请内存,存在着内存空间的浪费

image.png

链表(Linked List)

链表是一种链式存储的线性表,内存地址不一定连续。解决了动态数组内存浪费的问题,做到了用多少内存就申请多少内存问题。
链表由一个个节点组成,每个节点包含两个部分:一个是存储元素的数据域,另一个是指向下一个节点的指针。相邻节点之间通过指针连接起来,形成链式结构。链表有单向链表和双向链表两种形式,前者只有一个指针指向下一个节点,后者有两个指针,一个指向前一个节点,一个指向后一个节点。

image.png

特点:链表内存管理完善,且删除或者新增非常高效,但是随机访问其中的一个节点需要遍历整个链表效率较低。
常见问题:链表删除节点问题、反转链表问题、环形链表问题 后续讲解。

栈(Stack)

栈是一种特殊的数据结构,它只能在表尾进行插入和删除操作,这个位置称为栈顶。栈的特别之处在于它的操作顺序是“后进先出”(Last In First Out,LIFO),也称为“先进后出”(First In Last Out,FILO)。栈的实现可以采用数组或链表等方式来存储元素。入栈操作把元素放置到栈顶,出栈操作则是从栈顶移除元素。

image.png

栈在编程中被广泛应用,例如函数调用时使用的函数栈,以及计算表达式的运算符栈等。栈的一个重要特性是,任何时刻只允许访问栈顶元素,这使得栈具有保护数据和控制程序的执行顺序等功能。

队列(Queue)

队列是一种特殊的数据结构,通常用于存储按照顺序排列的数据元素,它遵循“先进先出”(First-In-First-Out,FIFO)的原则,即首先加入队列的元素将会最早被访问。 队列由两个指针front和rear组成,分别指向队列的头部和尾部。在队列中添加元素操作称为入队,一般在队列尾部进行,使得rear指针指向队列的新元素。从队列中删除元素操作称为出队,一般从队列头部进行,即将front指针向队列尾部移动一个位置。

image.png

队列常常用于计算机程序的缓冲区和调度等方面。在计算机系统中实现队列时,可以采用数组、链表等不同的数据结构方式,同时也可以通过循环队列方式来提高队列的性能。循环队列问题后续详细讲解。

哈希表 (HashTable)

哈希表是一种常用的数据结构,用于以常数时间复杂度(O(1))完成查找、插入和删除等操作。哈希表中存储的元素被映射到一组桶(bucket)中,每个桶可以容纳多个元素。哈希表利用哈希函数将元素的关键字映射到桶的位置上。如果两个不同的元素的哈希值相同,则称为哈希冲突,此时需要采用解决冲突的方法来处理。
优点:通过关键值计算直接获取目标位置,对于海量数据中的精确查找有非常惊人的速度提升,理论上即使有无限的数据量,一个实现良好的哈希表依旧可以保持O(1)的查找速度,而O(n)的普通列表此时已经无法正常执行查找操作(实际上不可能,受到JVM可用内存限制,机器内存限制等)。
未完待续。。。\color{#FF0000}{未完待续。。。}


树形结构: 二叉树(AVL树、红黑树)B树、堆、Trie、哈夫曼树、并查集

image.png

图形结构: 邻接矩阵、邻接表

image.png