数据结构
文章平均质量分 88
程序员丶Alex
这个作者很懒,什么都没留下…
展开
-
深入浅出C语言——排序
冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤(除了最后一个)即可完成排序。选择排序每一次从待排序的数据元素中选出最小和最大的一个元素,存放在序列的起始位置,在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重复上述步骤,直到集合剩余原创 2023-05-12 00:25:23 · 375 阅读 · 0 评论 -
深入浅出C++ ——哈希
在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,unordered系列的关联式容器的底层结构采用哈希结构。map/set的遍历是有序的,而unordered系列容器遍历是无序的。map/set是双向迭代器,而unordered系列容器只支持单向迭代器。但是当对大量数据进行增删改查时,unordered系列容器的效率更高,尤其是查找的效率。原创 2023-02-23 17:08:15 · 645 阅读 · 0 评论 -
深入浅出C++ ——红黑树模拟实现STL中的set与map
但是在插入的过程中,比较大小时,不能用data来比较,因为对于map而言,data是pair,要用pair中的first来比较,可以使用。如果该节点的右子树为空,就找祖先里面孩子不是祖先的右的那个。如果该节点的右子树为空,就找祖先里面孩子不是祖先的左的那个。如果要生成map,就传(key,pair),由第二个参数来控制生成容器的结构。红黑树作为set和map的底层容器,既要实现插入key又要实现插入pair,所以做了稍许的改动,使其成为一颗。红黑树的begin迭代器是整棵树的最左侧节点,end迭代器是空。原创 2023-02-23 11:28:03 · 590 阅读 · 0 评论 -
深入浅出C++ ——手撕红黑树
/节点的值域 Colour _col;//节点的颜色 RBTreeNode < K , V > * _left;//节点的左孩子 RBTreeNode < K , V > * _right;//节点的右孩子 RBTreeNode < K , V > * _parent;//节点的双亲 };原创 2023-02-22 19:21:54 · 514 阅读 · 0 评论 -
深入浅出C++ ——手撕AVL树
在前面的文章中介绍了map / multimap / set / multiset 容器,这几个容器的底层都是按照二叉搜索树来实现的。但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N)。因此 map、set 等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。原创 2023-02-22 17:15:36 · 801 阅读 · 0 评论 -
深入浅出C++ ——二叉搜索树
在第一节的例子中,删除1、4、7、13、14、10节点属于前两种情况,删除3、8、10、6节点属于第三种情况。对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即。K模型的搜索二叉树不支持修改,增删查的时间复杂度为O(h),h是树的高度,最坏的情况是h为N。找到左子树的最右节点或者右子树的最左节点,替换该节点赋值给删除节点,直接删除替换节点,,不论按照什么次序插入关键码,性能都能达到最优。插入和删除操作都必须先查找,查。,再归类到前两种情况。原创 2023-02-22 15:55:45 · 385 阅读 · 0 评论 -
深入浅出C++ ——容器适配器
deque中文为双端队列,是一种双开口的"连续"空间可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与 vector 比较,头插效率高,不需要搬移元素;与 list 比较,空间利用率比较高。原创 2023-02-21 21:01:53 · 1216 阅读 · 0 评论 -
深入浅出C++ ——priority_queue类深度剖析
优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。empty() 检测容器是否为空size():返回容器中有效元素个数front():返回容器中第一个元素的引用。原创 2023-02-21 18:11:49 · 1073 阅读 · 0 评论 -
深入浅出C++ ——queue类深度剖析
队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素另一端提取元素。队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。底层容器可以是标准容器类模板之一也可以是其他专门设计的容器类。该底层容器应至少支持以下操作。原创 2023-02-14 23:54:25 · 763 阅读 · 0 评论 -
深入浅出C++ ——stack深度剖析
stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与删除操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作。原创 2022-09-01 16:57:51 · 440 阅读 · 12 评论 -
深入浅出C++ ——list深度剖析
list是可以在常数范围**(o(1))内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代**。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于是单链表,只能朝前迭代,已让其更简单高效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。原创 2022-08-31 18:58:19 · 1108 阅读 · 6 评论 -
深入浅出C++ ——vector深度剖析
vector是表示可变大小数组的序列容器可以动态增长的数组。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。原创 2022-08-31 17:29:20 · 660 阅读 · 3 评论 -
深入浅出C++ ——string类深度剖析
不懂STL,不要说你会C++”。STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。本章开始将带来一系列STL的学习。⭐STL是C++标准库的重要组成部分(标准库的子集),不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架,把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。。STL的主流版本有:原始版本、P. J. 版本、RW版本、SGI版本(STL源码学习,主要参考是这个版本)。........原创 2022-08-31 15:28:07 · 455 阅读 · 3 评论 -
深入浅出C语言——C语言实现顺序表
顺序表是一种在实际中广泛使用的数据结构原创 2022-08-31 16:41:24 · 193 阅读 · 9 评论 -
深入浅出C语言——C语言实现堆
满二叉树。原创 2022-09-02 21:27:54 · 224 阅读 · 9 评论 -
深入浅出C语言——C语言实现二叉树
二叉树的遍历时按照那个某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。二叉树的基本属性例如:节点的总数、叶子节点的个数、节点值的查找、二叉树的深度,这里都统一使用递归来处理。双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;叶节点或终端节点:度为0的节点称为叶节点;子孙:以某节点为根的子树中任一节点都称为该节点的子孙。节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推。原创 2022-11-02 19:51:30 · 1907 阅读 · 1 评论 -
深入浅出C语言——C语言实现栈和队列
栈的实现一般可以使用数组或者链表实现,相对而言。原创 2022-08-31 19:46:19 · 454 阅读 · 9 评论 -
深入浅出C语言——C语言实现链表
1.链式结构在逻辑上是连续的,但是在物理上不一定连续。3.从堆上申请的空间,是按照一定的策略来分配的,原创 2022-08-31 16:42:47 · 228 阅读 · 6 评论 -
深入浅出C语言——数据结构概念
数据结构(英语:data structure)是计算机中存储、组织数据的方式。数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素集合。它包含三方面的内容,逻辑关系、存储关系及操作。随着应用程序变得越来越复杂和数据越来越丰富,几百万、几十亿甚至几百亿的数据就会出现,而对这么大对数据进行搜索、插入或者排序等的操作就越来越慢,数据结构就是用来解决这些问题的。......原创 2022-08-31 15:45:54 · 1743 阅读 · 11 评论