
数据结构
文章平均质量分 94
各种数据结构的使用和代码实现
KissKernel
不秃就好
展开
-
数据结构<7> 图
图是一种非线性结构,前面说过的一种非线性结构就是树,树是由节点组成的具有跟单额分层结构,各个顶点之间是父子关系,一个顶点最多有一个父节点,但是可以有0个到任意多个子节点。图的节点与树不同,图的每个节点可以与任意个其他顶点相连。各个顶点之间的关系是任意的。由此我们也可看出图的表示范围是要比树大的,树是一种特殊的图。原创 2022-10-28 11:52:48 · 908 阅读 · 0 评论 -
数据结构<6> 并查集
但是在b集合合并到a集合的时候就会发现,此时2000个点的高度+1,因此将节点少的集合,合并到节点多的集合有利于降低查找的时间复杂度。这里因为我们初始化用的是i,所以,数组存储的额外信息,集合的个数就没有了。这里使用的并查集的写法初始情况是全都置为-1的。首先上面的问题我们可以使用朴素算法来接近,就是开一个和人数相同的数组,然后每个人对应一个位置,这个位置存放的数就是代表这个人属于那个集合。按秩合并,意思就是说,要合并两个集合的时候,将元素个数较小的那个结合合并到元素个数较大的那个集合当中去。原创 2022-10-23 21:43:23 · 557 阅读 · 0 评论 -
C++STL哈希表
哈希算法是如何不通过比较就能确定一个数据在不在呢?答案是:通过将数据插入的位置与关键字建立映射关系,这种映射关系就是后面要说到的哈希函数简单举个例子:现在有这样一个场景,给你了一个长度为N的字符串,需要你在O(N)的时间复杂度内找出所有只出现过一次的字符。这时候我们就可使用哈希算法中的直接定址法来解决。什么是直接定址法呢?就是我们创建一个长度为128的计数数组,然后用字符的ascii码值直接映射到数组的这个位置,对这个位置进行++。原创 2022-10-08 09:18:22 · 2158 阅读 · 0 评论 -
数据结构<5>二叉树和堆——原理+实现
前面所讲到的数据结构比如:顺序表,链表,栈,队列都是属于线性结构,但是到了二叉树这里就是非线性结构了。下面我们先来认识一下什么是树。原创 2022-09-28 20:13:17 · 331 阅读 · 0 评论 -
二叉搜索树
迭代法,就需要在找到min节点的时候保存min节点的parent,然后可以将min节点的值与被删除节点的值交换,也可以直接用min节点的值覆盖被删除节点,然后将parent与min节点的右子树连接起来就行(min的左子树为空,所以肯定是连接右子树)如果找到了和插入的值相同的节点则说明插入失败。删除这里的主要部分就是找到了节点之后如果节点的左右子树都不是空,那么使用替换法删除,递归法的替换法删除简单一点,因为只需要找到min节点交换后,递归来到被删除节点的右子树查找key值然后删掉就可以了。原创 2022-09-20 11:36:03 · 1173 阅读 · 1 评论 -
九大排序C语言版本(思想+代码+讲解+变形)
选择排序 插入排序 希尔排序 归并排序 快速排序 快速排序版本1:挖坑法 快排优化版本(三数取中and小区间优化) 因为我们知道上述快排在极限情况下,比如数组是有序的,每次选取,选左区间就会遍历右区间,这样快速排序的二分就失效了,所以这时候时间复杂度是O(N^2),这时候我们可以使用三数取中法进行优化,就是进入一趟排序之前,先将区间中间位置,开始位置,结束位置,他们三个数的中间大小的那个数与第一个数字交换,这样如果数组是有序的,就可以避免最坏情况的出现,因为每次将数组中间那个值换原创 2022-06-11 21:06:24 · 320 阅读 · 0 评论 -
数据结构<4>栈和队列——原理+实现
队列只能用链表来实现,数组实现栈效率太低,例如:将数组0下标位置当作是队头,那么出队列的时候就要将后面的数据都向前移动时间复杂度是O(N),如果将0下标位置当作是队尾,那么每次插入数据都需要向后移动已经插入好的数据,所以数组不适合用来实现队列。循环队列是一种队列的变形,也就是将队列的首位链接起来成为一个环状的队列,循环队列的长度是一定的,一旦确定了元素个数也就确定了环的大小,这个环就不可以在改变了。队列是一种先进先出(FIFO)的结构,结构的一端是队头另一端是队尾,入数据只能在队尾,出数据在队头。.....原创 2022-08-31 19:22:59 · 724 阅读 · 0 评论 -
数据结构<3>链表(代码实现和数组模拟)
每个节点都是由一个数据域和一个指针域组成的,指针域里面保存的就是下一个节点的地址,这样子就将所有的节点像是链子一样串在一起,这就是单链表。上面的单链表是用结构体来实现的,但是一般在算法题中我们都是使用的数组模拟单链表,比如图的邻接表,邻接矩阵,或者是哈希桶等等,使用数组模拟主要是可以避免malloc开辟空间的性能消耗,并且实现的代码更加简单。insert实现的是在k的右边插入元素,如果想要在k的左边插入也很简单,在k的左边插入元素相当于在k的左边的元素的右边插入,所以可以一样的调用。...原创 2022-08-09 15:55:52 · 156 阅读 · 0 评论 -
数据结构<2> 顺序表
这里的start就是整个动态数组的开头,finish指向的位置就是当前数组最后一个元素的下一个位置,最后finish到endofstorage这块就是数组多开辟一部分空间预留,防止每次插入数据都要增容,实际上这两种结构都是一样的。这里的结构可以看到,如果使用了动态开辟的数组就需要额外的一个变量capacity来保存当前数组的容量是多少,如果使用静态顺序表则不用,因为容量是固定的,当size==capacity的时候就需要增容了。这里的删除不需要清空数据,赋值成0更是不可取,万一这里的数据本来就是0呢?...原创 2022-07-31 21:03:24 · 191 阅读 · 0 评论 -
数据结构<1>时空复杂度详解
算法效率分析分为两种第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间....原创 2022-07-26 19:21:57 · 1491 阅读 · 0 评论