数据结构冒险记
文章平均质量分 95
数据结构主要研究组织大量数据的方法,算法分析是对算法运行时间的评估。本专栏分为几个内容:
1. 对算法进行分析,分析其主要的问题。
2. 列举一些例子来逐步深入理解运行时间,深入的了解算法设计需要注意的问题。
3. 介绍表、栈和队列等数据结构。重点在这些数据结构的实现,以及他们的一些用途。等等..
江池俊
C/C++领域新星创作者,阿里云专家博主,2023新星计划C/C++赛道top1,目前正在学习C、C++、Java、数据库、Linux等,期待与大家一起探索C/C++语言的奇妙世界,共同成就编程之路!
展开
-
【八大排序】归并排序 | 计数排序 + 图文详解!!
归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。O(N*logN)O(N)稳定计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。数排序适用于整数且范围较小的情况。对于范围较大的整数或小数,需要更复杂的排序算法。O(MAX(N,范围)),由于算法只涉及到一次遍历输入数组和一次遍历计数数组,所以时间复杂度为O(MAX(N,范围))。O(范围),由于需要创建一个与范围大小相等的计数数组,所以空间复杂度为O(范围)。原创 2024-02-10 07:27:53 · 1704 阅读 · 53 评论 -
【八大排序】选择排序 | 堆排序 + 图文详解!!
堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。注意:建堆时,使用向下调整法要从倒数第一个非叶子节点(即最后一个叶子节点的父节点)开始。虽然上面已经讲解过堆排序,但在此我们最好还是继续回顾一下堆排序的算法思想。这里我们的代码可以稍作优化,在每次选数的时候一次性选出最大和最小的。原创 2024-02-05 16:23:14 · 1611 阅读 · 62 评论 -
【八大排序】冒泡排序 | 快速排序 + 图文详解!!
快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。原创 2024-02-03 18:51:33 · 2642 阅读 · 62 评论 -
【八大排序】直接插入排序 | 希尔排序 + 图文详解!!
希尔排序是对直接插入排序的优化。当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样进行直接插入排序就会很快。这样整体而言,可以达到优化的效果。希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在许多书中给出的希尔排序的时间复杂度都不固定:《数据结构(C语言版)》— 严蔚敏《数据结构-用面相对象方法与C++描述》— 殷人昆。原创 2024-02-01 18:18:48 · 1931 阅读 · 44 评论 -
深入理解二叉树:遍历、构建与性质探索的代码实现
学习二叉树结构,最简单的方式就是遍历。所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。原创 2024-01-31 11:33:34 · 1098 阅读 · 58 评论 -
二叉树堆的应用实例分析:堆排序 | TOP-K问题
在学习堆排序和TOP-K问题之前,大家需要先熟悉两个算法(即向上调整和向下调整算法),这两大算法可谓是它们的核心。话不多说,我们直接上手。原创 2024-01-25 13:02:36 · 1509 阅读 · 72 评论 -
二叉树 - 堆 | 数据结构中的小技巧大作用
堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组。需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。堆中某个节点的值总是不大于或不小于其父节点的值。堆总是一棵完全二叉树。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。原创 2024-01-21 14:14:46 · 2154 阅读 · 81 评论 -
二叉树:数据结构中的灵魂
实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,后面学到高阶数据结构如红黑树等会用到三叉链。通常的方法是链表中每个结点由三个域组成,此处我仅给大家简单介绍了一下二叉树的一些该概念和性质,后续树的详细知识点也将就此展开!的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。,左右指针分别用来给出该结点左孩子和右孩子所在的。原创 2023-12-17 13:44:13 · 2226 阅读 · 105 评论 -
带头双向循环链表:一种高效的数据结构
带头双向链表是一种链表数据结构,它具有以下特点:1. 带头:链表存在一个哨兵位节点,这个节点不存放任何的有效数据,只是为了方便功能实现。2. 双向:每个节点都有两个指针,分别指向它的前一个节点和后一个节点。3. 循环:最后一个节点的next指针不再指向NULL,而是指向哨兵位节点,而哨兵位节点的prev指针指向的最后一个节点。这种数据结构一般用于单独存储数据,实际中使用的链表数据结构都是带头双向循环链表。原创 2023-12-03 19:13:21 · 1720 阅读 · 83 评论 -
深入理解栈与队列:从基本概念到高级实现
栈(Stack):栈是一种特殊的线性表,只允许在表尾进行插入和删除操作。这一端的操作也被称为后进先出(LIFO)原则。栈的元素遵守后进先出的原则,即最后进入栈的元素会先被删除。队列(Queue):队列是一种特殊的线性表,只允许在表尾进行插入操作,在表头进行删除操作。这一操作也被称为先进先出(FIFO)原则。队列中的元素遵守先进先出的原则,即最先进入队列的元素会最先被删除。原创 2023-11-19 21:12:35 · 756 阅读 · 86 评论 -
手撕无头单链表
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。原创 2023-11-16 21:46:26 · 854 阅读 · 83 评论 -
深入解析顺序表:揭开数据结构的奥秘,掌握顺序表的精髓
依次存储数据元素的线性结构,使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。这里我们实现动态顺序表,所以刚开始时我们可以假设给定顺序表的大小为 4(即能存放4个元素),不够就扩容,顺序表中刚开始是没有元素的。我们只需要将顺序表中pos位置到最后的数据依次往后挪动(从后往前挪),然后将pos下标位置的数据改为要插入的数据,最后。这个比较简单,我们只需要遍历一遍顺序表,查找相应数据,若找到,就返回下标,若没找到,就返回-1。原创 2023-09-10 12:11:35 · 2883 阅读 · 158 评论 -
【数据结构】时间复杂度---OJ练习题
因为malloc数组基本没有时间消耗,但是初始化时需要循环N+1次,填数字的时候也循环了N+1次,最后遍历时最坏也要循环N+1次,总共3N+3次,根据大O的渐进表示法就知道时间复杂度O(N)。因为第一次求和使用公式所以基本不消耗时间,第二次求和进行了N次循环,总共N次,根据大O的渐进表示法就知道时间复杂度为O(N)。因为第一遍异或时需要循环N次,第二遍也需要N次,总共2N次,根据大O的渐进表示法就知道时间复杂度为O(N)。然后再跟0-N之间的数字异或一遍,最后x才是缺失的数字。的所有整数,但其中缺了一个。原创 2023-07-19 21:05:21 · 3527 阅读 · 122 评论 -
【数据结构】初识
数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。算法(Algorithm)就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出果。原创 2023-07-14 19:01:15 · 1591 阅读 · 118 评论