
数据结构和算法
文章平均质量分 82
数据结构和算法C++实现
彭存福
软件研发
展开
-
简述 Bloom Filter,及它的使用场景是什么
Bloom Filter(布隆过滤器)是一种空间效率非常高的概率型数据结构,它可以判断一个元素是否在一个集合中。快速判断:可以以常数时间复杂度O(k)判断一个元素是否在集合中,其中k是哈希函数的数量。可能会误判:对于一个不在集合中的元素,Bloom Filter 可能误判它在集合中(即产生“假阳性”),但绝不会产生“假阴性”。不支持删除:标准的 Bloom Filter 只能添加元素,不能删除元素,但有一些扩展可以支持删除。原创 2025-01-23 22:10:19 · 888 阅读 · 0 评论 -
迷宫求解与路径规划
本篇文章实现了深度优先搜索(DFS)和广度优先搜索(BFS)两种经典的迷宫求解算法,并通过 C++ 代码实现了迷宫的路径规划。在实际应用中,DFS 通常用于寻找路径的深度探索,而 BFS 更适用于寻找最短路径的场景。原创 2025-01-23 22:12:37 · 783 阅读 · 0 评论 -
C++ 数据结构图的定义与实现:链表实现
图(Graph)是一种重要的数据结构,用于表示对象之间的关系。在计算机科学中,图广泛应用于各类问题的解决,比如网络路由、社交网络、推荐系统、地图路径规划等。本篇博客将详细介绍图的定义、常见类型,以及基于 C++ 和链表的实现方式。文章将通过代码讲解和示例,帮助你深入理解图数据结构的设计和使用。我们首先定义链表节点类,该类表示邻接表中的一个节点,其中存储相邻顶点的索引和边的权重。然后定义Graph类,包含图的结构和基本操作。// 定义邻接表中的节点public:int dest;// 目标顶点。原创 2025-01-22 20:56:36 · 885 阅读 · 0 评论 -
队列(Queue)与双端队列(Deque)
队列(Queue)和双端队列(Deque)是常见的数据结构,主要用于顺序存储和操作数据。队列遵循“先进先出”(FIFO,First In First Out)的原则,而双端队列允许在队列的两端进行插入和删除操作。在 C++ 中,队列和双端队列可以通过链表来实现。下面是基于链表的队列和双端队列的实现示例。队列遵循先进先出的原则,常用的操作有:代码说明节点定义(Node): 结构体定义了队列的每个节点。每个节点包含一个 字段用于存储数据,还有一个指针 指向下一个节点。队列类(Queue):原创 2025-01-21 16:51:55 · 822 阅读 · 0 评论 -
赫夫曼树与赫夫曼编码详解(C++实现)
赫夫曼树(Huffman Tree)是一种最优二叉树,它广泛应用于数据压缩领域,比如文件压缩、通信系统等。赫夫曼编码是一种前缀编码,用赫夫曼树的左右路径(0 表示左,1 表示右)生成每个字符的二进制编码。以下代码实现赫夫曼树的构建与赫夫曼编码。是从根节点到该叶节点的路径长度。是第 ii 个叶节点的权值,原创 2025-01-21 17:02:41 · 402 阅读 · 0 评论 -
树和二叉树知识点总结
树是一种非线性数据结构,它由一个根节点和若干子树构成。节点的度:一个节点的子节点个数。树的深度:从根节点到某一节点的最长路径上的节点总数。树的高度:树的最大深度。满二叉树:所有叶子节点都在同一层,且每个非叶子节点都有两个子节点。完全二叉树:除最后一层外,其它层节点数达到最大,且最后一层从左到右连续排列。// 节点类定义int data;// 数据域// 左子节点// 右子节点// 构造函数。原创 2025-01-21 16:55:39 · 132 阅读 · 0 评论 -
迪杰斯特拉算法的C++实现
迪杰斯特拉算法是一种高效的算法,能够在带权无向图中找到源点到其他所有顶点的最短路径。通过使用优先队列(最小堆),可以有效地选择当前最短的未处理节点,保证每次更新最短路径的操作都能以最小的代价完成。该算法适用于图中的所有边权为非负数的情况。原创 2025-01-20 15:46:23 · 900 阅读 · 0 评论 -
克鲁斯卡尔算法的C++实现
克鲁斯卡尔算法是一种基于边的排序来构建最小生成树的算法,适用于稀疏图的最小生成树求解。它的核心优势在于每次都选择最小的边并检查是否形成环,确保最终得到的生成树是最优的。原创 2025-01-20 15:47:07 · 712 阅读 · 0 评论 -
基于链表实现队列的 C++ 实现
为了实现队列,我们需要一个基本的单链表结构来存储队列中的元素。每个节点都包含一个数据部分和一个指向下一个节点的指针。我们可以通过定义一个Nodeintdata;//存储队列元素的值Node*next;//指向下一个节点的指针//构造函数,初始化数据和指针data:存储数据的值。next:指向下一个节点的指针。在实现队列时,我们需要定义一个类来表示队列的行为。该类应当包含对队列的常见操作,例如入队、出队、查看队头元素等。原创 2025-01-20 15:47:39 · 479 阅读 · 0 评论 -
字符串匹配算法之暴力匹配、KMP算法、BM算法
字符串匹配问题的关键是如何在最短的时间内找到模式字符串在文本中的出现位置。不同的匹配算法有不同的时间复杂度和适用场景。最直观的思路是通过逐字符比较来查找匹配,但这可能导致效率低下。因此,许多优化过的字符串匹配算法应运而生。我们将在本文中介绍三种经典的字符串匹配算法:BF算法、BM算法和KMP算法。字符串匹配是计算机科学中一个基础且重要的问题,解决该问题的算法多种多样。本文介绍了三种经典的字符串匹配算法——BF算法、BM算法和KMP算法。BF算法:简单直观,适合小规模匹配。BM算法。原创 2025-01-19 13:45:30 · 913 阅读 · 0 评论 -
基于链表实现队列的 C++ 实现
为了实现队列,我们需要一个基本的单链表结构来存储队列中的元素。每个节点都包含一个数据部分和一个指向下一个节点的指针。我们可以通过定义一个Nodeintdata;//存储队列元素的值Node*next;//指向下一个节点的指针//构造函数,初始化数据和指针data:存储数据的值。next:指向下一个节点的指针。在实现队列时,我们需要定义一个类来表示队列的行为。该类应当包含对队列的常见操作,例如入队、出队、查看队头元素等。原创 2025-01-19 13:40:20 · 712 阅读 · 0 评论 -
常见算法思想
算法是解决特定问题的一组规则或步骤,它是计算机科学的核心内容之一。通过算法思想,我们可以将复杂的问题分解成多个小问题,从而逐步解决。掌握常见的算法思想,不仅能帮助我们高效解决问题,还能在面临新的问题时,快速选择合适的策略进行求解。暴力穷举是一种简单而直接的算法思想,它通过枚举所有可能的解,逐个检查是否满足问题的条件。暴力算法不考虑优化,通常是最简单的实现方式,但在处理大规模数据时效率较低。递归是一种通过将问题分解为更小的子问题来解决问题的方法。原创 2025-01-19 13:34:25 · 658 阅读 · 0 评论 -
C++ 实现链表
链表中的每个节点包含数据和指向下一个节点的指针。//定义节点数据类型为int//数据域//指向下一个节点的指针在上述定义中,可以根据实际需求替换为任何类型,例如intfloatstring等。链表是一种常见的动态数据结构,适用于需要频繁插入和删除操作的场景。通过使用不同类型的链表(如单向链表、双向链表、循环链表等),我们可以灵活应对各种需求。本文介绍了如何使用C++实现单向链表,并提供了常用操作的代码实现。原创 2025-01-19 13:21:08 · 449 阅读 · 0 评论 -
8种查找算法详解
跳跃查找是一种通过跳跃一定步长来缩小查找范围的查找算法。通过跳跃一定的步长(通常是数组长度的平方根),减少查找次数。它从数据集合的第一个元素开始,逐个检查每个元素,直到找到目标元素或遍历完所有元素。通过比较目标值与中间元素的大小,逐步缩小查找范围,直到找到目标元素。插值查找类似于二分查找,但它基于线性插值的思想来估计目标元素的可能位置。分块查找通过将数据划分为多个块,并在每个块内顺序查找目标元素。它是二分查找的变种,适用于有序数组。哈希查找通过哈希函数将元素映射到哈希表的索引位置,从而实现常数时间的查找。原创 2025-01-19 13:31:02 · 382 阅读 · 0 评论 -
10种排序算法详解及其代码实现
排序算法是计算机科学中的经典算法问题之一。排序算法根据不同的排序原理和实现方式有着不同的时间复杂度、空间复杂度和适用场景。以下是常见的10种排序算法的详解和代码实现,涵盖了从简单的交换排序到更高效的归并排序、快速排序等算法。原创 2025-01-19 13:27:39 · 990 阅读 · 0 评论