当前位置: 首页 > wzjs >正文

公司网站模板源码中企动力全球邮企业邮箱

公司网站模板源码,中企动力全球邮企业邮箱,wordpress注册页面,wordpress安装主题失败最近在做插件开发时,需要处理插件启动的依赖顺序,发现基于Kahn算法的拓扑排序,可以解决插件开发中的依赖顺序问题。例如针对依赖结构(如 "B":{"A"}, "C":{"A","B"}, "D&q…

最近在做插件开发时,需要处理插件启动的依赖顺序,发现基于Kahn算法的拓扑排序,可以解决插件开发中的依赖顺序问题。例如针对依赖结构(如 "B":{"A"}, "C":{"A","B"}, "D":{"A","B","C"}),可以设计兼顾数据表示入度计算环检测 的Kahn 算法接口。以下是分步设计与实现建议:


一、数据结构设计

1. 输入格式

采用 unordered_map<string, set<string>> 表示依赖关系:

  • :当前节点(如 "B"
  • :该节点依赖的父节点集合(如 {"A"}
std::unordered_map<std::string, std::set<std::string>> graph = {{"B", {"A"}},{"C", {"A", "B"}},{"D", {"A", "B", "C"}}
};
2. 内部数据结构
  • 入度表 (indegree):记录每个节点的入度(依赖数),类型为 unordered_map<string, int>
  • 邻接表 (adjacency_list):将输入转换为邻接关系,类型为 unordered_map<string, vector<string>>,存储节点到其子节点的映射(与输入方向相反)。

二、接口函数设计

1. 拓扑排序函数
std::vector<std::string> kahnTopologicalSort(const std::unordered_map<std::string, std::set<std::string>>& dependencies
);
2. 辅助步骤
  • 初始化邻接表和入度表
    遍历输入 dependencies,构建邻接表和入度表:

    std::unordered_map<std::string, std::vector<std::string>> adj;
    std::unordered_map<std::string, int> indegree;for (const auto& [node, parents] : dependencies) {for (const auto& parent : parents) {adj[parent].push_back(node); // 父节点 → 子节点indegree[node]++;            // 子节点入度增加}// 初始化无依赖的节点(入度为0)if (!indegree.count(node)) indegree[node] = 0;
    }
    
  • 队列初始化
    将入度为0的节点加入队列:

    std::queue<std::string> q;
    for (const auto& [node, degree] : indegree) {if (degree == 0) q.push(node);
    }
    
  • Kahn 核心逻辑
    依次处理队列中的节点,更新子节点入度:

    std::vector<std::string> result;
    while (!q.empty()) {auto u = q.front(); q.pop();result.push_back(u);for (const auto& v : adj[u]) {if (--indegree[v] == 0) q.push(v);}
    }
    
  • 环检测
    若结果节点数 < 总节点数,说明存在环:

    if (result.size() != indegree.size()) {throw std::runtime_error("Cycle detected!");
    }
    

三、完整代码示例

#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
#include <set>
#include <stdexcept>std::vector<std::string> kahnTopologicalSort(const std::unordered_map<std::string, std::set<std::string>>& dependencies) {// 构建邻接表和入度表std::unordered_map<std::string, std::vector<std::string>> adj;std::unordered_map<std::string, int> indegree;// 初始化入度表(确保所有节点存在)for (const auto& [node, _] : dependencies) {indegree[node] = 0;}// 填充邻接表和入度for (const auto& [node, parents] : dependencies) {for (const auto& parent : parents) {adj[parent].push_back(node);indegree[node]++;}}// 队列初始化(入度为0的节点)std::queue<std::string> q;for (const auto& [node, deg] : indegree) {if (deg == 0) q.push(node);}// 拓扑排序std::vector<std::string> result;while (!q.empty()) {auto u = q.front(); q.pop();result.push_back(u);for (const auto& v : adj[u]) {if (--indegree[v] == 0) q.push(v);}}// 环检测if (result.size() != indegree.size()) {throw std::runtime_error("Cycle detected in dependencies!");}return result;
}int main() {std::unordered_map<std::string, std::set<std::string>> graph = {{"B", {"A"}},{"C", {"A", "B"}},{"D", {"A", "B", "C"}}};try {auto order = kahnTopologicalSort(graph);for (const auto& node : order) {std::cout << node << " ";}// 输出:A B C D(或其他合法顺序)} catch (const std::exception& e) {std::cerr << e.what() << std::endl;}return 0;
}

四、接口设计要点总结

组件作用实现方式
输入格式描述节点依赖关系unordered_map<string, set<string>>(节点 → 依赖集合)
邻接表 (adj)快速访问子节点unordered_map<string, vector<string>>(父节点 → 子节点列表)
入度表 (indegree)动态追踪依赖数量unordered_map<string, int>(节点 → 当前入度)
队列 (q)管理待处理的零入度节点std::queue
环检测确保依赖无循环结果长度 ≠ 节点总数时抛出异常

五、扩展优化建议

  1. 并行化处理
    当同一层级有多个入度为0的节点时(如 "A""B" 无依赖关系),可用线程池并行处理子节点更新。
  2. 动态更新支持
    若依赖关系实时变化,可单独封装 updateDependency() 函数,局部调整入度表而非全图重建。
  3. 字典序输出
    若需按节点名字母序输出,将队列 queue 替换为优先队列 priority_queue,但会牺牲部分时间复杂度(O(log n) 入队)。

此设计确保接口简洁且可处理复杂依赖,同时通过异常机制保障鲁棒性。实际应用中可结合具体场景选择优化方向。

http://www.dtcms.com/wzjs/572438.html

相关文章:

  • 长沙 外贸网站建设公司价格郴州网站运营公司
  • 个人网站做百度推广wordpress登陆小工具
  • 洛阳网站开发培训ie10网站后台无法编辑
  • 长沙经开区建管站哪个网站可以专门做超链接
  • 企业建设网站需注意哪些内容用discuz可以做视频网站吗
  • 知识付费网站搭建个人免费推广网站
  • 网站点网站主题模板下载安装
  • 做网站宣传图的网站网站设计应该考虑的重要因素
  • 新手做网站看什么书建视频网站需要多少钱
  • 外贸建站seo数码产品简约大气网站设计
  • 网站建设流程有几个阶段网站安全建设思考
  • 东坑网站建设网站备案 太烦
  • 苏州建设建设信息网站网站制作难点
  • 网站怎么做域名解析网站开发设计的技术路线
  • 优秀网站建设服务百度后台登录
  • 泰兴做网站电话网站模板减肥
  • 湖南视频网站建设wordpress替换本地字体
  • 用vs2010做免费网站模板中山站群网站建设
  • 国外域名网站推荐河北邢台做移动网站
  • 做网站字体用什么格式为什么只有建设网站打不开
  • qq空间关闭申请网站wordpress环境包
  • 网络营销中自建网站dedecms搭建购物网站
  • 网站运营编辑做什么的做设计有哪些地图网站
  • 哪家网站建设好营销软文范例500
  • ps可以在哪个网站上做兼职无锡企业网站建设报价
  • 网站建设视频l网站后台公告id修改
  • 石油网页设计与网站建设怎么样用手机做网站关键词
  • 网站链接分析工具个人网站建设研究意义
  • 做游戏ppt下载网站wordpress用户创建页面
  • 电商型网站是否是趋势wordpress 二级导航制作