数据结构与算法
文章平均质量分 61
程序=数据结构+算法
吃米饭
这个作者很懒,什么都没留下…
展开
-
快速排序及优化
每次从当前考虑的数组中选一个元素,把这个元素想办法挪到应该排好序的位置,比如4这个元素,它就有一个性质4之前的元素都是小于它的,之后的元素都是大于它的,之后我们要做的事情是对小于4和大于4的数组分别继续使用快速排序的思路,逐渐递归下去完成整个排序过程。...原创 2022-07-20 01:37:27 · 234 阅读 · 3 评论 -
归并排序及优化
对于arr[mid]原创 2022-07-19 13:36:01 · 338 阅读 · 0 评论 -
选择排序/插入排序/冒泡排序
首先对于第零个元素8保持不变,然后考察6,先把6赋值一份,然后看看6是不是适合放在当前的位置,就和前面的元素做比较,如果和前一元素要小就说明不应该放在当前的这个位置,而8因该放在当前的这个位置,所以把8向后挪一位,之后再考察6是不是因该放在前一位置,以此类推。对于第一个元素我们不动,因为当我们只考虑8这个元素是它已经是有序的了,我们要看的是6这个元素,对于这个元素我们要的是把它放到前面合适的位置,跟它前面的8相比6比8小索引它们要调换一下位置,此时前两个元素就有序了,以此类推。...原创 2022-07-18 20:15:32 · 203 阅读 · 0 评论 -
哈希表(HashTable)
哈希表:也叫做散列表。是根据关键字和值(Key-Value)直接进行访问的数据结构。也就是说,它通过关键字 key 和一个映射函数 Hash(key) 计算出对应的值 value,然后把键值对映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数(散列函数),用于存放记录的数组叫做 哈希表(散列表)。 哈希表的关键思想是使用哈希函数,将键 key 和值 value 映射到对应表的某个区块中。可以将算法思想分为两个部分:哈希表的原理示例图如下所示:哈希函数:将哈希表中元素的关键键值映射为元原创 2022-07-13 21:19:59 · 55408 阅读 · 1 评论 -
2-3树/红黑树
为了维护2-3树绝对平衡的性质,插入结点时就要符合一下逻辑:原创 2022-07-13 19:09:37 · 138 阅读 · 0 评论 -
AVL 树
插入或删除节点后,可能会造成 AVL 树的平衡被破坏,因此,需要沿着从被插入/删除的节点到根的路径对树进行维护。就是在树的某一部分的不平衡度超过一个阈值后触发相应的平衡操作,保证树的平衡度在可以接受的范围内...原创 2022-07-13 16:25:45 · 201 阅读 · 0 评论 -
并查集(UnionFind)
并查集和其他树形结构不一样,是由孩子指向父亲,它解决了一些连接问题,怎么才能确定两个点是否相连呢?并查集可以非常快的确定两个点是否连接。我们可以用一个数组表示,对于0到9每个不同的编号可以表示不同的对象,这里可以看作一个点,而编号对应的不同的元素可以表示不同的集合,其中[0,2,4,6,8]表示一个集合。这样就可以表示连接问题了,0和2就是表示相连接,因为它们在一个集合,0和1因不在一个集合所以不连接。对于一组数据并查集主要支持两个动作:优化unionElements从代码中可以看到:将每个元素,原创 2022-07-08 19:59:49 · 235 阅读 · 0 评论 -
字典树(Trie)
字典树(TrieTree),是一种树形结构,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串,如01字典树)。主要思想是利用字符串的公共前缀来节约存储空间。很好地利用了串的公共前缀,节约了存储空间。字典树主要包含两种操作,插入和查找。...原创 2022-07-07 17:00:30 · 153 阅读 · 0 评论 -
线段树(SegmentTree)
什么是线段树:对于一个二叉树,每一个节点存储的是一个线段或是一个区间相应的信息。原创 2022-07-06 17:13:52 · 1273 阅读 · 0 评论 -
C++ 简单实现vector
向量向量是序列容器,表示可以更改大小的数组。就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组一样高效。但与数组不同的是,它们的大小可以动态变化,它们的存储由容器自动处理。在内部,向量使用动态分配的数组来存储其元素。可能需要重新分配此数组,以便在插入新元素时增加大小,这意味着分配新数组并将所有元素移动到该数组。就处理时间而言,这是一项相对昂贵的任务,因此,每次将元素添加到容器时,向量都不会重新分配。相反,向量容器可以分配一些额外的存原创 2022-03-06 22:38:15 · 1773 阅读 · 0 评论 -
优先队列(PriorityQueue)
> 此代码是在最大堆的基础上二次封装,请先阅读底层代码MaxHeap优先队列普通队列:先进先出;后进后出优先队列:出队顺序和⼊入队顺序无关;和优先级相关;为什么使用堆代码清单Queue.h//// Created by cheng on 2021/7/11.//#ifndef MAXHEAP_QUEUE_H#define MAXHEAP_QUEUE_Htemplate<typename T>class Queue {public: virtua原创 2021-07-11 19:25:20 · 117 阅读 · 0 评论 -
最大堆(MaxHeap)
性质二叉堆是一颗完全二叉树,而完全二叉树是把元素排列成树的形状。堆中某个节点的值总不大于其父节点的值最大堆(相应的可以定于最小堆)// 返回完全二叉树的数组表示中,一个索引所表示的元素的父亲节点的索引constexpr int parent(const int index) const { if (index == 0) { throw new NoParent(); } return (index - 1) / 2;}// 返回完全二叉树的数组表原创 2021-07-11 19:08:35 · 2727 阅读 · 1 评论 -
双向循环链表(DoubleLoopLinkList)
双向循环链表关于双向循环链表可以先阅读这篇文章这里就不再赘述:双向链表(DoubleLinkList)Nodetemplate<typename T>class Node {public: T e; Node *prev; Node *next; Node() : e(0), prev(nullptr), next(nullptr) {} Node(const T &E) : e(E), prev(nullptr), next(原创 2021-07-06 16:48:58 · 182 阅读 · 0 评论 -
双向链表(DoubleLinkList)
双向链表有关链表的知识可以点击我上篇文章这里就不再赘述LinkedList双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。双向循环链表的可以点击我这篇文章这里就不再赘述DoubleLoopLinkList添加头添加void addFirst(const T &e) { //新建一个节点让它前驱指向头,后继指向头的后原创 2021-07-06 16:14:02 · 808 阅读 · 0 评论 -
Set/Map
Set.h#ifndef C___SET_H#define C___SET_Htemplate<typename T>class Set { virtual void add(T e) = 0; virtual void remove(T e) = 0; virtual bool contains(T e)const= 0; virtual int getSize()const= 0; virtual bool isEmpty()const= 0原创 2020-05-22 19:13:27 · 205 阅读 · 0 评论 -
二叉查找树(BST)
#ifndef C___BST_H#define C___BST_H#include <stack>#include <queue>template<typename T>class BSTNode{public: T e; //节点元素 BSTNode<T>*left; //左节点 BSTNode<T>*right; //右节点 public: BSTNode(T E):e(E)原创 2020-05-18 17:09:14 · 353 阅读 · 0 评论 -
链表队列(LinkedListQueue)
栈操作入队template<typename T>void LinkedListQueue<T>::enqueue(T e) { if (tail == nullptr) //队列是否为空 { tail = new QNode<T>(e); //为空则添加在对尾指针 head = tail; ...原创 2020-04-16 19:23:31 · 535 阅读 · 0 评论 -
链表栈(LinkedListStack)
链式栈:就是一种操作受限的单向链表,每次入栈一个元素,向链表中添加一个节点,出栈一个元素,释放一个节点。因为栈具有“后进先出”的特点,如果每次在链表的尾部进行插入和删除,就要遍历整个链表来找到尾节点。而在头部进行插入和删除时,只需根据头指针即可找到链表的首元素结点。而无需遍历链表。所以链式栈的出,入栈通过对链表进行头删和头插来实现。LinkedList代码清单#ifndef C___...原创 2020-04-16 18:19:58 · 1018 阅读 · 0 评论 -
单链表(LinkedList)
与数组相似,链表也是一种线性数据结构。这里有一个例子: 正如你所看到的,链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素中的引用字段链接在一起。 链表有两种类型:单链表和双链表。上面给出的例子是一个单链表,这里有一个双链表的例子: 单链表中的每个结点不仅包含值,还包含链接到下一个结点的引用字段。通过这种方式,单链表将所有结点按顺序组织起来。下面是一个单链表的例子:...原创 2020-04-16 18:03:26 · 1322 阅读 · 2 评论 -
循环队列(LoopQueue)
循环队列相比普通的队列,元素出队时无需移动大量元素。代码 ArrayQueue.h 点它代码清单#ifndef C___LOOPQUEUE_H#define C___LOOPQUEUE_H#include "ArrayQueue.h"#include <iostream>template<typename T>class LoopQueue :...原创 2020-04-12 16:31:17 · 534 阅读 · 0 评论 -
数组队列(ArryQueue))
队列是一种 先进先出(First In First Out,FILO) 的种线性数据结构 。代码 Array.h 点它代码清单#ifndef C___ARRAYQUEUE_H#define C___ARRAYQUEUE_H#include "Array.h"template<typename T>class ArrayQueue{public: A...原创 2020-04-12 14:41:02 · 632 阅读 · 0 评论 -
数组栈(ArrayStack)
栈 栈是一种线性结构,相比与数组,栈对应的操作时数组的子集,只能从一端添加元素,也只能从一端取出元素,是一种 后进先出(Last In First Ou,LIFO) 的数据结构。pushpop代码 Array.h 点它栈应用之括号匹配include"ArrayStack.h"using namespace std;int isValid(string s){ ...原创 2020-04-09 19:16:18 · 1154 阅读 · 0 评论 -
动态数组(Array)
存储具有一对一逻辑关系数据的存储顺序结构。数组最大的优点:快速查询,最好应用于索引有语义的情况。插入元素template<typename T>bool Array<T>::add(const int index, const T& e) { if (index<0 || index>size)return false; //判断索...原创 2020-04-09 13:43:05 · 2522 阅读 · 0 评论 -
数据结构之图
1. 图的定义图(graph) 是由一些点(vertex) 和这些点之间的连线(edge) 所组成的;其中,点通常称为顶点(vertex),而点到点之间的连线通常称之为边或者弧(edge)。通常记为G=(V,E);要注意的是:线性表可以是空表,树可以是空树,图不可以是空图,图可以没有边,但是至少要有一个顶点。2. 图的组成图由两种类型的元素组成,顶点和边,有时候,有向图的边也称为弧。...原创 2020-02-21 13:14:17 · 489 阅读 · 0 评论 -
图(邻接矩阵)
Node.h#pragma onceclass Node{public: Node(char data = 0); char m_cData; bool m_bIsVisited;};Node.cpp#include "Node.h"Node::Node(char data){ m_cData = data; m_bIsVisited = false;}C...原创 2020-02-21 10:28:04 · 527 阅读 · 0 评论 -
数据结构之树
树的基本概念本质问题树不是线性表,是一种描述非线性层次关系的数据结构。描述的是一对多的数据结构。节点: 使用树结构存储的每一个数据元素都被称为结点。1. 树的定义树(Tree)的基本概念树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)有多个附加结点,所有结点构成一个多级分层...原创 2020-02-17 22:07:34 · 243 阅读 · 0 评论 -
二叉树(链表表示)
Node.h#pragma onceclass Node{public: Node(); Node* SearchNode(int indexnode); void DeleteNode(); void PreorderTraversal(); void InorderTraversal(); void PostorderTraversal(); int index; i...原创 2020-02-17 20:57:23 · 394 阅读 · 0 评论 -
二叉树(数组表示)
.h 文件:#pragma onceclass Tree{public: Tree(int size, int* pRoot); ~Tree(); int* SearchNode(int nodeIndex); //查找 bool AddNode(int nodeIndex, int direction, int* pNode);//添加 bool DeleteNode(in...原创 2020-02-14 21:07:25 · 464 阅读 · 0 评论