
数据结构
文章平均质量分 76
栖林_
一个励志于做全栈工程师的平平无奇大学生,希望在这里留下自己学习的记录
展开
-
哈希封装unordered系列关联式容器
这里实现++主要有一个难点,就是当一个哈希桶走完的时候,我们如何找到下一个有效的哈希桶,一种思路是当场直接计算,取到下一个表中的值,计算出对应的哈希地址,第二种是直接现场推演,只要没有走出整个表,当我们找到一个不为空的节点时,这就是++的下一个位置,如果一直走出了表,就说明到了结尾,赋值为空即可。我们知道了这个错误的产生原因,就有思路可以解决了,就是不让他自动构造,我们手动构造一个迭代器给她返回就没问题了,也就是使用auto接收插入的返回值,然后再手动构造一个const迭代器,返回,就解决了这里的报错。原创 2024-04-24 23:10:42 · 577 阅读 · 0 评论 -
unordered系列关联式容器和开散列与闭散列的模拟实现
对于插入函数,也需要检测一下是否需要扩容,这里扩容的操作也可以像闭散列一样,逐一插入再交换,但其实没有必要这样做,单链表本身其实非常灵活,我们可以直接移动节点而非创造和删除节点,扩容之后的插入因为不知道查询的顺序,所以头插和尾插都是可以的,但是尾插需要找到尾部,效率其实没有那么高,因此我们选择头插。最上面的仿函数和之前红黑树实现的类似,红黑树里的仿函数是取出Key对应的T,这里的仿函数是因为不知道Key的类型,例如字符串,不能直接对某个数字取模,因此采用仿函数的方法进行特化。原创 2024-04-19 15:24:03 · 436 阅读 · 0 评论 -
C++手撕AVL树
之前我们讲了二叉搜索树的相关内容,但是也了解到二叉搜索树有其自身的缺陷,就是当插入的元素有序或者接近有序,退化成单支树的时候,他的时间复杂度就会退化成O(N),因此我们需要对他进行优化,有两种,一种是AVL树,也就是平衡二叉树,另一种是红黑树,这里我们先介绍AVL树。具体操作是将30的右子树给60的左子树,然后让30做60的父节点,之后更新平衡因子,这里有几点需要考虑,30的右子树有可能不存在,但是不影响结果。当新插入的节点在较高左子树的右侧时,旋转一次就无法解决问题了,此时就需要先左旋,再右选,如图。原创 2024-03-26 21:38:33 · 529 阅读 · 0 评论 -
C++泛型实现搜索二叉树
因此当二叉树为单支树,我们应当如何改进,使其性能都达到最优,就需要引入AVL树和红黑树,这些我们在后面也会陆续讲解和实现。第一类是K模型,结构中只需要存储Key即可,关键之就是所需要的值,一般用于检测某个值是否存在。二叉搜索树(BST,Binary Search Tree)又称为二叉排序树,空树也算。从根节点开始查找比较,比根大向右查找,比根小向左查找。最优情况下,二叉树为完全二叉树,其平均比较次数为。最差情况下,二叉树为单支树,其平均比较次数为。插入的次序不同,会影响到二叉树的结构。原创 2024-03-08 22:13:18 · 716 阅读 · 0 评论 -
STL中优先队列(堆)的详解
这个priority_queue翻译成中文就是优先级队列,但其实我们很难去一眼看出他的意思到底是什么,他的逻辑结构实际上类似于数据结构中的堆(heap),而且是大根堆,即为堆顶为序列的最大值我们了解了堆的基本内容之后再回到优先队列,我们已经知道了他的本质就是一个堆,再来理解就会相当简单。原创 2023-12-22 17:37:18 · 981 阅读 · 1 评论 -
栈(顺序表)和队列(单链表)的实现(c语言)
栈是一种基础的数据结构,具有一些特定的性质,例如先进后出,压栈出栈等,对于这些性质,一般可以采用顺序表来实现,当然也可用链表。原创 2023-07-16 11:13:16 · 255 阅读 · 5 评论 -
双链表的增删查改(c语言实现)
双链表增删查改原创 2023-06-12 18:30:41 · 192 阅读 · 5 评论