关于namespace的使用
题目:

基于宽度优先搜索的拓扑排序
思路:
这个问题相当查找有向图中是否存在环。逐个删除入度为0的节点,当删除的节点数量等于输入的所有节点数量时,判定不存在环。
拓扑排序最好使用邻接链表存储邻接关系,而非使用邻接矩阵。因为邻接链表在能够非常直接查找到邻接节点,查找操作耗时O(m+n),而邻接矩阵需要进行遍历才能查找到邻接节点,查找操作耗时O(n^2)。其中n为节点数量,m为边的数量。
本算法的时间复杂度和空间复杂度都比较大,原因在于创建了邻接矩阵存储邻接关系。导致在查找邻接关系的时候,需要进行遍历操作,时间复杂度为O(n^2)。
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
if(prerequisites.size() == )
return true;
vector< vector<int> > mat( numCourses, vector<int>(numCourses,) );
vector<int> numR(numCourses, );
vector<int> stack(numCourses, );
vector<int> tIn;
int top = , count = ;
for(int i = ; i < prerequisites.size(); ++i) {
tIn = prerequisites[i];
mat[tIn[]][tIn[]] = ;
numR[tIn[]] += ;
}
for(int j = ; j < numCourses; ++j) {
if(numR[j] == ) {
stack[top++] = j;
}
}
while(top > ) {
int gettop = stack[--top];
count += ;
for(int k = ; k < numCourses; ++k) {
if(mat[gettop][k] == ) {
numR[k] -= ;
if(numR[k] == )
stack[top++] = k;
}
}
}
if(count == numCourses )
return true;
else
return false;
}
};
对上述算法进行改进。将邻接矩阵换成邻接链表。时间复杂度为O(m+n),耗时大大缩小。
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
if(prerequisites.size() == )
return true;
vector< vector<int> > mat(numCourses);
vector<int> numR(numCourses, );
vector<int> stack(numCourses, );
vector<int> tIn;
int top = , count = ;
for(int i = ; i < prerequisites.size(); ++i) {
tIn = prerequisites[i];
mat[tIn[]].push_back(tIn[]);
numR[tIn[]] += ;
}
for(int j = ; j < numCourses; ++j) {
if(numR[j] == ) {
stack[top++] = j;
}
}
while(top > ) {
int gettop = stack[--top];
count += ;
for(int k = ; k < mat[gettop].size(); ++k) {
numR[mat[gettop][k]] -= ;
if(numR[mat[gettop][k]] == )
stack[top++] = mat[gettop][k];
}
}
if(count == numCourses )
return true;
else
return false;
}
};
基于深度优先搜索的拓扑排序
时间复杂度:排序过程为O(n+m),其中n为节点数量,m为边数量。构建邻接链表为O(m)。
空间复杂度:邻接链表占据空间为O(m);标识数组占据空间为O(n);递归过程的栈内存最大为O(n),此时拓扑序列为一条链。
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
if(prerequisites.size() == )
return true;
vector< vector<int> > mat(numCourses);
vector<int> flag(numCourses, );
vector<int> tIn;
for(int i = ; i < prerequisites.size(); ++i) {
tIn = prerequisites[i];
mat[tIn[]].push_back(tIn[]);
}
bool ans = true;
for(int i = ; i < numCourses; ++i) {
ans = ans&&dfsF(i, flag, mat); // 每一条路线不允许存在回路,所以是“&&”逻辑
}
return ans;
}
bool dfsF(int i, vector<int>& flag, const vector<vector<int> >& matC){
if(flag[i] == )
return true;
if(flag[i] == -)
return false;
flag[i] = -;
for(int j = ; j < matC[i].size(); ++j) {
if(dfsF(matC[i][j], flag, matC))
continue;
else
return false;
}
flag[i] = ;
return true;
}
};
关于namespace的使用的更多相关文章
- 理解Docker(3):Docker 使用 Linux namespace 隔离容器的运行环境
本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
- C++ namespace
namespace, 命名空间, 用于解决命名冲突的问题. Python中的package/module, Javascript中的object, Java中的package都具有这样的功能. 如何使 ...
- C++ 之namespace常见用法
一.背景 需要使用Visual studio的C++,此篇对namespace的常用用法做个记录. 二.正文 namespace通常用来给类或者函数做个区间定义,以使编译器能准确定位到适合的类或者函数 ...
- using namespace std 和 using std::cin
相较using std::cin使用using namespace std不会使得程序的效率变低,或者稳定性降低,只是这样作会将很多的名字引入程序,使得程序员使用的名字集合变小,容易引起命名冲突. 在 ...
- Why Namespace? - 每天5分钟玩转 OpenStack(102)
上一节我们讨论了 Neutron 将虚拟 router 放置到 namespace 中实现了不同 subnet 之间的路由.今天探讨为什么要用 namespace 封装 router? 回顾一下前面的 ...
- struts2中错误There is no Action mapped for namespace [/] and action name [] associated with context path
1 There is no Action mapped for namespace [/] and action name [] associated with context path [/Stru ...
- PHP 命名空间(namespace)
PHP 命名空间(namespace) PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物. 不过在PHP当中还是有着相当重要的意义 ...
- AMD and CMD are dead之Why Namespace?
缘由 当我看到_Franky兄的微博的时候: 我觉得我有必要出来详细说说KMDjs到底有什么本质上的优势了,连教主_Franky.貘吃馍香都不能理解他的好处,那么可想而知,在前端圈.或是全端圈.或是I ...
- 使用mvc时,在视图view中使用强类型视图,在web.config文件中添加命名空间namespace的引用不起作用,解决方法
这是view中的model代码: @model t_user_info 这是web.config配置文件只的代码: <namespaces> <add namespace=" ...
- C、C++: 引用、指针、实例、内存模型、namespace
// HelloWorld.cpp : Defines the entry point for the console application. // #include "stdafx.h& ...
随机推荐
- scala quick check
Scala 特性 面向对象特性 函数式编程 Scala也是一种函数式语言,其函数也能当成值来使用.Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化.Sca ...
- Python之路PythonNet,第四篇,网络4
pythonnet 网络4 select 支持水平触发 poll 支持水平触发 epoll epoll 也是一种IO多路复用的方式,效率比select和poll 要高一点: epol ...
- JAVA基础部分复习(四、抽象类与接口)
抽象类与接口的定义: package cn.review.day02; /** * 抽象类 * 定义: * 1.抽象类使用关键字abstract修饰 * 2.抽象方法必须定义在抽象类中,抽象方法没有方 ...
- MyBatis #{} 取值注意事项
正确写法#{key} 错误写法#{key } #{}中不能加空格,不然会报错
- 20155208 2016-2017-2 《Java程序设计》课程总结
20155208 2016-2017-2 <Java程序设计>课程总结 一.每周作业及实验报告链接汇总 一路无悔 感恩有你(预备作业一):浅谈师生关系及对java学习的期望. 精益求精,从 ...
- vue 移动端的一些ui
https://www.jianshu.com/p/b79b3b721cd5 Vant. YDUI. Vonic. buefy (bluma的ui) Vux
- putty 、xshell的使用 和 putty 、xshell、 shell 间免密登陆
相关软件的使用: ######################################################################### 以上是相关软件的使用! 以下是免密 ...
- 简单总结scrapy使用方法
应课程需要写了几天爬虫,一开始使用requests+bs4的技术路线,但是速度不是很理想而且不能暂停,通过查阅资料,发现scrapy正是我需要的 做一下简短的记录: 首先应该毫不犹豫的scrapy s ...
- 【javaScript】数组的相关操作
数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限,是长 ...
- centos7配置openldap服务器
参考链接 https://www.cnblogs.com/bigbrotherer/p/7251372.html 上面这篇参考文件在最后登录是有问题的 vi /etc/openldap/sldap.c ...