跳至內容

陣列

出自Taiwan Tongues 台語維基
於 2025年8月24日 (日) 03:02 由 TaiwanTonguesApiRobot留言 | 貢獻 所做的修訂 (從 JSON 檔案批量匯入)

(差異) ←上個修訂 | 已批准修訂 (差異) | 最新修訂 (差異) | 下個修訂→ (差異)

佇計算機科學內底,陣列資料結構(英語:array data structure), 簡稱陣列(英語:Array), 是由相仝類型的元素(element)的集合所組成的資料結構,分配一塊連紲的記持體來儲存。利用元素的索引(index)會當算出應該元素對應的儲存位址。

上簡單的資料結構類型是一維陣列。比如講,索引為零到九的三十二位元整數陣列,成做是佇記憶體位址兩千,兩千空四,兩千空八,. . . 二千空三十六中,儲存十个變數,所以這个索引為 i 的元素隨佇記持體中的兩千 + 四 ×i 位址。陣列頭一个元素的記持體位址號做頭一位址抑是基礎位址。

二維陣列,對應於數學上的矩陣概念,會當表示二維矩的形格。比如講:$ a={ \ begin { bmatrix } 三 & 六 & 二 \ \ 零 & 一 & 扳四 \ \ 二 & 影一 & 零 \ end { bmatrix } } $ 佇咧 C 語言內底表示為 ` int a [三] [三]={ { 三 , 六 , 二 } , { 零 , 一 , 扳四 } , { 二 , 影一 , 零 } } ; `。

佇某一寡狀況下,「 向量」一詞嘛可能代表二維陣列,雖然佇數學意義頂閣較確定地稱呼做元組(tuple), 毋是向量。但是需要注意的是:電腦科學的某一寡領域,如 Matlab,元組是講類似 C 語言 struct 類型,有固定的往往是無仝類型的資料成員的資料結構。

陣列通常用佇實作資料庫的表格,特別是查詢表;表格有的時陣嘛予人當做是陣列的同義詞。

陣列是上早期佮上重要的資料結構之一,足濟程式攏會用著陣列。𪜶嘛用佇咧實作誠濟其他的資料結構,譬如講列表(list)佮字捾(string)。 𪜶有成效地開展了計算機的定址邏輯。佇大多數現代計算機佮真濟外部儲存裝置,記持體親像一維陣列,索引就是其位址。編譯器、處理單元(特別是向量處理器), 定定會針對陣列操作進行優化。

因為佇程式運行的時會當算元素的索引,陣列是足有路用的。此外,嘛會用得迵天代語句就處理陣列的真濟元素。為此,陣列資料結構的物件著愛有仝款的大細,而且應該使用仝款的資料型別表示。

陣列一詞通常用表示陣列資料類型,一種大多數的高階程式語言攏會內建的資料型別。陣列型別通常由陣列結構來實作;毋過佇咧某一寡語言內底,𪜶會當由雜鬥仔來、連結串列、搜揣樹仔抑是其他的資料結構來實現。

佇演算法的描述內底,陣列一詞是特別注意義替關聯陣列抑是「抽象的陣列」,一種理論上的計算機科學模型(抽象數據類型抑是 ADT), 專注著陣列的基本性質上。

歷史

頭一台數位計算機使用機器語言程式設計來設定佮存取資料表,向量佮矩陣計算的陣列結構,以及真濟其他的目的。一九四五年,佇建立頭一个范紐曼型架構計算機時,約翰 ・ 馮 ・ 紐曼(John von Neumann)寫著頭一个陣列排序程式(合併排序)。 陣列索引上早起是通過自修改代碼,後來使用索仔引暫存器佮間接定址來完成的。一九六空年代設計的一寡主機,如 Burroughs B 五千以後其實的繼者,使用記持體分段來執行硬體中的索引邊界檢查。

除了機器硬體本身提供的,機器語言並無特別支援陣列。上早的高階程式語言包括 FORTRAN(一千九百五十七)、 Lisp(一千九百五十八)、 COBOL(一千九百六十)和 ALGOL 六十(一千九百六十), 是開始支援多維陣列,C(一千九百七十二)嘛是按呢。佇咧 C + +(一千九百八十三)中,對維度固定佮彈性的多維陣列,提供類別模板。

