我正在尝试重现本文中进行的实验,测量算法在DIMACS Vertex-Coloring基准图上的性能,可在此处找到.
这些图是DIMACS标准格式,我想将它们解析为C++ Boost Graph Library格式,因此我可以在它们上运行我的算法.
我尝试使用现有的Boost DIMACS函数解析它们,但是关于它们的文档相当稀疏,所以我不清楚如何使用这些函数.当我将图形打印到Graphviz时,结果似乎与DIMACS文件不匹配.
我在想:
使用Boost解析函数我做错了什么?(见下面的例子)
是否有更好的或替代的C++库可以轻松解析DIMACS标准图形格式?
这是我尝试解析和打印图形:
#include <cstdlib>
#include <iostream>
#include <boost/property_map/property_map.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
#include <boost/graph/dimacs.hpp>
#include <fstream>
using namespace boost::graph;
typedef boost::adjacency_list < boost::vecS, boost::vecS, boost::undirectedS > Graph;
typedef typename boost::graph_traits<Graph>::edge_descriptor Edge;
typedef typename boost::graph_traits<Graph>::vertex_descriptor Vertex;
int main()
{
std::ifstream inGraphFile;
inGraphFile.open("myciel4.col");
dimacs_basic_reader reader(inGraphFile, false);
dimacs_basic_reader end;
dimacs_edge_iterator<dimacs_basic_reader> dimacsStart(reader);
dimacs_edge_iterator<dimacs_basic_reader> endIter(end);
Graph g2(dimacsStart, endIter, reader.n_vertices());
boost::write_graphviz(std::cout, g2);
}
Run Code Online (Sandbox Code Playgroud) 我现在正在开发一个处理一些指数时间算法的程序。正因为如此,我的程序的一个主循环被多次运行,我试图尽可能地优化它。
分析表明,大部分时间都花在了 的查找和哈希计算上std::unordered_map。
我很好奇:
有没有办法缓存键的哈希值std::unordered_map,然后将其作为参数提供给稍后插入?
有没有一种方法可以在单个操作中执行以下操作:给定一个键和值{x,y},检查键x是否在地图中,如果不在,则插入并返回{x,y},否则返回地图中已有的{x,z}任何z内容。
我现在正在做这样的事情,但效率低下,因为我必须计算密钥的散列并检查它是否在地图中。但是如果它不在地图中,我会做一个完全独立的插入操作。理论上,检查它是否存在于地图中应该可以找到如果插入它会在地图中的位置。
std::map如果可以减少此操作的时间,我愿意尝试其他数据结构,例如Boost 或其他数据结构。
作为一种学习经验,我试图在Agda中使用延续传递方式实现经过验证的正则表达式匹配器,基于本文提出的方法.
我有一个像这样定义的正则表达式的类型:
data RE : Set where
? : RE
? : RE
Lit : Char -> RE
_+_ : RE -> RE -> RE
_·_ : RE -> RE -> RE
_* : RE -> RE
Run Code Online (Sandbox Code Playgroud)
还有一个类型,用于证明字符串与RE匹配,如下所示:
data REMatch : List Char -> RE -> Set where
EmptyMatch : REMatch [] ?
LitMatch : (c : Char) -> REMatch (c ? []) (Lit c)
...
ConcatMatch :
(s1 : List Char) (s2 : List Char ) (r1 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Decidable Equality来比较Agda中的两个Nats向量.我尝试打开Vector Equality模块,将Nat DecSetoid作为参数传递,如下所示:
open import Data.Nat
open import Data.Vec
open import Relation.Binary.PropositionalEquality
import Data.Vec.Equality
myFunction : {n : ?} -> Vec ? n -> Vec ? n -> ?
myFunction v1 v2
with v1 Data.Vec.Equality.DecidableEquality.? v2
... | _ = {!!}
where
open Data.Vec.Equality.DecidableEquality (Relation.Binary.PropositionalEquality.decSetoid Data.Nat._?_)
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
Vec ? .n !=< .Relation.Binary.DecSetoid (_d?_6 v1 v2) (_d?_7 v1 v2)
of type Set
when checking that the expression v1 has type
.Relation.Binary.DecSetoid (_d?_6 v1 v2) (_d?_7 v1 v2)
Run Code Online (Sandbox Code Playgroud)
我不确定我做错了什么.我使用的模块系统是错误的,还是我需要以不同的方式使用??
与此问题类似但不完全相同.
我正在做一些代码生成,从Go中制作.go文件.我有一个结构,我想生成它的文本表示,以便我可以将它作为文字插入到生成的代码中.
所以,如果我有 myVal := SomeStruct{foo : 1, bar : 2},我想得到字符串"SomeStruct{foo : 1, bar : 2}".
Go有可能吗?
我正在寻找Java中的队列类型数据结构(最好是在标准库中),它具有以下属性:
remove()队列的操作.如果结构为空,显然会失败.保留插入/删除的顺序并不是非常重要.
Set结构没有重复,但没有pop操作,Queue结构不保证没有重复.是否符合我的需求?
为了避免XY问题,我正在做一个工作列表算法:需要更新的节点被添加到集合中,所以我想轻松弹出需要更新的下一个节点,并添加需要更新的节点而不需要更新如果它们已经在工作清单中,则重复.
agda ×2
c++ ×2
types ×2
boost ×1
boost-graph ×1
go ×1
graph ×1
java ×1
optimization ×1
pretty-print ×1
queue ×1
set ×1
stl ×1
struct ×1