随笔三——数据结构

本文介绍了几种基本数据结构,包括顺序表的线性存储特性,链表的动态存储及不同实现方式,哈希表的高效查找与哈希冲突解决策略,以及二叉树的基本概念和遍历方法。这些数据结构在编程中有着广泛的应用,影响着数据的插入、删除、查找效率。
摘要由CSDN通过智能技术生成

数据结构

顺序表

顺序表是一种线性结构,用于存储具有相同数据类型的元素序列。在顺序表中,数据元素按照其逻辑顺序依次存放在一块连续的存储区域内。顺序表的元素访问速度较快,但插入和删除操作比较慢。

顺序表通常由两部分组成:
1.存储元素的数组;
2.记录顺序表长度和数组大小的变量。
数组中每个元素都占用固定大小的存储空间,可以通过下标访问每个元素。顺序表的下标从0开始,最后一个元素的下标为n-1,其中n为顺序表的长度。

顺序表的优点是元素的访问速度快,而且可以直接进行顺序存取。
另外,顺序表的空间利用率高,不会浪费多余的存储空间。顺序表的缺点是插入和删除操作比较慢,因为需要移动大量的元素。另外,顺序表的大小是固定的,不能动态调整,可能会造成存储空间的浪费或不足。

顺序表可以有两种实现方式:静态顺序表和动态顺序表。
静态顺序表在创建时就确定了存储空间的大小,不能动态调整;
动态顺序表则可以根据需要动态扩展和缩小存储空间。动态顺序表通常会预留一些空间,当元素个数达到数组大小时,会重新申请一块更大的内存,并将原来的元素复制到新的内存中。

顺序表的操作包括插入、删除、查找、遍历等。
插入操作可以在指定位置插入一个元素,需要将插入位置后面的元素依次后移;
删除操作可以删除指定位置的元素,需要将删除位置后面的元素依次前移;
查找操作可以查找指定元素在顺序表中的位置,可以使用顺序查找或二分查找等算法;
遍历操作可以依次访问顺序表中的每个元素,可以使用for循环或迭代器等方式实现。

链表

链表是一种常见的数据结构,用于存储具有相同数据类型的元素序列。
在链表中,每个元素由两个部分组成:
一个数据域,用于存储元素值;
一个指针域,用于指向下一个元素的位置。
链表中的元素不必按照逻辑顺序连续存储,它们可以在内存中的任意位置,通过指针进行连接。

链表通常由头结点和若干个数据结点组成。头结点不存储实际数据,只用于指向第一个数据结点,或者表示链表的长度和其他信息。数据结点包含数据和指针,其中指针指向下一个数据结点或者空节点。链表的最后一个节点通常是一个空节点,指针为空。

链表的优点是可以动态地分配和释放存储空间,不必预先定义存储空间的大小,因此具有灵活性和适应性。另外,链表的插入和删除操作比较快,只需要修改指针,不需要移动大量元素。
链表的缺点是访问任意一个节点的时间复杂度为O(n),因为需要从头结点开始遍历整个链表。链表的空间利用率也不高,因为需要额外的指针存储链接关系。

链表可以有多种实现方式,包括单向链表、双向链表、循环链表、带头结点的链表等。
单向链表只有一个指针,指向下一个节点;
双向链表有两个指针,一个指向前一个节点,一个指向后一个节点;
循环链表的最后一个节点指向第一个节点,形成一个环形结构;
带头结点的链表在头结点中存储链表的长度等信息,方便进行操作。

链表的操作包括插入、删除、查找、遍历等。
插入操作可以在任意位置插入一个元素,只需要修改指针即可;
删除操作可以删除任意位置的元素,只需要修改指针即可;
查找操作可以查找指定元素在链表中的位置,需要遍历整个链表;
遍历操作可以依次访问链表中的每个元素,可以使用while循环或迭代器等方式实现。

哈希表

哈希表是一种用于存储键值对的数据结构,也称为散列表。它通过将键映射到索引来快速访问数据,而不是通过比较和搜索来查找数据。
哈希表的实现包括两个关键部分:哈希函数和数组。
哈希函数将键映射到数组的一个索引上;
而数组存储键值对。哈希表的优点是查找、插入和删除操作的平均时间复杂度为O(1),效率高。

哈希函数是哈希表的核心,它将键映射到数组的一个索引上。哈希函数通常包括三个步骤:
将键转换为一个整数值(称为哈希码)、将哈希码压缩到数组的范围内、将压缩后的值作为数组的索引。
哈希函数需要满足以下条件:
1)对于相同的键,哈希函数应该始终返回相同的哈希码;
2)对于不同的键,哈希函数应该尽可能地将哈希码分布在整个数组范围内,以避免哈希冲突。

哈希冲突是指两个或多个不同的键映射到了相同的数组索引上。哈希冲突会影响哈希表的性能,因为它会导致查找、插入和删除操作的时间复杂度从O(1)变为O(n),其中n是哈希表中键值对的数量。
解决哈希冲突的方法有很多种,其中最常见的方法是链式哈希表和开放寻址哈希表。
链式哈希表在数组中存储链表或者其他数据结构,每个元素都指向一个包含相同哈希码的键值对列表。
开放寻址哈希表在数组中存储键值对,当哈希冲突发生时,它会使用另外的散列函数来找到下一个可用的数组位置。

哈希表的操作包括插入、删除、查找等。
插入操作首先需要通过哈希函数将键映射到一个数组索引上,如果该位置为空,则将键值对存储在该位置上;如果该位置已经被占用,则需要处理哈希冲突,将键值对插入到链表或其他数据结构中。
删除操作需要先通过哈希函数查找到要删除的键值对所在的位置,然后将该位置的值置为null或者其他标记。
查找操作也需要先通过哈希函数查找到键所在的位置,然后返回该位置的值。

二叉树

二叉树是一种树形结构,其中每个节点最多有两个子节点。二叉树可以为空,也可以非空。每个非空节点包含一个值和指向左右子树的指针。左子树和右子树也是二叉树,但它们的节点值必须满足一定的大小关系,例如左子树的所有节点的值都小于根节点的值,右子树的所有节点的值都大于根节点的值。

二叉树的常用术语包括:根节点、叶节点、子树、节点的度数、深度、高度、父节点和子节点等。
根节点是二叉树的最上层节点,没有父节点;
叶节点是没有子节点的节点;
子树是由某个节点及其所有子孙节点组成的二叉树;
节点的度数是其子节点的数量;
深度是从根节点到该节点的路径长度,根节点深度为0;
高度是从该节点到叶节点的最长路径长度,叶节点高度为0;
父节点是某个节点的直接上级,子节点是某个节点的直接下级。

二叉树的遍历有三种方式:前序遍历、中序遍历和后序遍历。
前序遍历的顺序是先访问根节点,然后递归地访问左子树和右子树;
中序遍历的顺序是先递归地访问左子树,然后访问根节点,最后递归地访问右子树;
后序遍历的顺序是先递归地访问左子树和右子树,最后访问根节点。

二叉树还有一些特殊的类型,例如满二叉树、完全二叉树、平衡二叉树等。
满二叉树是一种高度为h的二叉树,其中所有非叶节点都有两个子节点,且所有叶节点都在同一层;
完全二叉树是一种高度为h的二叉树,其中除了最后一层外,每层节点都是满的,最后一层的节点都尽量靠左排列;
平衡二叉树是一种左右子树高度差不超过1的二叉树,也称为AVL树,它可以保证各种操作的时间复杂度都是O(log n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值