應用

陣列實作數學向量佮矩陣,佮其他類型的長方表格。足濟資料庫是由元素為(抑是包括)記錄的一維陣列所組成。 陣列嘛用佇咧實作其他的資料結構,譬如講列表、堆積、雜鬥表、雙向在列、在列、 疊、字串和 VLists。佮樹仔比起來的資料結構比起來,是因為陣列實作的資料結構通常是簡單佮有空間效率的(隱式的資料結構), 空間成本開銷足少;但是陣列需要修改的時陣則空間的複雜性相對較䆀(已經排序的陣列結構,佮搜揣樹仔相比)。

一抑是真濟大型陣列有當時仔用佇類比程式內面的動態記持體分配,特別是固定記憶區塊規劃。對歷史上看著,這有時陣是會當徙栽地分配「動態記憶體」的唯一方法。

陣列通好決定程式內面的部份抑是完整控制流程,簡潔地替代濟个 ` IF ` 語句。𪜶佇頂下文中予人號做控制表,閣有專門構建的解說器結合使用,其控制流會照陣列所有的值來變動。該陣列可能有指向執行子程式的指針(或者是 ` SWITCH ` 語句執行的相關子程式編號)。

元素標識符和定址公式

做資料的物件儲存佇咧陣列的時陣,個別東西通常藉由非負整數的索引變數來選取。欲予人號做下標,會當陣列的值對應到儲存物件。

有三種方式對陣列的元素進行索引:

  • (對零開始索引): 陣列的第一个元素由下標為零開始的索引。如 C / C + +。
  • (對一開始索引): 陣列的第一个元素由下標為一開始的索引。如 Pascal、Delphi 語言。
  • n(對 n 開始索引): 會當自由選擇陣列的基本索引。通常,容允對 n 開始索引起的程式語言閣允准負數索引值佮諸如列舉的其他純量資料的類型,嘛會當共字元當做陣列的索引。

陣列會當有誠濟維度,所以捷看著使用多重索引來存取陣列。比如講,對零開始索引的情況下,有三行佮四列的二維陣列 ` A ` 需要存取第二行佮第四列的元素,表達式會當為著 ` A [一 , 三] `。所以,二維陣列使用兩索引下標,三維陣列使用三索引下標,n 維陣列使用 n 索引落標。

指定元素所需要的索引數叫做陣列的維度,維數抑是陣列的秩。

標準陣列內底每一索引會予人限制佇一定範圍內的連續整數(抑是某寡枚舉類型的連紲值), 元素位址是對索引值的「線性」計算公式。

一維陣列

一維(抑是單維)陣列是一種線性陣列,其中元素的存取是以行抑是列索引的單一下標表示。

譬如講考慮 C 程式語言的陣列宣告 ` int anArrayName [十] ; `

語法為:

datatype anArrayName [sizeofArray] ;

佇咧教冊的範例內底,被宣告的陣列將包括 ` int ` 型別的十个元素,會當為任何整數值。按呢乎,陣列元素的索引下標則為零交九(含)。 比如講,` anArrayName [零] ` 和 ` anArrayName [九] ` 分別是頭一个佮最後一个元素的表達。

對以線性定址的向量,索引𤆬做 i 的元素佇咧位址 B + c×i,其中 B 是固定的基底位址,c 為常數, 有時講位址增量抑是迒步。

若是有效的元素索引對零開始,則常數 B 只是陣列頭一个元素的位址。所以 C 語言指定陣列的索引一定對零開始;真濟開發人員會將這个元素叫做「第空」毋是「第一」。

毋過若適當選擇基底的位址 B,來做第一个元素的索引起始價值。比如講陣列較有五个元素,索引為一到五,基底位址 B 以 B + 三十 c 來替換,則相仝陣列的遮的元素索引共轉做三十一到三十五。若是編號對零開始,則常數 B 可能毋是任何元素的一个位址。

多維陣列

普通陣列採用一个整數來做標準。多維陣列高維陣列)的概念特別是佇咧數值計算和圖形應用圖面非常的有路用。咱佇多維陣列內底採用一系列順序的整數來標註,這馬 [三 , 一 , 五]。這種整數列表內底整數的數始終仝款,而且予人叫做陣列的「維度」。 關於每一陣列維度的邊界講「維」。 維度為 _ k _ 的陣列通常予人號做 _ k _ 維。

