0% found this document useful (0 votes)
89 views35 pages

A Library of Efficient Data-Types and Algorithms: Presentation by Amitai Armon

LEDA is a C++ library that includes efficient data structures and algorithms. It contains classes for basic data structures like lists and graphs as well as advanced structures like dictionaries and priority queues. LEDA includes graph algorithms for tasks like planarity testing, minimum spanning trees, and graph drawing. The library is extensively tested, efficient, and works across platforms.

Uploaded by

saleem_jah
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
89 views35 pages

A Library of Efficient Data-Types and Algorithms: Presentation by Amitai Armon

LEDA is a C++ library that includes efficient data structures and algorithms. It contains classes for basic data structures like lists and graphs as well as advanced structures like dictionaries and priority queues. LEDA includes graph algorithms for tasks like planarity testing, minimum spanning trees, and graph drawing. The library is extensively tested, efficient, and works across platforms.

Uploaded by

saleem_jah
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 35

LEDA

A Library of Efficient Data-Types


and Algorithms
http://www.algorithmic-solutions.com/enleda.htm

Presentation by Amitai Armon


Example: Planarity Testing
#include <LEDA/graph_alg.h>
using namespace leda;
int main(int argc, char * argv[])
{
graph G;
string filename(argv[1]);
G.read(filename);
cout << PLANAR(G) << endl;
}
Topics
• What is LEDA?
• What does it include?
• LEDA data structures examples
• LEDA graphs
• Compiling with LEDA
• Where to find more info
What is LEDA
• A C++ library of data-types and algorithms
• Includes dozens of classes, developed over more
than 15 years (Naher & Mehlhorn)
• Works cross-platform
• Extensively tested
• Efficient
• Extensively documented (manual, guide, book)
• Installed in more than 3000 sites.
A note about efficiency
• LEDA code is likely to be more efficient than the
first implementation of most users
• It is also more efficient than STL in many cases
• …but it is not magical:
– The right DS should be used (e.g. dynamic graph vs.
static graph, array vs. dictionary)
– Robustness damages efficiency, so if efficiency is an
issue, check if LEDA creates bottlenecks and should be
replaced by platform/application optimized code.
LEDA Contents
• Basic data structures: lists, queues, stacks, arrays,
sets, etc.
• Advanced data structures: e.g. dictionary,
partition, priority queues (with Fibonacci heaps),
dynamic trees, and more.
• Graphs:
Data-types, generators, iterators, and algorithms -
including BFS, DFS, MST, Max-Flow, Min-Cost-
Flow, Min-Cut, Matchings, Planarity-testing,
Triangulation, Five-Colors,…
LEDA Contents – continued
• Linear algebra & number theory: matrices,
modular arithmetic, integers of arbitrary length,
numeric functions…
• Lossless compression coders (Huffman, LZ…)
• Geometric types & algorithms. (e.g. circle,
sphere, triangulation, convex hull…)
• Graphics: windows, menus, graph-window
• Simple data types and support functions: strings,
tuples, random-variables, I/O, etc.
LEDA Extensions
12 packages, including:
• Curve reconstruction Algorithms
• K-cut (approximation)
• Minimum Mean cycle
• D-dimensional Geometry
• Dynamic Graph algorithms
• And more
A DS Example: Dynamic Trees
#include < LEDA/dynamic_trees.h >
dynamic_trees D
vertex D.make(void* x=nil)
void D.link(vertex v, vertex w, double x, void* e_inf=nil)
void D.update(vertex v, double x)
vertex D.mincost(vertex v)
double D.cut(vertex v)
vertex D.lca(vertex v, vertex w)
void* D.vertex_inf(vertex v), void* D.edge_inf(vertex(v)
• O(log2n) expected amortized time per operation
A DS Example: Dynamic Trees
#include < LEDA/dynamic_trees.h >
dynamic_trees D
vertex D.make(void* x=nil)
void D.link(vertex v, vertex w, double x, void* e_inf=nil)
void D.update(vertex v, double x)
vertex D.mincost(vertex v)
double D.cut(vertex v)
vertex D.lca(vertex v, vertex w)
void* D.vertex_inf(vertex v), void* D.edge_inf(vertex(v)
• O(log2n) expected amortized time per operation
A DS Example: Dynamic Trees
#include < LEDA/dynamic_trees.h >
dynamic_trees D
vertex D.make(void* x=nil)
void D.link(vertex v, vertex w, double x, void* e_inf=nil)
void D.update(vertex v, double x)
vertex D.mincost(vertex v)
double D.cut(vertex v)
vertex D.lca(vertex v, vertex w)
void* D.vertex_inf(vertex v), void* D.edge_inf(vertex(v)
• O(log2n) expected amortized time per operation
A DS Example: Lists
• #include < LEDA/list.h >
list <E> L – creates a list of items with information of type E.
E.g.: list<int>, list<string>, list<edge>, etc.
• Operations: push(E item), append, pop, reverse, size, sort,
unique, max, head, tail, succ, pred, print, forall(x, L), etc.

• List access returns a list_item object (‘pointer to element’).


Its information can be found only in the list itself.
For example:
list_item lowest=L.min();
cout << L[lowest];
.A DS Example - contd
• For a proof of non-planarity we supply an empty
list of edges:
list<edge> edge_list;
if (PLANAR(G, edge_list)==0)
forall (x,edge_list) G.print_edge(x);

• List is implemented by a doubly linked list (use slist<E>


for a singly-linked list).

• Templates and the items concept are used in most of


LEDA’s DSs, including stack<E>, queue<E>, array<E>,
array2<E>, set<E>, and others.
raphs in LEDA
The graph/ugraph Classes
• Represent directed/undirected graphs
• Allow lots of graph operations:
Adding/removing nodes/edges, node/edge iteration
and sorting, computing and iterating faces, and
more.
• Persistent – can be read/written from/into a file
• Has lots of implemented algorithms
Creating a new graph
• First option: start with an empty graph and update it

graph G; // Initializes an empty directed graph


ugraph G; // Initializes an empty undirected graph
node G.new_node(); // New node is returned
edge G.new_edge(node v, node w)

=> A lot of work!


Creating a new graph - easier
Use the generators for various graph types:
• void random_graph(graph& G, int n, int m)
• void random_graph(graph& G, int n, double p)
• void random_simple_graph(graph& G, int n, int m)
• void complete_graph(graph& G, int n)
• random_bigraph – for a bipartite graph
• random_planar_graph
• And more
Creating a new graph – from file
• int G.read(string filename) (returns 0 if OK)
void G.read(istream& I = cin)
void G.write(ostream& O = cout)
void G.write(string filename)
• File format is simple: textual description, with each
edge/node in a different line
• Can also read another standard format, GML, with
read_gml, etc.
Nodes/Edges Iteration

• forall_nodes(v, G)
(The nodes of G are successively assigned to v)
• forall_edges(e, G)
• forall_adj_nodes(v, w)
• forall_adj_edges(e, w)
• forall_out_edges(e, w)
• forall_in_edges(e, w)
• etc…
Node and Edge Data Structures
• Node/edge arrays:
The index to the array is a node/edge
Construction: node_array<T> A(graph G)
Access/assignment: T& A[node v]

• Similarly we have node/edge lists, sets, maps,


priority queues. They are optimized for
nodes/edges.
Introducing Weights
• The class GRAPH<vtype, etype> includes information of the specified
types for each vertex and node.
E.g.: GRAPH<int, int> G;
• Some useful functionality:
node G.new_node(vtype x)
edge G.new_edge(node v, node w, etype x)
void G.assign(edge e, etype x)
etype G.inf(edge e)
edge_array<etype>& G.edge_data()
• A parameterized GRAPH may be used wherever a graph may be used.
• It can be read/written from/to a file with all the information.
Graph Algorithms
• Include: BFS, DFS, MST, Dijkstra, Bellman-Ford,
Max-Flow, Min-Cost-Flow, Min-Cut, Matchings,
Planarity-testing, Triangulation, Five-Colors,…
• Can be included all at once: <LEDA/graph_alg.h>
• Examples:
– void DIJKSTRA_T(graph G, node s, edge_array<NT> cost,
node_array<NT>& dist, node_array<edge>& pred)
– list<node> MIN_CUT(graph G, edge_array<int> weight)
– list<node> BFS(graph G, node s, node_array<int>& dist,
node_array<edge>& pred)
– list<edge> DFS_NUM(graph G, node_array<int>& dfsnum,
node_array<int>& compnum)
Graph Window
• A powerful interactive graphic interface for graph
operations and editing.
• Can perform anything that can be done through a
program, and has many customization options.
• Basic operations:
– GraphWin gw(graph& G, const char* win_label="")
– gw.display()
– Gw.edit()
• More details in the LEDA website.
Graph Window - Screenshots
Semi-Dynamic Graphs
• The graph class allows dynamic graph changes, but in
most applications the graph doesn’t change after
construction.
• Semi-dynamic graphs are an alternative
implementation of graphs, in which upper bounds on
n and m may be supplied, in order to get better
performance:
graph G;
void G.init(int n, int m);
• Requires compilation with -DGRAPH_REP=2
Static Graphs
• May not change at all after their construction.
• Significantly more efficient. We use:
void G.start_construction(int n, int m)
void G.finish_construction()
• Slots: more efficient ways for associating data with
nodes/edges (compared to node/edge arrays).
• But: this is an experimental class with limited
functionality compared to semi-dynamic graphs or
ordinary graphs.
Compiling with LEDA
• We have LEDA version 4.4 for the following
platforms:
– Linux: Redhat 7.0 with g++ 2.96
– Linux: Redhat 8.0 with g++ 3.2
Both are installed in the TAU CS network
- Windows with Visual C++ 6.0
- Windows with Visual C++ 7.0 (.Net)
Both can be installed from CD on a PC
Compiling with LEDA: Libraries
The LEDA library is actually divided into 7 libraries:
• Most of LEDA is in libL
• Graphs and related data type are in libG
• The alternative semi-dynamic implementation is in libG2
• libP- Geometry in the plane
• libW – Graphics such as window and GraphWin
• libD3 – 3D geometry
• libGeoW – Visualizing sets of geometric objects
Compiling with LEDA: Includes

• Naturally, all the classes we use should be


included (explicitly or by other includes).
• LEDA types are in namespace leda (prefix leda::),
in order to prevent ambiguity.
• If ambiguity is not an issue – write:
using namespace leda;
and then you don’t have to add leda::
Compiling with LEDA: CS Linux

• Write the following line in your xterm:


setenv LEDAROOT /usr/local/lib/LEDA-4.4-complete-i386-linux-redhat-7.0-g++-2.96/

Or, with Redhat 8.0:


setenv LEDAROOT /usr/local/lib/LEDA-4.4-complete-i386-linux-redhat-8.0-g++-3.2/

- It is recommended to append the above line to your .login


file.
Compiling with LEDA: CS Linux

Makefile example:

Is_planar : Is_planar.o
/usr/bin/g++ -Wall -O2 -L$(LEDAROOT) -o Is_planar Is_planar.o -lL -lG

Is_planar.o: Is_planar.c
/usr/bin/g++ -I$(LEDAROOT)/incl -O2 -c -o Is_planar.o Is_planar.c

• Graphwin requires –lW -lP –lG –lL –lX11 –L/usr/X11R6/lib/


Compiling with LEDA: Windows
• Install the library for the appropriate compiler
version from the CD (after signing a non-distribution form).
• Open the supplied sample workspace.
• Adjust the include and lib dirs in VS.
• Add your LEDA directory to the PATH
environment variable.
• Elaborate instructions are in the LEDA website.
Documentation
• The LEDA website includes a user manual,
describing all the LEDA classes, and a user guide,
with examples and tips.
http://www.algorithmic-solutions.com/enleda.htm

• The LEDA book, by Mehlhorn and Naher, can be


found at the library, and is also available on-line
at the LEDA website.
Conclusions
• We’ve seen an overview of LEDA
• It’s a useful and easy-to-use tool
• Let’s use it…
LEDA

Questions?

You might also like