編輯器數據結構

“Data Structures for Text Sequences”這篇文章給出了實現一個文本編輯器所需要的的數據結構和不同結構的效率。

文章指出有六種數據結構可以實現編輯器,分別是Linked List,Array,Gap,Line spans,Piece tables和Fixed size buffers。前三種結構爲基本序列數據結構(Basic Sequence Data Structures),後三種數據結構爲迭代序列數據結構(Recursive Sequence Data Structures),兩者的區別在於,基本的數據結構將所有的文本內容統一存儲在某種結構中,迭代序列數據結構將文本分塊並存儲,再通過某種算法將所有文本組合起來。

Linked List和Array顯然不適合作爲整個編輯器的數據結構,Linked List所佔內存太大,Array在中間添加或者刪除文本太過於緩慢。

Gap通過對Array進行改進,只增加了很低的複雜度卻極大地增加了效率。它主要解決的問題便是Array再中間增加或者刪除太過於緩慢的問題(數組的後半部分需要整體移動)。它將一個Array分爲兩個Array,中間插入一個Gap。它的優點在於,首先,Gap是隨着光標的移動而移動的,光標向前移動100個字節,將前一個Array的最後100位移動到後一個Span的前面便可(當然還有一些標誌位的改變),反之亦然,當然,如果只改變光標定位不去增加或者刪除文本,這個移動操作也可以不執行以提高響應。其次,添加只需寫到Gap中,刪除只需從Gap中刪除,無需數組進行整體移動。最後,當Gap寫滿時再進行運算,調整結構和重新生成Gap。所以這種方式很適合實現文本編輯器。

line span是很多文本編輯器採用的結構,它將每一行的數據用數據結構存儲,並且維護一個記錄每行地址的數據結構。

Fixed size buffers包含很多固定大小的buffer去存儲數據,整個文件分散在buffer當中,添加刪除儘可能地在單個buffer裏操作,不會影響其他buffer,以提高速度。

piece table是作者主要推薦的數據結構,一個文本文件由兩個Array組成,第一個Array存儲的是原始文件,它是隻讀的,第二個Array在更改文件時使用,它是隻能在末尾添加的,同時還有一個table用於記錄當前序列的組成,這裏管它叫記錄表。

 

如果對文本序列執行了刪除操作,array並不會更改,只會更改記錄表。如下圖所示便是在原序列刪除large的表示方法。

如果要增加文本的話,文本會增加在第二個array當中,同時改變記錄表,如下圖便是再添加English的過程。

文章對除了line span的其餘數據結構做了評測,評測內容包括增加,刪除,定位等等,得出結論:綜合來看,Gap和piece table是最好的方法。

至於文章爲什麼沒有評測line span,它給出的解釋是:line span是一種很老的方法以至於在現代文本編輯器中不建議使用。

然而沒有什麼數據結構是適合一切場景的,不同的數據結構在不同的場景中都能發揮優勢。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章