真濟維陣列的陣列名,佇表達式中自動轉換做陣列首元素位址值,但這个首元素實際上是去除陣列下標第一維了後的陣列賰的部份。比如講:

C / C + + 標準中的陣列

C / C + + 陣列的概念有雙重的含義,一是資料類型,二是實體(entity)。 C 語言標準中規定,一个陣列類型咧講連續分配的非空的有特定元素物件類型的物件集合。遮的元素物件的類型稱做元素類型(element type)。 陣列類型由元素類型佮元素的數目確定。

佇咧 C 語言內底,會當顯式定義一个陣列類型,比如講:

` ` ` typedef int myArrayType [一百空一] ; ` ` `

陣列名做為陣列實體的識別碼,有特殊性,無仝款干焦整型、浮點仔型、指標型抑是結構類型等變數識別碼。這是因為陣列是一組元素的聚集,袂當共一个箍來看做一个值得直接讀出(這个值指的是右值), 嘛袂當共一个聚集看做一个位址直接提值(即左值)。 所以,陣列名作為左值、正值,佇咧 C 語言標準中攏有特殊規定:

  • 做為 ` sizeof ` 的運算元,陣列名代表陣列的物件本身;
  • 做咧取位址運算子 ` & ` 的運算元,陣列名代表陣列的物件本身;
  • 做字串字面量用佇初初化一个陣列;
  • 其他的情形,表達式內底的陣列名對陣列類型予自動轉化做指向陣列頭元素的指標類型表達式(正值)。

比如講,

根據上述 C 語言標準中的規定,表達式 ` & s ` 的值的類型是 char ( \ * ) [六],指向規个陣列的指標;表達式 s 被隱式轉換做指向陣列頭元素的指標值,即 char \ * 類型。同理,表達式 ` s [四] `,等效表達式 ` * ( s + 四 ) `。

陣列下標運算子

C 語言標準中定義,陣列下標運算(array subscripting)有兩个運算數,一个為著類型 type 的指標表達式,另外一个運算子做整數表達式,結果為類型 type。但無規定兩个運算數的先後順序。所以,有以下推論:

  • 兩個運算數會當交換順序,即 p [N] 佮 N [p] 是等價的,為 \ * ( p + N );
  • 陣列下標運算,既然會當適合陣列名(實際上隱式共陣列名轉換做指向陣列首元素的指標表達式), 嘛會當適用著指標的達式;
  • 整型表達式會當取負值。

比如講:

無完整的陣列類型

無完整的陣列類型屬於無完整類型(incomplete type), 欠缺資訊去確定其實 sài-sù。比如講:

柔性陣列的成員

C 九十九規定,struct 的最後一个成員會當是無完整的陣列類型。比如講:

Visual C + + 兩千空一十五支援寫這个語法。

可變長陣列

C 九十九引入可變長陣列(variable length array,簡稱 VLA), 干焦會當定義在塊作用域抑是函式原型作用域,著愛無連結性。其陣列長度咧編譯期會變,但是佇執行期這个陣列東西一旦生就袂使改變陣列長度矣。比如講:

程式設計

陣列設計的時陣是佇咧形式依賴記持體分配而成的,所以必須愛佇咧使用進前預先請求的空間。這予陣列有以下特性:

一 . 請求空間以後大細固定,袂使閣改變(數據溢位問題); 二 . 佇記持體中有空間連紲性的表現,中央袂存在其他程式需要調用的數據,為這陣列的專用記持體空間; 三 . 佇舊的程式語言內底(如果有中階語言之稱的 C), 程式袂對陣列的操作做下界判斷,也就有藏佇的越界操作的風險(比如會共數據寫佇運行中程式需要調用的核心部份的記持體上)。

因為簡單陣列強烈靠電腦硬體之記憶體,所以無適用佇現代的程式設計。要使用可變大細、硬體無關係的數據類型,Java 等程式的設計語言攏提供予閣較高級的數據結構:ArrayList、Vector 等動態陣列。

注釋

參考文獻

外部連結

  • NIST's Dictionary of Algorithms and Data Structures : Array

參見

  • 一維陣列
  • 二維陣列 ( 矩陣 )