編輯器資料結構

2021-10-01 15:37:35 字數 1377 閱讀 3001

「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。所以這種方式很適合實現文字編輯器。

fixed size buffers包含很多固定大小的buffer去儲存資料,整個檔案分散在buffer當中,新增刪除盡可能地在單個buffer裡操作,不會影響其他buffer,以提高速度。

piece table是作者主要推薦的資料結構,乙個文字檔案由兩個array組成,第乙個array儲存的是原始檔案,它是唯讀的,第二個array在更改檔案時使用,它是只能在末尾新增的,同時還有乙個table用於記錄當前序列的組成,這裡管它叫記錄表。

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

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

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

編輯器的資料結構

我從來沒有實現過任何乙個編輯器。但對於這麼乙個我們每天都使用的工具,如何高效的實現其內部結構是乙個有趣的話題。首先,乙個高效的演算法,以下幾點是值得考慮的重點 1.所佔的空間大小 2.插入,刪除的效率。最直接的方法是使用乙個陣列,陣列的每乙個成員對應乙個相應的字元。這樣不需要任何冗餘空間,但是缺點也...

資料結構棧之行編輯器

time limit 1000ms memory limit 65536k 有疑問?點這裡 由於使用者在終端上進行輸入時,不能保證不出差錯,因此,若在編輯程式中,每接受乙個字元即存入使用者資料區 的做法顯然不是最恰當的。較好的做法是,設立乙個輸入緩衝區,用以接受使用者輸入的一行字元,然後逐行存入使用...

資料結構實驗之棧 行編輯器

time limit 1000ms memory limit 65536k 有疑問?點這裡 乙個簡單的行編輯程式的功能是 接受使用者從終端輸入的程式或資料,並存入使用者的資料區。由於使用者在終端上進行輸入時,不能保證不出差錯,因此,若在編輯程式中,每接受乙個字元即存入使用者資料區 的做法顯然不是最恰...