翻譯 Boost Graph庫簡介

2021-04-19 11:44:30 字數 3261 閱讀 3231

部落格:

http://www.boost.org/doc/libs/1_36_0/libs/graph/doc/table_of_contents.html)。前段時間研究編譯原理中的屬性計算時,看到拓撲排序,突然對boost中的這個庫有了興趣,就翻譯了這篇簡介。

圖(graph)是一種數學抽象,可用於解決電腦科學領域的多種問題。因此,這種抽象必須也由電腦程式表達出來。乙個用於遍歷圖的標準化的范型介面,對於促進對圖演算法和資料結構的重用,具有無可比擬的重要性。boost 圖類庫(bgl)的一部份是乙個可用於訪問圖的結構的范型介面,同時隱藏了其實現細節。這是乙個開放的介面,這意味著任何實現了該介面的圖類庫,都將可以與bgl范型演算法(或是其他使用了該介面的演算法)相互協作。bgl提供了一些遵循該介面的通用目的的圖類,但它們並不企圖成為唯一的圖類;肯定會有其他圖類更適合於特定場合。我們相信,bgl的主要貢獻將是對該介面的規劃。

bgl圖介面和圖元件是范型的(

generic),如同標準模板庫(stl)[

2]。在下一節中我們將回顧范型程式設計在stl中扮演的角色,並將其與我們如何在圖的背景下應用范型程式設計相比較。

當然,如果你已經熟悉范型程式設計,大可以跳過這一節!這裡是

目錄。bgl的源**是boost分發包的一部份,你可以在

這裡根本不用!boost 圖類庫是乙個僅有標頭檔案(header-only)的類庫,並不需要構建後才能使用。唯一的例外是graphviz輸入分析器 。

當編譯使用bgl的程式時,記住開啟優化。例如,在microsoft visual c++中選擇release模式,或給gcc加上-o2或-o3選項。

stl以三種方式體現出它是范型的。 

首先,每個演算法都是以一種資料結構中性的方式寫成的,允許乙個單獨的模板函式在許多不同型別的容器施行操作。迭代器的概念是降低演算法和資料結構耦合程度的關鍵因素。這項技術的影響在於將stl的**規模從

o(m*n)降低到

o(m+n),其中是

m演算法的數量而

n是容器的數量。考慮有20種演算法和5種資料結構的情形,這將是寫100個函式與僅寫25個函式的區別!而且這種區別將隨著演算法和資料結構數目的增多而變得更大。

其次,stl的演算法和資料結構是可擴充套件的。通過使用函式物件,使用者可以改造和定製stl。正是這種彈性使得stl成為解決現實問題的優秀工具。每個程式設計問題都會帶來它自己的實體集合和需要建模的互動。函式物件提供了這樣一種機制來擴充套件stl使其能處理每個問題領域的細節。

第三,stl容器的元素型別是引數化的。雖然這點非常重要,但它可能是最不有趣的一種方式。範性程式設計常常被簡單地總結為引數化的列表,如

std::list。這僅僅撓到了問題的皮毛!

如同stl,bgl也以三種方式體現出它是范型的。

首先,bgl的圖演算法是按照乙個抽象掉了特定的圖結構的細節的介面寫成的。和stl一樣,bgl使用迭代器來定義資料結構遍歷的介面。有三種不同的圖遍歷模式:遍歷圖的所有頂點,經過所有的邊,以及沿著圖的鄰接結構(從乙個頂點到它的鄰居)。對每一種遍歷模式,都有一種專門的迭代器。

該范型介面使得像

breadth_first_search()

這樣的模板函式可以工作於多種多樣的圖結構之上,無論是以指標鏈結的節點實現的圖,還是編碼在陣列裡的圖。這種彈性對於圖論領域尤其重要。圖結構常常是為特定的應用定製的。在以前,如果程式設計師想要重用乙個演算法實現他們必須將他們的圖資料轉換/複製到圖類庫的規定的圖結構。在使用像leda, gtl, stanford graphbase這樣的庫的時候,正是這樣;對於用fortran寫成的圖演算法,就更是如此。這嚴重地限制了它們的圖演算法的重用。

