随笔分类 -  算法与数据结构

摘要:快速排序 每次从当前考虑的数组中选一个元素,把这个元素想办法挪到应该排好序的位置,比如4这个元素,它就有一个性质4之前的元素都是小于它的,之后的元素都是大于它的,之后我们要做的事情是对小于4和大于4的数组分别继续使用快速排序的思路,逐渐递归下去完成整个排序过程。 对于快速排序如果把选定的元素挪到正确 阅读全文
posted @ 2022-07-20 01:34 放飞梦想C 阅读(654) 评论(2) 推荐(2)
摘要:归并排序 首先把数组分成一半,想办法把左右两边数组排序,之后呢再将它们归并起来,这就是归并排序的基本思想。 这样的话如果有N个元素,就会分成log(n)层,如果整个归并过程我们可以以O(n)时间复杂度解决的话,那么我们就设计成了一个 Nlog(n)级别的排序算法。 这个归并的过程需要O(n)的辅助空 阅读全文
posted @ 2022-07-19 13:33 放飞梦想C 阅读(165) 评论(0) 推荐(0)
摘要:选择排序 首先在这整个数组范围里找到最小的元素1,然后和第一名的位置交换,之后我们在剩下的部分再找最小的元素2,把2和第二名的位置来交换,以此类推。 selectionSort template<typename T> void selectionSort(T arr[], int n) { for 阅读全文
posted @ 2022-07-18 20:08 放飞梦想C 阅读(109) 评论(0) 推荐(0)
摘要:哈希表 哈希表:也叫做散列表。是根据关键字和值(Key-Value)直接进行访问的数据结构。也就是说,它通过关键字 key 和一个映射函数 Hash(key) 计算出对应的值 value,然后把键值对映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数(散列函数),用于存放记录的 阅读全文
posted @ 2022-07-13 21:19 放飞梦想C 阅读(253) 评论(0) 推荐(0)
摘要:2-3树 为了维护2-3树绝对平衡的性质,插入结点时就要符合一下逻辑: 添加结点不能添加到空位置,除非此时整个树为空。 如果按照二分搜索树的方式插入元素,如果插入位置为空,此时和最后找到的那个叶子节点融合。 红黑树 添加 左旋转 颜色翻转 右旋转 性能 Github Code #pragma onc 阅读全文
posted @ 2022-07-13 19:08 放飞梦想C 阅读(60) 评论(0) 推荐(0)
摘要:二叉查找树(BST) 平衡二叉树 平衡因子: 某个结点的左子树的高度减去右子树的高度得到的差值。 插入或删除节点后,可能会造成 AVL 树的平衡被破坏,因此,需要沿着从被插入/删除的节点到根的路径对树进行维护。就是在树的某一部分的不平衡度超过一个阈值后触发相应的平衡操作,保证树的平衡度在可以接受的范 阅读全文
posted @ 2022-07-13 16:23 放飞梦想C 阅读(57) 评论(0) 推荐(0)
摘要:并查集和其他树形结构不一样,是由孩子指向父亲,它解决了一些连接问题,怎么才能确定两个点是否相连呢?并查集可以非常快的确定两个点是否连接。 如何确定连个点是否连接呢? 我们可以用一个数组表示,对于0到9每个不同的编号可以表示不同的对象,这里可以看作一个点,而编号对应的不同的元素可以表示不同的集合,其中 阅读全文
posted @ 2022-07-08 19:59 放飞梦想C 阅读(93) 评论(0) 推荐(0)
摘要:Trie最大的问题:空间!所以可以使用一下解决方案。 Code #pragma once #include <map> class Node { public: explicit Node() noexcept: isWord(false) {} explicit Node(bool isWord) 阅读全文
posted @ 2022-07-07 16:57 放飞梦想C 阅读(30) 评论(0) 推荐(0)
摘要:对于数组应用于区间染色实现为On,而线段树是O(logn) 什么是线段树:对于一个二叉树,每一个节点存储的是一个线段或是一个区间相应的信息。 查询 更新 #pragma once #include <cassert> #include <functional> template<typename T 阅读全文
posted @ 2022-07-06 17:08 放飞梦想C 阅读(273) 评论(0) 推荐(0)
摘要:向量 向量是序列容器,表示可以更改大小的数组。 就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组一样高效。但与数组不同的是,它们的大小可以动态变化,它们的存储由容器自动处理。 在内部,向量使用动态分配的数组来存储其元素。可能需要重 阅读全文
posted @ 2022-03-06 22:34 放飞梦想C 阅读(270) 评论(0) 推荐(0)
摘要:> 此代码是在最大堆的基础上二次封装,请先阅读底层代码MaxHeap 优先队列 普通队列:先进先出;后进后出 优先队列:出队顺序和⼊入队顺序无关;和优先级相关; 为什么使用堆 代码清单 Queue.h // // Created by cheng on 2021/7/11. // #ifndef M 阅读全文
posted @ 2021-07-11 19:25 放飞梦想C 阅读(158) 评论(0) 推荐(1)
摘要:性质 二叉堆是一颗完全二叉树,而完全二叉树是把元素排列成树的形状。 堆中某个节点的值总不大于其父节点的值最大堆(相应的可以定于最小堆) // 返回完全二叉树的数组表示中,一个索引所表示的元素的父亲节点的索引 constexpr int parent(const int index) const { 阅读全文
posted @ 2021-07-11 19:06 放飞梦想C 阅读(1000) 评论(0) 推荐(0)
摘要:双向循环链表 关于双向循环链表可以先阅读这篇文章这里就不再赘述:双向链表(DoubleLinkList) Node template<typename T> class Node { public: T e; Node *prev; Node *next; Node() : e(0), prev(n 阅读全文
posted @ 2021-07-06 16:48 放飞梦想C 阅读(236) 评论(0) 推荐(0)
摘要:双向链表 有关链表的知识可以点击我上篇文章这里就不再赘述LinkedList 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 双向循环链表的可以 阅读全文
posted @ 2021-07-06 16:21 放飞梦想C 阅读(390) 评论(0) 推荐(0)
摘要:此代码是再 "BST.h" 和 "LinkedList.h" 上的二次封装,阅读前请先了解底层代码。 Set 基于链表的Set:Value是无序不重复的。 基于BST的Set:Value是有序不重复的。 节点结构 由于是底层链表和BST的二次封装所以和底层数据结构的节点相同。 Map Map:是由K 阅读全文
posted @ 2020-05-22 19:12 放飞梦想C 阅读(253) 评论(0) 推荐(0)
摘要:二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 二叉搜 阅读全文
posted @ 2020-05-18 17:06 放飞梦想C 阅读(305) 评论(0) 推荐(0)
摘要:栈操作 入队 template<typename T> void LinkedListQueue<T>::enqueue(T e) { if (tail == nullptr) //队列是否为空 { tail = new QNode<T>(e); //为空则添加在对尾指针 head = tail; 阅读全文
posted @ 2020-04-16 19:23 放飞梦想C 阅读(547) 评论(0) 推荐(0)
摘要:链式栈:就是一种操作受限的单向链表,每次入栈一个元素,向链表中添加一个节点,出栈一个元素,释放一个节点。因为栈具有“后进先出”的特点,如果每次在链表的尾部进行插入和删除,就要遍历整个链表来找到尾节点。而在头部进行插入和删除时,只需根据头指针即可找到链表的首元素结点。而无需遍历链表。所以链式栈的出,入 阅读全文
posted @ 2020-04-16 18:19 放飞梦想C 阅读(299) 评论(0) 推荐(0)
摘要:与数组相似,链表也是一种线性数据结构。这里有一个例子: 正如你所看到的,链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素中的引用字段链接在一起。 链表有两种类型:单链表和双链表。上面给出的例子是一个单链表,这里有一个双链表的例子:双向链表(DoubleLinkList) 单链表中的每 阅读全文
posted @ 2020-04-16 18:03 放飞梦想C 阅读(333) 评论(0) 推荐(0)
摘要:循环队列相比普通的队列,元素出队时无需移动大量元素。 代码 ArrayQueue.h 点它 代码清单 #ifndef C___LOOPQUEUE_H #define C___LOOPQUEUE_H #include "ArrayQueue.h" #include <iostream> templat 阅读全文
posted @ 2020-04-12 16:31 放飞梦想C 阅读(452) 评论(0) 推荐(0)