拓扑排序算法有什么作用

您所在的位置:网站首页 拓扑排序的原理 拓扑排序算法有什么作用

拓扑排序算法有什么作用

2022-03-24 16:36| 来源: 网络整理| 查看: 265

大家好,我是bigsai。

拓扑排序,很多人都可能听说但是不了解的一种算法。不知者大多会提出这样的疑问:

这是某种排序算法?这好像是一种图论算法?图也能排序?

非线性结构在传统意义上确实不太好排序,而拓扑排序它是对有向图的顶点排成一个线性序列。并且不一定唯一。

什么是拓扑排序?

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

拓扑排序有何作用?

拓扑排序的应用其实还是蛮多的,拓扑排序在一些工程有多道工序时候可以获取一个有效的加工顺序、还有些游戏里的任务成就必须满足一个符合的拓扑排序才能解锁下一关、还有一些项目或者环境的依赖关系集……

当然上面的例子可能不够具体,离我们稍微近一点的就是课程学习上,比如你学习数据结构之前基本要学习C++或者C++这门课,因为数据结构中需要懂和会用C++的代码;学习操作系统、计算机网络之前要学习数据结构这门课,因为里面涉及到很多数据结构和算法;学习Java Web开发前要学习JavaSE和HTML这两门课;不同院校课程安排截然不同但均能很好的连接起来,就是因为安排的课程满足一个拓扑排序。

拓扑排序还是不能理解?我举个更详细的例子,学习Java系列的教程部分,可能有下面这个顺序:

ec4e533c-11e5-11ec-8fb8-12bb97331649.png

就比如学习Java系类(部分)从Java基础,到JSP/Servlet,到SSM,到SpringBoot,SpringCloud等是个循序渐进、且有前提依赖的过程。在JSP学习要首先掌握Java基础和HTML基础。学习框架要掌握JSP/Servlet和JDBC之类才行。那么,这个学习过程即构成一个拓扑序列。当然这个序列也不唯一,你可以对不关联的学科随意选择顺序(比如Html和Java可以随便先开始哪一个)。

那上述序列可以简单表示为:

这五种均为可以选择的学习方案,对课程安排可以有参考作用,这五个都是上面有向无环图(DAG)的拓扑序列,只是小的选择的策略不同(先学Java或者先学HTML不要紧,但是要满足整个顺序要求),不影响满足规则顺序!

对于拓扑排序,还有一些比较专业的名词需要铭记:

DAG:有向无环图

AOV网:数据在顶点,顶点表示活动,边表示活动的先后关系,可以理解为一种面向对象。

AOE网:数据在边上,顶点表示事件,有向边表示活动,边上的权值表示该活动持续的时间,可以理解为面向过程。

很多人不知道AOE网干啥用的,拓扑排序是解决一个工程能否顺序进行的问题,但有时还需解决工程完成需要的最短时间。而AOE经常使用在求关键路径中(这里就先不进行详细介绍内容和算法了),图片来源https://www.cnblogs.com/svod5306/p/14723338.html)。

我们今天讲的拓扑排序就是在AOV中找到不破坏图结构的序列,对于有向无环图,需要注意一下图中:若A在B前面,则不存在B在A前面的路径(不能成环)。图中两个相邻节点在拓扑序列中只需要满足前后关系而不一定需要相邻(节点只需满足相对的前后关系,所以拓扑排序并不一定唯一)。

算法分析上面简单的介绍了拓扑排序,下面详细讲讲拓扑排序的求法。

正常步骤为(方法不一定唯一):

1.从DAG图中找到一个没有前驱的顶点输出。可以遍历入度为0的节点,也可以用优先队列维护。

2.删除以这个点为起点的边。删除一条边,其指向节点的入度减1,这样为了找到下个没有前驱节点的顶点。

3.重复上述,直到最后一个顶点被输出。如果还有顶点未被输出,则说明有环!

对于上图的简单序列,可以简单描述步骤为:

step1:删除节点1(或者2)及其指向的边,将节点输出

step2:删除节点2(或者3)及其指向的边,将节点输出

step2(这里进行两步):删除节点3(或者4)及其指向的边,将节点输出,紧接着删除节点3(或者6)其指向的边,将节点输出。

step3:按照上述规则重复进行,直到所有节点都被删除。