相反,通過外部適配(

external adaptation,參見小節

如何將既有的圖轉換為bgl

),定製的(或者甚至是遺留的)圖結構可以原封不動地與bgl范型圖演算法共同使用。外部適配將乙個新的介面包裹在乙個資料結構外面,無需複製,也無需將資料放在適配物件裡。bgl的介面經過仔細的設計,以使這個適配的過程盡可能簡單。為了演示這一點,在bgl圖演算法中,我們為多種圖結構(leda圖、stanford graphbase圖,甚至 fortran風格的陣列)構建了介面連線**。

其次,bgl的圖演算法是可擴充套件的。bgl引入了

visitor(訪問子)的概念,其實它只是乙個有多個方法的函式物件。在圖演算法中,常常需要在一些關鍵點(event points )插入使用者定義的操作。訪問子物件有乙個不同的、只在關鍵點才呼叫的方法。具體的關鍵點以及相應的訪問子方法依具體的演算法而定。它們通常包括像

start_vertex(),

discover_vertex(),

examine_edge(),

tree_edge(), and

finish_vertex()這樣的方法。

bgl的第三種范型方式,類似於stl容器中的元素型別的引數化,可是情況比stl容器要複雜一些。我們既需要將值(稱為「屬性」)關聯於圖的頂點,也需要關聯於邊。另外,常常需要將多重屬性關聯於每個頂點和每條邊;這正是所謂的多重引數化。stl的

std::list 類有乙個引數

t指定它的元素型別。相似地,bgl圖類有對應於頂點和邊的屬性的模板引數。乙個屬性引數指定屬性的引數化的型別,同時給該屬性分派乙個識別標籤。這個標籤用於區分開乙個頂點或邊所具有的多個屬性。關聯於乙個特定的頂點或邊的屬性值,可以經由乙個屬性對映表(property map)獲得。對每乙個屬性,都有一張單獨的屬性對映表。

傳統的相簿和圖結構會在遇到圖屬性引數化時變得無能為力。這是圖結構必須為具體應用定製的乙個主要原因。bgl中的圖類中屬性的引數化使得它們非常適合於重用。

bgl演算法包括乙個演算法模式(實現為范型演算法)的核心集合,以及大量的圖演算法。核心的演算法模式有:

這些演算法模式自身並不對圖計算任何有意義的量;他們僅僅為構造圖演算法建築基石。bgl中現有的圖演算法包括:

bgl目前提供兩個圖類和乙個邊鍊錶介面卡。

adjacency_list類是通用目的的,是圖類中的瑞士軍刀。它是高度引數化的,因此它可以為不同場合進行優化:圖是有向的還是無向的,是否允許平行邊,只可以高效訪問出邊還是也可高效訪問入邊,快速頂點插入與刪除的額外空間開銷等等。

adjacency_matrix將邊儲存在乙個|v| x |v| 矩陣中(其中|v|是頂點數)。這個矩陣的元素代表圖中的邊。鄰接矩陣表示特別適合於非常密集的圖,即邊的數目接近|v|2 。

edge_list類是乙個介面卡,它接受任何型別的邊迭代器實現乙個邊煉表圖(

edge list graph

)。

WebGL 簡介(翻譯)

1 introduction webgl是為web設計的一套即時模式的3d渲染api。它源自於opengl es2.0,也提供類似於opengl es2.0的渲染功能。不同點是webgl執行在html上下文中。webgl作為渲染上下文被設計為乙個html的canvas元素。canvas元素為網頁的渲...

Mbed OS 文件翻譯 之 簡介(概述)

arm mbed os 允許您編寫在嵌入式裝置上執行的應用程式,方法是提供以硬體可以理解的方式解釋應用程式 的層。您的應用程式 是用 c 和 c 編寫的。它使用 mbed os 提供的應用程式程式設計介面 api 這些 api 允許您的 以統一的方式在不同的微控制器上工作。這減少了基於 arm 的微...

10 10 010 簡介 官網 官網翻譯

netty是 乙個非同步事件驅動的網路應用程式框架,用於快速開發可維護的高效能協議伺服器和客戶端。netty是乙個nio客戶端伺服器框架,可以快速輕鬆地開發協議伺服器和客戶端等網路應用程式。它極大地簡化並簡化了tcp和udp套接字伺服器等網路程式設計。快速簡便 並不意味著最終的應用程式會受到可維護性...