
数据结构与算法
文章平均质量分 67
数据结构与算法
却道天凉_好个秋
这个作者很懒,什么都没留下…
展开
-
c++ 梅森旋转随机数生成器类(32位和64位)
private:// 状态向量大小// 捻转参数// 常量// 高位掩码// 低位掩码// 状态向量int index;// 混合两个整数public:index = N;i < N;= 0) { // x 的最低位为1index = 0;// 后处理提高随机性return y;// 使用种子初始化i < 10;原创 2024-12-09 11:31:32 · 552 阅读 · 0 评论 -
c++ 数据结构:图
图由。原创 2024-12-08 11:38:24 · 1159 阅读 · 0 评论 -
c++ AC自动机
AC 自动机(Aho-Corasick 自动机)是一种高效的字符串匹配算法,特别适用于从文本中同时查找多个模式串的场景。它结合了(前缀树)和。原创 2024-12-03 15:15:25 · 467 阅读 · 0 评论 -
c++ A*搜索算法
A*的核心是选择具有最低 f(n)值的节点进行扩展,从而在保证正确性的同时提高效率。原创 2024-12-01 22:29:39 · 389 阅读 · 0 评论 -
c++ 位图和布隆过滤器
布隆过滤器是一种基于位图的概率性数据结构,用于判断某个元素是否在集合中。它可能存在假阳性(误判元素存在),但不会有假阴性(漏判元素不存在)。原创 2024-12-01 22:06:40 · 1150 阅读 · 0 评论 -
c++ 拓扑排序
拓扑排序是一种线性排序算法,主要用于中,对顶点进行排序,使得对于每一条边 u→v,顶点 u 都排在顶点 v之前。原创 2024-11-28 22:26:28 · 453 阅读 · 0 评论 -
c++ 栈
栈(Stack)是计算机科学中一种非常重要的数据结构,它是一种遵循(LIFO, Last In First Out)原则的数据结构,即最后放入栈中的元素最先被取出。原创 2024-11-20 22:24:36 · 437 阅读 · 0 评论 -
c++ 深度和广度优先搜索
深度优先搜索 (DFS):采用递归(或栈)策略,从根节点出发,一直深入到叶子节点。适合在树结构中需要访问每个节点的场景,如路径查找、图的遍历等。典型实现:前序、中序、后序遍历。广度优先搜索 (BFS):采用队列策略,从根节点开始,逐层访问节点。适合查找最短路径等场景,尤其在图算法中广泛应用。典型实现:层序遍历。原创 2024-11-19 23:06:53 · 626 阅读 · 0 评论 -
c++ 二叉树
(Binary Tree)是一种树形结构,每个节点最多有两个子节点。原创 2024-11-17 20:41:36 · 1105 阅读 · 0 评论 -
c++ 二分查找
类似于查找最左位置,我们也可以通过二分查找来找到目标值的最后一个出现位置。问题描述:给定一个升序排列的数组arr和一个目标值target,请找出target在数组中最后出现的位置。// 如果当前值等于目标值,则向右侧继续查找} else {// 检查 left 是否越界或值是否等于目标return -1;// 未找到目标值if (index!= -1) {cout原创 2024-11-13 22:42:37 · 494 阅读 · 0 评论 -
c++ 动态规划
动态规划是一种强大的算法设计技巧,通过优化子问题的解来减少重复计算,显著提升算法效率。常见的应用场景包括:最短路径、背包问题、字符串匹配、图算法等。原创 2024-11-12 22:37:57 · 655 阅读 · 0 评论 -
链表(一):头插法与尾插法
尾插法是将新节点插入到链表的尾部。我们需要遍历链表直到找到最后一个节点,然后将其。头插法是将新节点插入到链表的头部。每次插入时,将新节点的。指向当前的头节点,然后更新头指针指向新节点。每次新节点插入链表头部,时间复杂度为。每次新节点插入链表尾部,时间复杂度为。,因为需要遍历整个链表找到尾部。原创 2024-11-11 22:52:58 · 308 阅读 · 0 评论 -
c++ 分治算法
分治算法是一种重要的算法设计范式,其核心思想是将一个复杂的问题分解为多个规模较小的相同问题,逐步解决这些较小的问题,最后将这些问题的解合并成原问题的解。原创 2024-11-08 22:52:46 · 1061 阅读 · 0 评论 -
c++ 回溯算法
回溯算法通过递归地构建解,并在发现当前路径不符合要求时回退并尝试其他路径。它非常适用于解空间较大。原创 2024-11-05 22:11:20 · 1238 阅读 · 0 评论 -
c++ 贪心算法
贪心算法虽然简单易懂,但并不是所有问题都适用。在实现贪心算法时,需要确保每一步的局部选择能够导向全局最优解。原创 2024-11-03 20:12:00 · 2021 阅读 · 0 评论 -
c++ trie树
Trie(也叫前缀树或字典树)是一种树形数据结构,主要用于快速检索字符串集合中的前缀匹配,常见于词典、自动补全、IP 路由等场景。原创 2024-10-27 21:16:57 · 450 阅读 · 0 评论 -
c++ 堆和堆排序
堆是一种高效的二叉树数据结构,适用于需要快速获取最大/最小值的场景。堆排序是一种原地排序算法,空间复杂度 O(1),但它是不稳定排序。应用场景广泛,如优先队列、Top K 问题和多路归并等。原创 2024-10-23 22:37:45 · 815 阅读 · 0 评论 -
c++ 散列表
散列表是一种高效且灵活的数据结构,适合用于需要快速查找和存储的场景。通过合理设计哈希函数和冲突处理策略,可以实现良好的性能。原创 2024-10-20 21:16:11 · 452 阅读 · 0 评论 -
c++ 跳表
时间复杂度:查找、插入、删除的期望时间复杂度为 O(logn)。空间复杂度:O(nlogn),因为每个节点可能会出现在多层中。跳表的实现简单且高效,常用于Redis等数据库的有序集合。原创 2024-10-16 21:42:46 · 516 阅读 · 0 评论 -
数据结构之队列总结
1. 队列的定义队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。2. 队列的操作是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。3. 循环队列循环队列是把队列头尾相接的顺序存储结构。通用计算队列长度的公式:(rear - front + MAX_SIZE) % QueueSize队列满的条件为:(rear + 1) % QueueSize == front3.1原创 2021-01-24 17:51:27 · 611 阅读 · 0 评论 -
数据结构之栈的总结02——斐波那契的递归函数
斐波那契的递归函数的简单实现:#include <iostream>using namespace std;int Fbi(int i){ if (i < 2) return i == 0 ? 0 : 1; return Fbi(i - 1) + Fbi(i - 2);}int main(){ for (int i = 0; i < 40; i++) cout << Fbi(i) << endl; system("p原创 2021-01-22 00:24:28 · 199 阅读 · 0 评论 -
数据结构之栈的总结01
1. 栈的定义栈(stack)是限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又被称为后进先出(Last in First out)的线性表,简称LIFO结构。2. 栈的操作栈的插入操作,称为进栈,也称为压栈、入栈;栈的删除操作,称为出栈,也叫做弹栈;3. 栈的定义typedef int SElemType;typedef struct { SElemType data[M原创 2021-01-20 00:33:09 · 300 阅读 · 0 评论 -
赫夫曼树原理
1. 定义权: 树结点间的边相关的树,如图所示,A结点的权为5,B结点的权为15,可依次推导其他结点的权。路径长度: 从树中一个结点到另一个结点之间的分支构成两个结点之前的路径,即路径上的分支数目。如图所示,二叉树a中根结点到结点D的路径长度为4,二叉树b中根结点到结点D的长度为2。树的路径长度: 从树根到每一个结点的路径长度之和。二叉树a的树路径长度为1+1+2+2+3+3+4+4=20,二叉树b的树路径长度为1+2+3+3+2+1+2+2=16。结点的带权的路径长度: 从该结点到树根原创 2020-12-29 23:41:29 · 294 阅读 · 0 评论 -
二叉树的建立
/*按前序输入二叉树中结点的值(一个字符)*//*'#'表示空树,构造二叉链表表示二叉树T*/void CreateBiTree(BiTree *T){ TElemType ch; scanf("%c", &ch); if (ch == '#') *T = nullptr; else { *T = (BiTree)malloc(sizeof(biTNode)); if (!*T) exit(OVERFLOW); //更改生成根结点的顺序可实现按照中序或后续遍.原创 2020-12-27 16:11:07 · 209 阅读 · 0 评论 -
二叉树的遍历算法
1. 二叉树遍历的定义二叉树的遍历是指从根节点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。2. 前序遍历遍历的顺序为:ABDGHCEIF排序算法:/*二叉树的前序遍历递归算法*/void PreOrderTraverse(BiTree T){ if (nullptr == T) return; cout << T->data << endl; PreOrderTraverse(T->lchil原创 2020-12-27 15:52:44 · 754 阅读 · 0 评论 -
排序算法之归并排序(递归方式实现)——c++
基本思想归并排序(Merging Sort)是利用归并的思想实现的排序算法。假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两合并,得到不小于n/2的最小整数个长度为2或1的有序子序列;然后两两归并,......,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。归并排序算法#include <iostream>using namespace std;void Merge(int arr[], int tm原创 2020-12-09 23:18:54 · 332 阅读 · 0 评论 -
排序算法之堆排序——c++实现
堆的概念堆是一种完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;每个结点的值都小于或等于其左右孩子结点的值,成为小顶堆。利用简单的公式描述堆的定义:大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2] 堆排序堆排序(Heap Sort)是利用堆进行排序的方法。基本思..原创 2020-12-08 23:30:45 · 275 阅读 · 0 评论 -
排序算法之希尔排序——c++实现
基本思想将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序的而不是局部有序。进一步理解:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。希尔排序算法#include <iostream>using namespace std;void shellSort(int a原创 2020-12-05 21:45:46 · 3535 阅读 · 0 评论 -
排序算法之直接插入排序——c++
基本思想直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好的有序表中,从而得到一个新的、记录数增1的有序表。直接插入排序算法#include <iostream>using namespace std;void insertSort(int arr[], int n){ int i, j, tmp; for (i = 1; i < n; i++) { if (arr[i] < arr[i - 1])原创 2020-12-05 21:09:05 · 246 阅读 · 0 评论 -
排序之简单选择排序——c++
基本思想简单选择排序法(Simple Selection Sort)是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(大于等于1且小于等于n)个记录进行交换。简单选择排序算法#include <iostream>using namespace std;void simpleSort(int arr[], int n){ int index = 0; int tmp = 0; for (int i = 0; i < n; i++)原创 2020-12-04 22:27:54 · 410 阅读 · 0 评论 -
排序之快速排序-c++
基本思想通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。快速排序算法#include <iostream>using namespace std;void qSort(int* arr, int m, int n){ int oldl = m; int oldr = n; bool bFlag = false; int tempArr = arr[oldl];原创 2020-11-26 23:08:36 · 127 阅读 · 1 评论 -
排序之冒泡排序-c++
基本思想冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是: 两两比较相邻记录关键字,如果反序则交换,直到没有反序的记录为止。冒泡排序算法#include <iostream>using namespace std;int main(){ int a[8]{ 11,2,5,23,6,8,33,12 }; for (int i = 0; i < 8; i++) { for (int j = 7; j > i; j--) { if原创 2020-11-21 21:59:22 · 1073 阅读 · 0 评论