这样就完成一次拓扑排序流程,得到一个拓扑序列,但是这个序列并不唯一,从算法执行过程中也看到有很多选择方案,具体得到结果看你算法的设计了,但只要满足DAG图中前后相对关系。

另外观察 1 2 4 3 6 5 7 8 这个序列满足我们所说的有关系的节点指向的在前面,被指向的在后面。如果完全没关系那不一定前后(例如1,2)

代码实现对于拓扑排序,如何用代码实现呢?

虽然在上面详细介绍了思路和流程,也很通俗易懂,但是实际上代码的实现还是很需要斟酌的,如何在空间和时间上能够得到较好的平衡且取得较好的效率?

首先要考虑存储,对于节点,是用邻接矩阵还是邻接表存储呢,通常拓扑排序如果使用矩阵存储都是比较稀疏的,比较浪费内存空间,这里还是使用邻接表来存储节点。

另外,如果图中节点是1,2,3,4,5,6这样的有序编号,我们可以直接用数组,但是如果遇到1,2,88,9999类似不连续跨度很大编号节点,也可以考虑用Map存储映射一下位置。

那么我们具体的代码思想为:

①新建node类,包含节点数值和它的指向节点集合(这里直接用List集合)

②初始化一个人node数组,输入/枚举节点之间关系,被指向的节点入度+1!(例如A—》C)那么C的入度+1;

③扫描所有node(这里扫描数组)。将所有入度为0的点加入一个容器栈(队列)中。

④当栈(队列)不空的时候,抛出其中任意一个node(只要入度为零可以随便选择顺序)。将node输出,并且node指向的所有节点入度减1。如果某个点的入度被减为0,那么就将它加入栈(队列)。

⑤重复上述操作,直到栈(队列)为空。

这里主要是利用栈或者队列储存入度只为0的节点,只需要初次扫描表将入度为0的放入栈(队列)中。

因为节点之间是有相关性的,一个节点若想入度为零,那么它的前驱节点点肯定在它前入度为0,拆除关联箭头将自己入度减1,在一个有向无环图中总会有大于等于1个入度为0的节点。

在具体实现上,方式是有多样的,我的这个只是一个简单的演示,效率不一定很高,大家参考一下即可。

具体实现代码为:

import java.util.ArrayDeque;

import java.util.ArrayList;

import java.util.List;

import java.util.Queue;

import java.util.Stack;

