首页 > 编程语言 >算法图解(5~6)

算法图解(5~6)

时间:2024-09-05 23:25:36浏览次数:12  
标签:队列 Graph queue 算法 顶点 图解 散列 节点

散列表 | 哈希表(Hash Table)

通过散列函数将关键字(key)映射到数组中的特定位置,以便来快速查找数据。

哈希表就是c++内置散列表

散列 函数:将输入的关键字转换为整数,散列函数的质量决定了散列表的性能,好的散列函数应能均匀地分布关键字,避免冲突。

填充 | 负载因子:元素总数 / 位置总数,一旦填装因子大于0.7,就应该调整散列表的长度。

散列冲突:将无限的关键字空间映射到有限的数组索引上,不同的关键字可能映射到相同的索引位置,

冲突解决方法:

  1. 链地址法:当发生冲突时,将新元素插入到相应索引位置的链表中。
  2. 开放地址法:当发生冲突时,探测下一个空闲的位置。常见的探测方式有线性探测、二次探测和双重散列

优点:查找、插入和删除操作的平均时间复杂度很低。平均时间复杂度都是 O(1)

缺点:最坏情况下性能较差,可能退化到 O(n),尤其是在发生大量冲突时。高度依赖于良好的散列函数和较低的填充因子

空间:复杂度为 O(n)

适用场景:应用于需要快速查找的场景

图是一种数据结构,由节点和边组成,直接相连的节点,称为邻居

图可以分为以下几种类型:

  1. 无向图 (Undirected Graph):边没有方向,边连接的两个顶点之间是对称的关系。

  2. 有向图 (Directed Graph, Digraph):边有方向,表示从一个顶点指向另一个顶点的关系。

  3. 加权图 (Weighted Graph):边有权重,表示边之间的连接强度或距离等数值。

  4. 无权图 (Unweighted Graph):边没有权重,只表示顶点之间的关系。

  5. 连通图 (Connected Graph):任意两个顶点之间都有路径相连的无向图。

  6. 非连通图 (Disconnected Graph):存在至少一对顶点之间没有路径的无向图。

  7. 树 (Tree):一种特殊的连通无向图,没有环路,每两个顶点之间都有唯一的路径。

  8. 有向无环图 (Directed Acyclic Graph, DAG):一种没有环的有向图,常用于表示任务调度等依赖关系。

队列(Queue)

遵循先进先出(FIFO, First In First Out)的原则。

队列的实现:

  • 数组实现:用固定大小的数组来实现队列,可能会遇到数组空间的浪费或溢出的问题。
  • 链表实现:用链表来实现队列,可以动态分配内存,避免空间浪费。

队列的类型:

  1. 普通队列(Simple Queue):最基本的队列形式,支持入队和出队操作。
  2. 循环队列(Circular Queue):队列首尾相连,避免数组实现中的空间浪费问题。
  3. 双端队列(Deque, Double-ended Queue):允许在队列的两端进行入队和出队操作。
  4. 优先队列(Priority Queue):队列中的元素具有优先级,出队时优先级高的元素先被处理。

适用场景:按顺序处理任务的场景,如任务调度、广度优先搜索等。

BFS广度优先搜索(查找算法)

是一种图或树的遍历算法,它按照层次逐层访问节点,从起始节点开始,先访问与其直接相连的节点,再访问这些节点的邻居,依此类推,直到遍历完所有节点或找到目标节点。

广度优先搜索的应用:最短路径查找,图的连通性检查,拓扑排序,

运行时间:O(V + E)

空间复杂度为 O(V)

实例:首先将添加一个节点到队列,在将所有邻居添加到队列,每次处理队首的逻辑,知道队列为空,提前找到结果

void BFS(int start) {
    vector<bool> visited(V, false); // 创建一个访问标记数组,初始化为未访问
    queue<int> queue; // 创建一个队列

    // 将起始节点标记为已访问并入队
    visited[start] = true;
    queue.push(start);

    while (!queue.empty()) {
        // 从队列中取出一个节点
        int v = queue.front();
        queue.pop();

        // 访问该节点的所有邻居
        for (auto i : adj[v]) {
            if (!visited[i]) {
                visited[i] = true; // 标记邻居节点为已访问
                queue.push(i); // 将邻居节点入队
            }
        }
    }
}

