亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

 

數組內存模型

一維數組

當定義一個數組后

int[] data = new int[5];
1

內存模型如圖所示

數據結構:從原理到實戰–學習筆記01

 

這種連續空間的內存模型揭示了一個重要特性:隨機訪問(random access)random access:可以用同等的時間訪問到一組數據中的任意一個元素。

我們可以用如下代碼獲取數組中的值:

data[0]
1

這種從 0 開始進行索引的編碼方式被稱為是“Zero-based Indexing”我們可以通過以下公式獲取數組特定元素:

base_address + index * date_size = target_address
1

此公式保證了,不同的數組元素達到的時間是相同的。

二維數組

一般稱為一維數組為 向量(Vector) 或 表(Table),數學上稱二維數組為 矩陣(Matrix)

按照以下代碼聲明一個矩陣:

int[][] data = new int[2][3]
1

基于這個二維數組,我們是無法確定 data[0][1]的內存地址,因為這個問題涉及到二維數組在內存中的尋址方式。其本質是 行優先(Row-Major Order) 還是 列優先(Column-Major Order)

數據結構:從原理到實戰–學習筆記01

 

在行優先內存模型中,每一行的相鄰元素保存在相鄰的連續內存空間中,這個二維數組內存模型如下所示:

數據結構:從原理到實戰–學習筆記01

 

我們可以按照以下公式獲取data[i][j]里的元素:

base_address + data_size * (i * number_of_column + j)
1

在列優先內存模型中,每一列的相鄰元素保存在相鄰的連續內存空間中,這個二維數組內存模型如下所示:

數據結構:從原理到實戰–學習筆記01

 

我們可以按照以下公式獲取data[i][j]里的元素:

base_address + data_size * (i * number_of_row + j)
1

CPU 在讀取內存數據的時候,通常會有一個 CPU 緩存策略。也就是說,在 CPU 讀取程序指定地址的數值時,CPU 會把和它地址相鄰的一些數據也一并讀取并放到更高一級的緩存中,比如 L1 或者 L2 緩存。當數據存放在這種緩存上的時候,讀取的速度有可能會比直接從內存上讀取的速度快 10 倍以上。

數組特點

高效的訪問和低效的插入刪除

數組的訪問時間復雜度是 O(1)

對于保存基本類型Primitive Type)的數組來說,它們的內存大小在一開始就已經確定好了,我們稱它為靜態數組(Static Array)。靜態數組的大小是無法改變的,所以我們無法對這種數組進行插入或者刪除操作。但是在使用高級語言的時候,比如 JAVA,我們知道 Java 中的 ArrayList 這種 Collection 是提供了像 add 和 remove 這樣的 API 來進行插入和刪除操作,這樣的數組可以稱之為動態數組(Dynamic Array)

為了維持數組內存中的連續性,當插入一個數據時,需要把待插入節點及之后所有的數據都拷貝,然后給數組擴容,把拷貝的數據放入待插入節點之后,最后再在待插入節點插入目標值。刪除元素同理,所以插入刪除時間復雜度是 O(n)

分享到:
標簽:數據結構
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定