public class tuopu {

static class node

{

int value;

List《Integer》 next;

public node(int value) {

this.value=value;

next=new ArrayList《Integer》();

}

public void setnext(List《Integer》list) {

this.next=list;

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

node []nodes=new node[9];//储存节点

int a[]=new int[9];//储存入度

List《Integer》list[]=new ArrayList[10];//临时空间,为了存储指向的集合

for(int i=1;i《9;i++)

{

nodes[i]=new node(i);

list[i]=new ArrayList《Integer》();

}

initmap(nodes,list,a);

//主要流程

//Queue《node》q1=new ArrayDeque《node》();

Stack《node》s1=new Stack《node》();

for(int i=1;i《9;i++)

{

//System.out.print(nodes[i].next.size()+“ 55 ”);

//System.out.println(a[i]);

if(a[i]==0) {s1.add(nodes[i]);}

}

while(!s1.isEmpty())

{

node n1=s1.pop();//抛出输出

System.out.print(n1.value+“ ”);

List《Integer》next=n1.next;

for(int i=0;i《next.size();i++)

{

a[next.get(i)]--;//入度减一

if(a[next.get(i)]==0)//如果入度为0

{

s1.add(nodes[next.get(i)]);

}

}

}

}

private static void initmap(node[] nodes, List《Integer》[] list, int[] a) {

list[1].add(3);

nodes[1].setnext(list[1]);

a[3]++;

list[2].add(4);list[2].add(6);

nodes[2].setnext(list[2]);

a[4]++;a[6]++;

list[3].add(5);

nodes[3].setnext(list[3]);

a[5]++;

list[4].add(5);list[4].add(6);

nodes[4].setnext(list[4]);

a[5]++;a[6]++;

list[5].add(7);

nodes[5].setnext(list[5]);

a[7]++;

list[6].add(8);

nodes[6].setnext(list[6]);

a[8]++;

list[7].add(8);

nodes[7].setnext(list[7]);

a[8]++;

}

}

输出结果

2 4 6 1 3 5 7 8

当然,上面说过用栈和队列都可以!如果使用队列就会得到1 2 3 4 5 6 7 8 的拓扑序列

至于图的构造,因为没有条件可能效率并不高,算法也可能不太完美,如有优化错误还请大佬指正!

拓扑排序找环前面说到,拓扑排序需要在有向无环图中才能得到一个拓扑序列,但是如果给定一个有向图,怎么知道它是否可以形成一个拓扑序列呢?

当然是在拓扑排序算法上进行改动,我们在进行拓扑排序会删除所有入度为0的节点,但是如有有环那么删除节点个数就小于所有节点个数,在具体实现上,我们只需要在栈或者队列抛出时候通过一个计数器统计数字即可。

当然这个问题力扣207有原题可以看看自己代码是否能够ac,问题描述:

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。

在选修某些课程之前需要一些先修课程。先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。

例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。

请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。

分析上面已经给出,不过在具体实现代码的时候比较灵活,不一定非得创建node类,思路上理的清即可。

实现代码:

class Solution {

public boolean canFinish(int numCourses, int[][] prerequisites) {

int indegree[]=new int[numCourses];

List《Integer》 next[]=new ArrayList[numCourses];

for(int i=0;i《numCourses;i++){

next[i]=new ArrayList();

}

for(int i=0;i《prerequisites.length;i++) {

int preid=prerequisites[i][1];

int courseid=prerequisites[i][0];

indegree[courseid]++;//入度加一

next[preid].add(courseid);//next指向

}

Queue《Integer》queue=new ArrayDeque《》();

for(int i=0;i《numCourses;i++) {//加入入度为0的节点

if(indegree[i]==0){

queue.add(i);

}

}

int nodeNum=0;//判断删除节点数量 入度为0删除 如果删除所有那么返回true

while (!queue.isEmpty())

{

nodeNum++;

int nodeId=queue.poll();

for(int i=0;i《next[nodeId].size();i++)

{

int nodeIndex=next[nodeId].get(i);

indegree[nodeIndex]--;

if(indegree[nodeIndex]==0) {

queue.add(nodeIndex);

}

}

}

if(nodeNum==numCourses)

return true;

return false;

}

}

好了,到这里拓扑排序内容讲解完毕!

责任编辑:haq

原文标题:排个课表学会了拓扑排序!有点意思

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

扫一扫,分享给好友

复制链接分享 评论

发布评论请先 登录

相关推荐

供个人和企业使用的最佳开源低代码和无代码平台列表 低代码/无代码的主要概念并不新鲜,它可以追溯到十多年前的无代码编程 (PWCT) 和类似系统。但是,.... 的头像 算法与数据结构 发表于 03-24 14:50 • 55次 阅读 自定义进度指示器progressbutton 概述 1、描述:progressbutton是占位面积很小的自定义进度指示器。默认实现提供了一个pi.... 发表于 03-24 14:26 • 2次 阅读 使用圆形和扇区的简单进度提示或android图表小部件 方式一: 添加har包到lib文件夹内 在entry的gradle内添加如下代码 implement.... 发表于 03-24 14:22 • 3次 阅读 CNC加工中心程序代码大全 在一个程序段中只能有指令一个M指令,如果在一个程序中出现两个或两个以上的M指令时,则只有最后一个M指.... 的头像 世界先进制造技术论坛 发表于 03-24 14:15 • 53次 阅读 按钮进度条使用及代码分享 该三方开源库从github fork过来,主要将底层接口调用的实现修改成鸿蒙接口的实现,将三方库鸿蒙.... 发表于 03-24 14:13 • 6次 阅读 支持组件所有基本功能的圆形进度条 圆形的自定义ProgressBar 项目移植状态:支持组件所有基本功能 完成度:100% 调用差异:.... 发表于 03-24 14:07 • 2次 阅读 以弧线模式显示的进度条并提供信息和全面控制 以弧线模式显示您的进度条,并提供信息和全面控制。 如何导入到您的项目中 通过library生成har.... 发表于 03-24 11:35 • 4次 阅读 圆形可填充加载器安装使用案例 安装说明: 方法1:对于在示例应用程序中使用循环填充加载器模块,添加以下依赖项以生成 hap/har.... 发表于 03-24 11:29 • 4次 阅读 圆形可填充加载器安装使用案例 自学硬件的第二天就写上代码了… 妈耶妈耶!我竟然开始写c了! 这是一段点亮LED的代码,奈何我手里没有板子,所以目前还无法实现,但也依然很开心啦 因为... 发表于 03-23 20:00 • 306次 阅读 自学硬件的第二天就写上代码了… 较火的图片裁剪框架uCrop 本项目是基于开源项目uCrop进行鸿蒙化的移植和开发的,可以通过项目标签以及github地址( ht.... 发表于 03-23 13:48 • 5次 阅读 鸿蒙图片裁剪项目安装使用教程 项目介绍 项目名称:图片裁剪项目 所属系列:鸿蒙的第三方组件适配移植 功能:提供一个AbilityS.... 发表于 03-23 11:28 • 3次 阅读 华为图像服务场景动效Java示例代码 简介 场景动效服务提供基础动效和高级动效,帮助您实现图片内容高效再生产。本示例代码对华为图像服务场景.... 发表于 03-23 11:06 • 11次 阅读 用在Harmony设备上获取照片和压缩图像的开源工具库TakePhoto 介绍: TakePhoto是一个开源工具库,用于在 Harmony设备上获取照片(拍照)和压缩图像。.... 发表于 03-23 10:44 • 4次 阅读 SimpleCropView适用于鸿蒙的图像裁剪库 SimpleCropView是适用于鸿蒙的图像裁剪库。它简化了裁剪图像的代码,并提供了易于自定义的U.... 发表于 03-23 10:32 • 5次 阅读 ListContainer代码获取高度不准怎么解决? int listContainerHeight = listContainer.getHeight(); 通过这个方法获得的方法,返回的数据和实际数据不一样, 有类似... 发表于 03-23 10:19 • 192次 阅读 java实时图像与处理库教程演示 项目介绍 项目名称:cv4j 所属系列:openharmony的第三方组件适配移植 功能:CV in.... 发表于 03-23 09:19 • 11次 阅读 详解#define的奇妙用法 在 C/C++ 编程语言中,当程序被编译时,被发送到编译器,编译器将程序转换为机器语言,然后完成编译.... 的头像 STM32嵌入式开发 发表于 03-22 09:03 • 97次 阅读 如何使用 go 实现红黑树 二叉查找树也叫二叉搜索树,也叫二叉排序树,它具有以下特点:1. 如果左子树不为空,则左子树上的结点的.... 的头像 Linux爱好者 发表于 03-21 11:54 • 166次 阅读 Go语言的默认机制 不过麻烦的事情来了。我们写一个程序,就是想在别人的电脑上运行的。然而,Go语言的默认机制,会泄漏我们.... 的头像 Linux爱好者 发表于 03-21 11:50 • 194次 阅读 基于开源EasyFloat进行ohos化开发支持单页面浮窗 本项目是基于开源项目EasyFloat进行ohos化的移植和开发的,可以通过项目标签以及github.... 发表于 03-21 11:06 • 9次 阅读 测试自动化的两种方法 许多测试自动化工具提供了记录和回放功能,允许用户交互式地记录用户操作,并回放任何次数,并将实际结果与.... 的头像 汽车电子硬件设计 发表于 03-21 10:56 • 111次 阅读 与OpenHarmony相关的三场技术直播 因为突发的疫情,我们的生活按下了“慢行键”,大家现在的工作状态如何呢?anyway,希望大家都保持积.... 的头像 发烧友研习社 发表于 03-20 13:44 • 332次 阅读 占位面积很小的自定义进度指示器progressbutton 概述 1、描述:progressbutton是占位面积很小的自定义进度指示器。默认实现提供了一个pi.... 发表于 03-18 14:45 • 6次 阅读 鸿蒙java框架如何从AttrSet读取自定义属性? 鸿蒙java框架中继承DirectionalLayout,自定义属性定义在哪里,如何从AttrSet读取自定义属性? ... 发表于 03-17 15:53 • 3146次 阅读 Elasticsearch 8作为开源软件正式发布 Elasticsearch 是一个基于 Lucene 库的搜索引擎。它提供了一个分布式、支持多租户的.... 的头像 Linux爱好者 发表于 03-17 14:12 • 207次 阅读 介绍assert的使用方法 很多业务场景需要我们某一特定的时刻去做某件任务,定时任务解决的就是这种业务场景。一般来说,系统可以使.... 的头像 Linux爱好者 发表于 03-17 14:06 • 232次 阅读 如何使用 Compose 进行构建 适用于 Wear OS 的 Compose 已推出了开发者预览版,使用 Compose 构建 Wea.... 的头像 谷歌开发者 发表于 03-17 13:44 • 247次 阅读 CFI的基本概念 控制流劫持是一种危害性极大的攻击方式,攻击者能够通过它来获取目标机器的控制权,甚至进行提权操作,对目.... 的头像 Linux阅码场 发表于 03-17 13:36 • 200次 阅读 OpenHarmony应用开发为什么不首选C/C++作为应用开发语言呢 OpenHarmony本来就是C和C++开发的,支持C/C++语言环境。应用开发为什么不首选C/C++作为应用开发语言。 1、相对于其他开... 发表于 03-17 10:30 • 977次 阅读 在CPU上如何同时尝试 getrandom Jason Donenfeld 是 WireGuard 的主要开发者,同时他也是 Linux 内核随.... 的头像 Linux爱好者 发表于 03-16 17:19 • 631次 阅读 基础算法:差分数组详解 前文说前缀和主要适用的场景是原始数组不会被修改的情况下,频繁查询某个区间的累加和。 的头像 算法与数据结构 发表于 03-16 15:57 • 490次 阅读 FireEye推AWS新云安全解决方案 龙芯中科发布龙芯平台Java环境 近日,中科创达董事长赵鸿飞、执行总裁武文光和高级副总裁兼智能汽车事业群总裁常衡生应邀出席会议。会上,.... 发表于 03-16 15:08 • 741次 阅读 如何用 Markdown 来做 PPT 相信绝大多数朋友做 PPT(幻灯片 / Slides / Deck 等各种称呼了)都是用的 Powe.... 的头像 数据分析与开发 发表于 03-16 14:10 • 158次 阅读 关于指数对比度增强FPGA实现 对比度增强是个广泛的话题,前文中关于直方图均衡的方法,其实就是一种对比度增强。而对比度增强,就是提高.... 的头像 FPGA技术江湖 发表于 03-16 11:46 • 207次 阅读 解析数据结构的常用七大排序算法 为了让大家掌握多种排序方法的基本思想,本篇文章带着大家对数据结构的常用七大算法进行分析:包括直接插入.... 的头像 C语言编程学习基地 发表于 03-16 08:22 • 182次 阅读 从C 到 matlab 到 FPGA,如何实现CNN的项目 经过了前面的开胃菜,项目正式开始。一步步讲解这个模型怎么玩起来的。从C 到 matlab 到 FPG.... 的头像 FPGA攻城狮之家 发表于 03-15 17:13 • 701次 阅读 润和鸿蒙系列开发板资料总结(原理图+源代码+教程) 1、润和 HH-SCDAYU200 鸿蒙开发套件 简介:基于Rockchip RK3568,集成双核心架构GPU以及高效能NPU;板载四核6... 发表于 03-15 16:40 • 14883次 阅读 润和鸿蒙系列开发板资料总结(原理图+源代码+教程) 使用Trace View对对Kernel进行性能仿真分析 对Kernel进行性能分析需要对其进行仿真,同时还要用到Vitis Analyzer。为便于说明,我.... 的头像 TeacherGaoFPGAHub 发表于 03-15 15:30 • 247次 阅读 怎样去处理OpenHarmony执行hb命令报错的问题呢 在执行hb命令的时候报错: 重新安装环境,在安装hb的时候出现下面的问题警告: 处理方式:在openharmony 代码根目录下使用... 发表于 03-15 14:33 • 752次 阅读 assign组合逻辑和always@(*)组合逻辑的区别 1.always@后面内容是敏感变量,always@(*)里面的敏感变量为*,意思是说敏感变量由综合.... 的头像 FPGA之家 发表于 03-15 14:08 • 238次 阅读 Verilog系统函数和边沿检测 “ 本文主要分享了在Verilog设计过程中一些经验与知识点,主要包括Verilog仿真时常用的系统.... 的头像 FPGA之家 发表于 03-15 13:34 • 159次 阅读 什么是“三字母词” 在ANSI标准中,定义了“三字母词”,或者成为“三联符序列”,英文为"trigraph sequen.... 的头像 STM32嵌入式开发 发表于 03-15 09:27 • 137次 阅读 如何调用OpenHarmony系统SA服务呢 之前在HarmonyOS可以支持JAVA,Java中可以调用系统SA服务的,但是OpenHarmony只有JS/TS,这两个开发框架,如果我... 发表于 03-14 16:57 • 1046次 阅读 一种简单的OpenHarmony环境搭建方法 本文介绍一种简单的OpenHarmony环境搭建方法。 的头像 HarmonyOS官方合作社区 发表于 03-14 13:58 • 1427次 阅读 一种简单的OpenHarmony环境搭建方法 如何快速学习并精通C语言 学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通。如何以最小的代价学习并精通C语言是本文.... 的头像 嵌入式ARM 发表于 03-12 11:59 • 459次 阅读 什么是apt?怎样使用BufferKnife注入工具 安卓to鸿蒙系列:ButterKnife(一)本文是关于ButterKnife的移植的第一篇:先介绍基础知识,理解apt是什么,最终输出一个乞丐版... 发表于 03-11 15:15 • 2068次 阅读 代码和bug就是一个此消彼长、相互依赖的过程 经常听一些朋友说道:"你写的代码没有bug,那你离丢饭碗不远了",又或者代码中故意保留一些bug来增.... 的头像 硬件攻城狮 发表于 03-11 10:01 • 175次 阅读 如何实现软硬件分层 以STM32为例,打开网络上下载的例程或者是购买开发板自带的例程,都会发现应用层中会有stm32f1.... 的头像 strongerHuang 发表于 03-10 17:32 • 562次 阅读 如何在RK3288红外遥控器增加系统中已有的键值? 如何在RK3288红外遥控器增加系统中已有的键值?... 发表于 03-10 06:38 • 245次 阅读 如何单独编译RK3288模块? 如何单独编译RK3288模块? 发表于 03-10 06:15 • 154次 阅读 如何快速排查IO异常输出问题 在嵌入式开发过程中,IO 操作是不可避免的,很多时候 IO 操作很正常,但有些时候可能因为某些原因导.... 的头像 strongerHuang 发表于 03-09 17:55 • 807次 阅读 如何快速排查IO异常输出问题 C/C++在线编译器的功能 作为程序员,使用编译器是必备技能,但是从入门到放弃,基本上就是在开发环境安装、配置这一步。。。 的头像 strongerHuang 发表于 03-09 17:52 • 4046次 阅读 有效提高编译速度的方法 今天就来说说嵌入式软件开发中,常见的提高编译速度的一些操作或者方法。 的头像 strongerHuang 发表于 03-09 17:31 • 720次 阅读 采用FMDft61t133芯片点亮LED的代码 由于目前本人零时朝8bit单片机方向走所以其内容接下来也是8bit单片机。 的头像 互联网电子设计 发表于 03-09 09:19 • 1605次 阅读 采用FMDft61t133芯片点亮LED的代码 乘数智之风,超越单一视角 为世界造舟筏 女性在当下如何创造? 随着女性意识、女性购买力的不断上升,女性营销也以燎原之势在各大品牌中流行开来。三八节还没到,就有不少.... 的头像 脑极体 发表于 03-09 09:16 • 862次 阅读 python私有变量和私有方法 python私有变量和私有方法 1. 下划线妙用 在 Python 中,下划线可是非常推荐使用的符号.... 的头像 python爬虫知识分享 发表于 03-08 16:30 • 476次 阅读 无代码数字中台能否成为替代OA的存在 英国政治家切斯特菲尔德说过:“效率是做好工作的灵魂。”我想各行各业的管理者应该都体会颇深,不管是行业.... 发表于 03-04 10:06 • 20次 阅读 如何较为高效地完成多语言跨平台测试 针对软件静态测试,ISO26262标准的Part 6部分给出了具体要求说明,随着各大整车厂和供应商静.... 的头像 经纬恒润 发表于 03-03 12:39 • 399次 阅读 如何较为高效地完成多语言跨平台测试


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3