![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
一杆梅子酒丶
这个作者很懒,什么都没留下…
展开
-
哈希表详解
哈希概念顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(log2N),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。当向该结构中:插入元素根据待插入元素的关键码原创 2020-08-17 10:30:51 · 2636 阅读 · 0 评论 -
红黑树(RBTree)
红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。红黑树的性质每个结点不是红色就是黑色根节点是黑色的如果一个节点是红色的,则它的两个孩子结点是黑色的对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点每个叶子结点都是黑色的(此处的叶子结点指的是空结点)红黑树节点的定义//节点的颜色原创 2020-08-10 11:33:57 · 268 阅读 · 0 评论 -
平衡二叉搜索树(AVLTree)
AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:它的左右子树都是AVL树左右原创 2020-08-08 12:15:39 · 1453 阅读 · 0 评论 -
二叉搜索树(BSTree)
二叉搜索树定义二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树通过观察上图可以发现:二叉搜索树中序遍历后是一个有序序列每个节点的值都是唯一的,不可重复二叉搜索树操作1.查找2.插入树为空,则直接插入树不为空,按二叉搜索树性质查找插入位置,插入新节点...原创 2020-08-06 20:37:38 · 655 阅读 · 0 评论 -
堆(Heap)详解(C实现)
堆的定义如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。堆的性质:堆中某个节点的值总是不大于或不小于其父节点的值堆总是一棵完全二叉树堆向下调整算法(建小堆)现在我原创 2020-08-01 11:03:26 · 490 阅读 · 0 评论 -
队列(queue)的基本操作(C实现)
队列队列,简称队,它是一种操作受限的线性表,其限制在表的一端进行插入,另一端进行删除。可进行插入的一端称为队尾(rear),可进行删除的一端称为队头(front)。向队中插入元素叫入队,新元素进入之后就成为新的队尾元素。从队中删除元素叫出队,元素出队后,其后继结点元素就成为新的队头元素。队列可以用数组或者链表的结构实现,但是用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。代码实现#include <stdio.h>#include <st原创 2020-07-29 11:37:40 · 1304 阅读 · 0 评论 -
栈(stack)的基本操作(C实现)
栈是数据结构中较为简单的结构体,是一种操作受到限制的线性表。但简单不代表没用,毕竟数组很简单。但谁敢说数组没用呢?栈的思想栈是一个先进后出的结构,类似于堆盘子,先放到地上的盘子最后被取走(默认只能取走一个盘子)栈其实就是操作受限的线性表,只有一个口,每一次操作时,这个口可以当出口也可以当入口例如:水桶注入水时,水桶的头当做入口,倒水时,水桶的头当做出口栈的图解这是一个空栈,只有上面是入口和出口放入一个元素a接着依次放入元素b、c取出一个元素,由栈只有一个口的特点可以原创 2020-07-29 11:37:18 · 677 阅读 · 0 评论 -
链表的基本操作(C实现)
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:单向、双向带头、不带头循环、非循环虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶。带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复原创 2020-07-26 21:46:06 · 1189 阅读 · 0 评论 -
顺序表的基本操作(C实现)
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。顺序表一般可以分为:静态顺序表:使用定长数组存储。动态顺序表:使用动态开辟的数组存储。定义typedef int DataType;typedef struct SeqList{ DataType* _arr; //动态数组存储 size_t _size; //有效元素的个数 size_t _capacity; //容量}SeqList;初始化void In原创 2020-07-25 17:16:35 · 509 阅读 · 0 评论