
算法与数据结构
文章平均质量分 89
自我学习与总结
啵啵薯条
这个作者很懒,什么都没留下…
展开
-
数据结构———哈希表
在原始哈希表中,每个桶仅能存储一个键值对。链式地址(separate chaining)将单个元素转换为链表,将键值对作为链表节点,将所有发生冲突的键值对都存储在同一链表中。原创 2024-08-09 15:05:01 · 1627 阅读 · 0 评论 -
数据结构———栈
在基于链表的实现中,链表的扩容非常灵活,不存在上述数组扩容时效率降低的问题。不过,如果入栈元素本身就是节点对象,那么可以省去初始化步骤,从而提高效率。在基于数组的实现中,入栈和出栈操作都在预先分配好的连续内存中进行,具有很好的缓存本地性,因此效率较高。然而,如果入栈时超出数组容量,会触发扩容机制,导致该次入栈操作的时间复杂度变为 O(n)。如图 5-3 所示,入栈与出栈操作分别对应在数组尾部添加元素与删除元素,时间复杂度都为 O(1)。使用链表实现栈时,我们可以将链表的头节点视为栈顶,尾节点视为栈底。原创 2024-08-02 17:58:40 · 827 阅读 · 0 评论 -
数据结构———队列
队列是一种特殊的线性表,它只允许在一端进行插入操作,在另一端进行删除操作。插入的一端称为队尾(Rear),删除的一端称为队头(Front)。原创 2024-08-02 20:31:12 · 892 阅读 · 0 评论 -
数据结构———链表
内存空间是所有程序的公共资源,在一个复杂的系统运行环境下,空闲的内存空间可能散落在内存各处。我们知道,存储数组的内存空间必须是连续的,而当数组非常大时,内存可能无法提供如此大的连续空间。也就是说,访问链表的第 i个节点需要循环 i−1 轮,时间复杂度为 O(n)。是一种线性数据结构,其中的每个元素都是一个节点对象,各个节点通过“引用”相连接。建立链表分为两步,第一步是初始化各个节点对象,第二步是构建节点之间的引用关系。相比之下,在数组中插入元素的时间复杂度为 O(n) ,在大数据量下的效率较低。原创 2024-08-01 20:48:47 · 975 阅读 · 0 评论 -
数组(二)———数组的排序算法②
快速排序是一种非常高效的排序算法,采用了分治策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。原创 2024-07-30 21:18:04 · 717 阅读 · 0 评论 -
数组(三)
技术是一种在数组或序列上操作的高效算法,主要用于处理涉及连续子数组的问题,如求解最大或最小子数组的和、平均值、最长合法子串等问题。技术是一种常用的算法技巧,特别适用于处理有序数组或链表的问题,它能够有效地减少时间复杂度,将某些问题的解决时间从O(n^2)降低至O(n)。在数组中,双指针通常是指两个索引,它们可以指向数组的不同位置,并根据特定的策略移动。假设我们有一个有序数组nums和一个目标值target,我们的任务是找到数组中两个数,使它们的和等于target。示例:寻找两个数之和等于特定值。原创 2024-07-31 21:12:37 · 354 阅读 · 0 评论 -
数组(二)———数组的排序算法①
是一种简单的排序算法,其基本思想是重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素,这意味着数列已经排序完成。原创 2024-07-29 21:25:16 · 1303 阅读 · 0 评论 -
数组(一)
分为:无初始值、给定初始值。数组元素被存储在连续的内存空间中。给定数组内存地址(首元素内存地址)和某个元素的索引,我们可以使用图 所示的公式计算得到该元素的内存地址,从而直接访问该元素。数组元素在内存中是“紧挨着的”,它们之间没有空间再存放任何数据。如果想在数组中间插入一个元素,则需要将该元素之后的所有元素都向后移动一位,之后再把元素赋值给该索引。由于数组的长度可能是固定的,因此插入一个元素必定会导致数组尾部元素“丢失”。若想删除索引 i 处的元素,则需要把索引 i 之后的元素都向前移动一位。原创 2024-07-28 21:55:31 · 750 阅读 · 0 评论