lua实现拓扑排序(队列➕入度)

1.实现思路:首先使用lua唯一的数据结构table实现图,随后对图中每个节点进行初始化(算出每个节点的入度),把入度为0的节点放入到queue队列中。之后设置一个临时变量current等于每次queue pop出的结果,并把这个结果存储在result表中,每次pop一次都要进行一次遍历(因为可能会出现新的入度为0的节点)并把这些新出现的节点加入到queue中去,直到queue的大小为0(有点类似于二叉树的层序遍历)。

2.代码实现:

local graph = {
    [1] = {2},
    [2] = {4},
    [3] = {4,5},
    [4] = {5},
    [5] = {6,7},
    [6] = {7},
    [7] = {},
}

local function topologicalSort(graph)
    local indegree = {}--store degree 
    local result = {}--store the finnal result 
    
    --first initialize the indegree 
    for node,neighbors in pairs(graph) do
        indegree[node] = indegree[node] or 0 
        for _,neighbor in ipairs(neighbors) do
            indegree[neighbor] = (indegree[neighbor] or 0) + 1 
                                       -- 这里是怕出现nil的情况
        end
    end
    
    local queue = {}
    
    for node,degree in pairs(indegree) do
        if degree == 0 then
            table.insert(queue,node)
        end
    end
    
    while #queue >0 do
        local current = table.remove(queue,1)
        table.insert(result,current)
        
        --reinitialize the indegree 
        for _,neighbor in ipairs(graph[current] or {}) do
            indegree[neighbor] = indegree[neighbor] -1
            if indegree[neighbor] ==0 then
                table.insert(queue,neighbor)
            end
        end
    end
    
    if #result == table.maxn(graph) then
        return result
        else
            return nil
    end
end
    local result = topologicalSort(graph)
    if result then
        print("the answer :",table.concat(result,"->"))
    else
        print("the circle exsit")
    end

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP(全称:PHP: Hypertext Preprocessor)是一种广泛应用于Web开发的开源脚本语言,以其易学易用、高效灵活的特性深受广大开发者喜爱。诞生于1995年,由Rasmus Lerdorf创建,PHP最初用于简单的网页动态处理,如今已发展成为一款功能齐全、生态丰富的全栈开发工具,支持从网站前端交互到后端业务逻辑、数据库操作乃至API接口开发的全方位需求。 PHP的一大特点在于其与HTML的深度融合,可以直接嵌入到HTML文档中,通过特殊的起始标签“<?php”和结束标签“?>”界定PHP代码段。这种特性使得开发者能够轻松地在静态网页中插入动态内容,实现数据渲染、条件判断、循环处理等功能,极大地简化了Web开发流程。同时,PHP也支持纯脚本文件编写,适用于构建复杂的后台逻辑。 PHP语法简洁明了,借鉴了C、Perl等语言的特点,易于理解和学习,对于初学者友好。它支持面向过程、面向对象以及函数式编程范式,可根据项目需求和开发者喜好灵活选择。PHP内置丰富的数据类型(如整型、浮点型、字符串、数组、对象等),并提供了大量的预定义函数,涵盖了字符串操作、数学运算、文件系统处理、日期时间处理、数据库连接等常见功能,极大提高了开发效率。 在Web开发中,PHP与MySQL数据库的搭配尤为经典。PHP提供mysqli、PDO等数据库扩展,能够无缝连接MySQL,进行SQL查询、数据插入、更新、删除等操作,实现动态网站的数据持久化。此外,PHP还支持与其他数据库系统的连接,如PostgreSQL、SQLite、Oracle等,具有良好的数据库兼容性。 PHP拥有庞大的开发者社区和丰富的开源项目,如内容管理系统(CMS)WordPress、Drupal、Joomla,框架 Laravel、Symfony、CodeIgniter等,为开发者提供了丰富的代码资源和快速开发的便利。同时,官方维护的PHP文档详尽全面,社区活跃的技术论坛和问答网站为学习和解决问题提供了有力支持。 在性能优化方面,PHP支持 opcode 缓存(如APC、OpCache)以加速脚本执行,可通过配置调整、代码优化、使用缓存技术等手段提升应用性能。近年来,PHP持续进行性能改进与新特性的引入,如PHP 7系列版本在速度上有了显著提升,新增了类型声明、标量类型提示、null合并运算符等语法特性,进一步提升了开发效率和代码质量。 总的来说,PHP作为一种成熟的Web开发语言,凭借其易用性、灵活性、丰富的库与框架支持、强大的社区生态以及持续的性能优化,成为了构建各类动态网站、Web应用及API服务的理想选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值