列表(抽象資料型別)

2021-08-10 20:14:32 字數 2851 閱讀 2321

列表(抽象資料型別)

維基百科,自由的百科全書

這篇文章是關於順序資料結構。對於隨機訪問資料結構,請參閱陣列資料型別。

在電腦科學中,列表或序列是一種抽象資料型別,表示可數數量的有序值,其中相同的值可能會出現多次。列表的例項是有限序列的數學概念的計算機表示; 列表的(潛在地)無限型別是流。[1]:§3.5列表是容器的基本示例,因為它們包含其他值。如果相同的值多次出現,則每次出現都被認為是不同的專案。

乙個單鏈表結構,實現乙個帶3個整數元素的列表。

名稱列表還用於幾個可用於實現抽象列表(尤其是鏈結列表)的具體資料結構。

許多程式語言都提供對列表資料型別的支援,並且對列表和列表操作具有特殊的語法和語義。通常可以通過在括號 『()』,括號 『』,大括號 『{}』或尖括號等一對分隔符內用逗號,分號或空格分隔的順序書寫專案來構造列表』<>』。有些語言可能允許列表型別像陣列型別一樣被索引或切片,在這種情況下,資料型別更準確地描述為乙個陣列。在物件導向的程式語言,列表通常作為通用「列表」類的子類的例項提供,並通過單獨的迭代器遍歷。列表資料型別通常使用陣列資料結構或某種型別的鍊錶來實現,但其他資料結構可能更適合於某些應用程式。在一些情況下,比如在lisp程式設計中,術語列表可能特指鏈結列表而不是陣列。

在型別理論和函式式程式設計中,抽象表通常由兩個操作來歸納定義:nil產生空列表,cons在列表的開頭新增乙個專案。[2]

內容 [ 隱藏 ]

1 操作

2 實施

3 程式語言支援

4 應用程式

5 抽象的定義

5.1 列表monad

6 參考

7 另見

操作[ 編輯]

列表資料結構的實現可以提供以下一些操作:

乙個建立空列表的建構函式 ;

用於測試列表是否為空的操作;

將實體預先新增到列表的操作

將實體附加到列表的操作

用於確定列表的第一元件(或「頭」)的操作

乙個操作,用於引用由第乙個列表(除了列表的尾部)以外的所有列表組成的列表。

實現[ 編輯]

列表通常作為鍊錶(單鏈或雙鏈)或陣列(通常是可變長度或動態陣列)實現。

實現列表的標準方式,源於程式語言lisp,是讓列表中的每個元素都包含它的值和乙個指示列表中下乙個元素位置的指標。這會導致鍊錶或樹,這取決於列表是否巢狀了子列表。一些較老的lisp實現(例如symbolics 3600 的lisp實現)也支援具有特殊內部表示(使用者不可見)的「壓縮列表」(使用cdr編碼)。列表可以使用迭代或遞迴操作。前者通常是命令式程式語言的首選而後者是功能語言的規範。

列表可以實現為具有索引 - 值對的自平衡二叉搜尋樹,提供對任何元素(例如所有居於邊緣的內部節點和儲存最右邊孩子索引的內部節點的同等時間訪問,用於指導搜尋) ,取對數列表的大小,但只要沒有太大的變化,就可以提供隨機訪問的錯覺,也可以在對數時間內進行交換,字首和附加操作。[3]

程式語言支援[ 編輯]

某些語言不提供列表資料結構,但提供使用關聯陣列或某種表來模擬列表。例如,lua提供了**。儘管lua儲存了內部具有陣列索引的列表,但它們仍然顯示為字典。[4]

在lisp中,列表是基本的資料型別,可以代表程式**和資料。在大多數方言中,前三個素數的列表可以寫成(list 2 3 5)。在lisp的幾種方言中,包括scheme,乙個列表是乙個對的集合,由乙個值和乙個指向下乙個對(或空值)的指標組成,形成乙個單獨的鍊錶。[5]

應用程式[ 編輯]

顧名思義,列表可以用來儲存元素列表。但是,與傳統陣列不同,列表可以擴充套件和縮小,並且可以動態儲存在記憶體中。

在計算中,列表比集合更容易實現。數學意義上的有限集合可以被實現為具有額外限制的列表; 也就是說,重複的元素是不允許的,順序也是不相關的。對列表進行排序可以加速確定給定專案是否已經在集合中,但是為了確保順序,需要更多時間將新條目新增到列表中。然而,在有效的實現中,集合是使用自平衡二叉搜尋樹或雜湊表而不是列表來實現的。

列表還構成了其他抽象資料型別的基礎,包括佇列,堆疊及其變體。

零:()→ l

缺點:e × l → l

第一:l → e

休息:l → l

與公理第一(cons(e,l))= e

其餘(cons(e,l))= 1

對於任何元素e和任何列表l。這是隱含的

cons(e,l)≠ 1

cons(e,l)≠ e

如果e 1 = e 2且l 1 = l 2,則cons(e 1,l 1)= cons(e 2,l 2)

請注意,第乙個(nil())和rest(nil())沒有定義。

這些公理相當於抽象堆疊資料型別的公理。

在型別理論中,上面的定義更簡單地被認為是乙個按照構造者定義的歸納型別:零和缺點。在代數方面,這可以表示為變換1 + e × l → l。第一和休息,然後由得到的圖案匹配上的缺點的構造,並分別處理零的情況。

參考[ 編輯]

跳起來 ^ abelson,harold; sussman,gerald jay(1996)。電腦程式的結構和解釋。mit出版社。

跳起來 ^ reingold,愛德華; nievergelt,jurg; narsingh,deo(1977)。組合演算法:理論與實踐。恩格爾伍德懸崖,紐澤西州:普倫蒂斯霍爾。第38-41頁。isbn 0-13-152447-x。

跳起來 ^ 格蘭維爾的barnett; 德爾湯加,盧卡(2023年)。「資料結構和演算法」 (pdf)。mta.ca 。檢索2014 年11月12日。

跳起來 ^ lerusalimschy,羅伯托(2023年12月)。在lua程式設計(第一版)(第一版)。lua.org。isbn 8590379817 。檢索2014 年11月12日。

跳起來 ^ 斯蒂爾,蓋(1990)。common lisp(第二版)。數字出版社。第29-31頁。isbn 1-55558-041-6。

抽象資料型別

本篇文章簡單的講解下表 棧 佇列。首先先了解一下什麼是抽象資料型別。它是這麼定義的 抽象資料型別 abstract data type,即adt 是帶有一組操作的一些物件的集合。那麼adt怎麼理解呢?首先你只需要記住表 集合 圖以及與他們各自的操作一起形成的物件都可以被看做抽象資料型別.這就跟整型 ...

列表(抽象資料型別)的python實現

鍊錶的python實現 建立乙個node類 class node def init self,initdata self.data initdata self.next none defgetdata self return self.data defgetnext self return self...

抽象資料型別 表

資料結構與演算法分析.c 實現 總結 抽象資料型別 abstract data type,首先顧名思義,她是一種資料型別,就像整數 字元,類似於加減乘除,他有自己的操作,例如 並和查詢 並沒有什麼法則規定一定要有什麼操作,具體的看設計要求 每種資料型別的實現方式也是不同的,主要有 陣列實現和鍊錶實現...