标签:队列,Graph,queue,算法,顶点,图解,散列,节点
From: https://blog.csdn.net/sengyongan/article/details/141940411

相关文章

  • php 实现推荐算法
            在PHP中实现推荐算法的应用场景通常包括电商、社交媒体、内容平台等。推荐算法可以帮助用户找到与其兴趣相关的内容,提高用户体验和平台黏性。以下是几种常见的推荐算法及其PHP实现方式:1.基于协同过滤的推荐算法协同过滤(CollaborativeFiltering)是一种常见的......
  • 旅行商问题 | Matlab基于混合粒子群算法GA-PSO的旅行商问题TSP
    目录效果一览基本介绍建模步骤程序设计参考资料效果一览基本介绍混合粒子群算法GA-PSO是一种结合了遗传算法(GeneticAlgorithm,GA)和粒子群优化算法(ParticleSwarmOptimization,PSO)的优化算法。在解决旅行商问题(TravelingSalesmanProblem,TSP)时,这种混合算法可......
  • codetop算法分类
    以下是按照常见算法标签将题目进行归类的列表:1.动态规划10.正则表达式匹配1143.最长公共子序列115.不同的子序列120.三角形最小路径和121.买卖股票的最佳时机123.买卖股票的最佳时机III131.分割回文串152.乘积最大子数组188.买卖股票的最佳时机IV198.打家......
  • 学习算法需要数学知识吗?
    目录算法与数学:看似不可分割的关系常见算法中的数学元素案例分析:不需要高深数学知识的算法1.二分查找2.深度优先搜索(DFS)3.动态规划:斐波那契数列如何在有限的数学背景下学习算法1.专注于算法的逻辑和过程2.可视化算法流程3.从简单的实现开始,逐步优化4.学......
  • 基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
    1.程序功能描述   奇异谱分析(SingularSpectrumAnalysis,简称SSA)是一种强大的非线性和非参数时间序列分析方法。该方法基于奇异值分解(SVD)和轨迹矩阵的概念,用于提取时间序列中的趋势、周期性和噪声成分。在本课题中,通过SSA算法,从强干扰序列中提取其趋势线。2.测试软件版本......
  • 基于鱼群算法的散热片形状优化matlab仿真
    1.课题概述使用浴盆曲线进行空隙外形的模拟,然后通过优化,计算得到最优的浴盆曲线的各个参数,从而计算出最优的R值。浴盆曲线函数如下所示:从上面的仿真结果可知,直接对目标函数进行优化,仿真速度非常慢,这里我们使用浴缸曲线结合鱼群算法进行优化。从而得到最佳的孔隙度值和H对应......
  • 基于鱼群算法的散热片形状优化matlab仿真
    1.课题概述        使用浴盆曲线进行空隙外形的模拟,然后通过优化,计算得到最优的浴盆曲线的各个参数,从而计算出最优的R值。浴盆曲线函数如下所示:          从上面的仿真结果可知,直接对目标函数进行优化,仿真速度非常慢,这里我们使用浴缸曲线结合鱼群算法进......
  • 基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
    1.程序功能描述奇异谱分析(SingularSpectrumAnalysis,简称SSA)是一种强大的非线性和非参数时间序列分析方法。该方法基于奇异值分解(SVD)和轨迹矩阵的概念,用于提取时间序列中的趋势、周期性和噪声成分。在本课题中,通过SSA算法,从强干扰序列中提取其趋势线。2.测试软件版本以及......
  • 构建STM32智能平衡车项目:PID控制算法与蓝牙通信技术
    一、项目概述项目目标和用途本项目旨在设计和实现一款基于STM32单片机的平衡车。平衡车是一种新型的个人交通工具,广泛应用于短途出行、休闲娱乐等场景。通过本项目,我们希望能够实现一款具备良好稳定性和操控性的平衡车,能够在不同的地形上自如行驶。解决的问题和带来的价......
  • 文心一言 VS 讯飞星火 VS chatgpt (340)-- 算法导论23.1 9题
    九、设为的一棵最小生成树,设为的一个子集。设为由所诱导的的子图,设为由诱导的的子图。证明:如果是连通的,则是的一棵最小生成树。如果要写代码,请用go语言。文心一言:要证明如果是连通的,则是的一棵最小生成树,我们可以按照以下步骤进行:证明步骤定义与前提:是一个图,其中是顶点集,是边集......