數組元素的地址計算問題(一維到高維)

數組元素存儲地址的計算

一維數組

設一維數組A[n]存放在n個連續的存儲單元中,每個數組元素占一個存儲單元(不妨設為C個連續字節).如果數組元素A[0]的首地址是L,則A[1]的首地址是L+C,A[2]的首地址是L+2C,… …,依次類推,對于有:

?

二維數組

二維數組的每個元素含兩個下標,如果將二維數組的第一個下標理解為行號,第二個下標理解為列號,然后按行列次序排列個元素,則二維數組呈陣列形狀。例如

它是一個行號為1~m,列號為1~n的二維數組元素陣列。

如何保存二維數組?

首先要確定一個順序

?

????????? ???????????

??????????????????? 0??????? 1??????? 2

?

????????? ???????????

?

??????????????????? 0??????? 1??????? 2

?

?

????????? ???????????

?


????????? ???????????

?

?

?

?

?

?

?

?

?

?


count為數組B中元素的個數,則count=9

按行優先存儲

?

?

1

2

3

4

5

6

7

8

9

?

????????? 0???????????????? 1??????????????? 2??

?

?

按列優先存儲

?

?

1

2

3

4

5

6

7

8

9

?

?

????????? 0???????????????? 1??????????????? 2??

?

地址如何計算?

所謂按行優先順序,就是將數組元素按行向量的順序存儲,第個行向量存儲在第個行向量之后。

下面我們計算二維數組中任一元素A[i][j]的存儲地址,設每個數組元素所占空間為個連續字節。顯然,A[i][j]是第個行向量B[i]中的第個元素。

?

?

1

2

3

4

5

6

7

8

9

?

????????? 0?????????????? ??1??????????????? 2??

?

在A[i][j]之前的元素個數為u,分別是A[0][0]A[0][1]A[0][2],…,A[0][n]A[1][0],A[1][1],A[1][2],…,A[1][n],…,A[i-1][0]A[i-1][1]A[i-1][2],…,A[i-1][n],A[i][0],A[i][1],A[i][2],…,A[i][j-1]

每個數組元素所占空間為個連續字節

Loc(A[i][j])=Loc(A[0][0])+u*C

u=?

前i行(第0行到第i-1行)(每行n個元素)的元素個數+第i行的元素個數(A[i][0]到A[i][j-1])

因此,u=i*n+j

Loc(A[i][j])=Loc(A[0][0])+u*C

=Loc(A[0][0])+(i*n+j)*C

按列優先存儲

?

?

1

2

3

4

5

6

7

8

9

?

?

????????? 0???????????????? 1??????????????? 2??

?

地址如何計算?

在A[i][j]之前的元素個數為v,分別是A[0][0]A[1][0]A[2][0],…,A[m][0]A[0][1],A[1][1],A[2][1],…,A[m][1],…,A[0][j-1]A[1][j-1]A[2][j-1],…,A[m][j-1],A[0][j],A[1][j],A[2][j],…,A[i-1][j]

每個數組元素所占空間為個連續字節

Loc(A[i][j])=Loc(A[0][0])+v*C

v=?

前j列(第0列到第j-1列)(每列m個元素)的元素個數+第j列的元素個數(A[0][j]到A[i-1][j])

因此,v=j*m+i

Loc(A[i][j])=Loc(A[0][0])+v*C

=Loc(A[0][0])+(j*m+i)*C

高維數組

按行優先:“左”下標優先,即第一(最左)下標的下標值較小的元素較先存儲,第一個下標值相同者,按第二下標優先存儲,對任意的k>1,對第1~(k-1)維相同者,先存儲第k維中下標值較小者。

按列優先:“右”下標優先(最后一維下標為最右),先存儲第n維下標值較小者,第n維下標值相同者,先存儲第n-1維下標值較小者。

三維數組D[3][3][4]的順序存儲次序是

元素表示為D[i][j][k]??? 其中,0≤i≤2,0≤j≤2,0≤k≤3,

?

可以把它看作一維數組

B1[3]= { D[0][3][4],D[1][3][4],D[2][3][4]}

?

?

?


D[0][3][4]

i=0

?

D[0][0][0],D[0][0][1],D[0][0][2],D[0][0][3]

D[0][1][0],D[0][1][1],D[0][1][2],D[0][1][3]

D[0][2][0],D[0][2][1],D[0][2][2],D[0][2][3]

?

D[1][3][4]

i=1

?

D[1][0][0],D[1][0][1],D[1][0][2],D[1][0][3]

D[1][1][0],D[1][1][1],D[1][1][2],D[1][1][3]

D[1][2][0],D[1][2][1],D[1][2][2],D[1][2][3]

?

D[2][3][4]

i=2

?

D[2][0][0],D[2][0][1],D[2][0][2],D[2][0][3]

D[2][1][0],D[2][1][1],D[2][1][2],D[2][1][3]

D[2][2][0],D[2][2][1],D[2][2][2],D[2][2][3]

?

?

For? x=0? to?2?do

?? For? y=0? to?2? do

????? For? z=0?to? 3? do

D[i][j][k]的地址:

Loc(D[i][j][k])=Loc(D[0][0][0])+w*C

第一個下標的變化:0i-1,共i*3*4個元素

第一個下標為i時,第二個下標的變化:0j-1,共j*4個元素

第一個下標為i,第二個下標為j時,第三個下標的變化:0k-1,共k個元素

w= i*3*4+j*4+k

Loc(D[i][j][k])=Loc(D[0][0][0])+w*C

=Loc(D[0][0][0])+(i*3*4+j*4+k)*C

?

For? z=0?to? 3? do

?? For? y=0? to?2? do

????? For? x=0?to? 2? do

?

?

?

?

j=0

j=1

j=2

?

D[3][3][0]

k=0

?

D[0][0][0],D[1][0][0],D[2][0][0]

D[0][1][0],D[1][1][0],D[2][1][0]

D[0][2][0],D[1][2][0],D[2][2][0]

j=0

j=1

j=2

?

?


D[3][3][1]

k=1

?

D[0][0][1],D[1][0][1],D[2][0][1]

D[0][1][1],D[1][1][1],D[2][1][1]

D[0][2][1],D[1][2][1],D[2][2][1]

j=0

j=1

j=2

?

?


D[3][3][2]

k=2

?

D[0][0][2],D[1][0][2],D[2][0][2]

D[0][1][2],D[1][1][2],D[2][1][2]

D[0][2][2],D[1][2][2],D[2][2][2]

j=0

j=1

j=2

?

?


D[3][3][3]

k=3

?

D[0][0][3],D[1][0][3],D[2][0][3]

D[0][1][3],D[1][1][3],D[2][1][3]

D[0][2][3],D[1][2][3],D[2][2][3]

?

For? z=0?to? 3? do

?? For? y=0? to?2? do

????? For? x=0?to? 2? do

D[i][j][k]的地址:

Loc(D[i][j][k])=Loc(D[0][0][0])+w*C

第三個下標的變化:0k-1,共k*3*3個元素

第三個下標為k時,第二個下標的變化:0j-1,共j*3個元素

第三個下標為k,第二個下標為j時,第一個下標的變化:0i-1,共i個元素

w= k*3*3+j*3+i

?

Loc(D[i][j][k])=Loc(D[0][0][0])+w*C

=Loc(D[0][0][0])+(k*3*3+j*3+i)*C

?

?

n維數組

For? =0? to? ??do

?? For? =0? to? ??do

?????????? ? ? ? ?

????? For? =0? to? ??do

s = ?

的變化:0~-1,共****=*個元素

等于時,的變化:0~-1,共***=*個元素

等于時,等于時,的變化:0~-1,共***=*個元素

? ? ? ?

等于時,等于時,…,等于時,的變化:0~-1,共個元素

s=*+*+*++*+

??????????????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453342.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453342.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453342.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

侯寧:不該撈的別去撈 踏空不是浪費時間

最近,偶然間在網上看到了一則寓言故事:《駱駝與北斗星》。文章不長,但內容豐富,講得很有趣,很有哲理,也很有啟發。尤其是在股市博弈中,許多人、許多機構都會在現實中扮演故事里的不同角色。因為…

大躍進和循序漸進

大躍進和循序漸進本身沒有對錯,只有跟具體情境結合起來才會產生對錯屬性。 好的大躍進就是不學走先學跑,deadline是第一生產力,一旦學會了更高級的,低級的自然而然就學會了。 好比武裝革命,是先攻打大城市還是攻打農村…

Hibernate 學習(一)

一、Hibernate 簡介 1、Hibernate 簡介 Hibernate是一個開放源代碼的對象關系映射(ORM)框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數據庫表建立映射關系,是一個全自動的orm框架,hibernate可以自動生成SQL語句&#xff0…

(嚴蔚敏版)數組的順序存儲表示和實現代碼

#include<stdarg.h>#include<malloc.h> /* malloc()等 */#include<stdio.h> /* EOF(^Z或F6),NULL */#include<stdlib.h> /* atoi() */#include<io.h> /* eof() */#include<math.h> /* floor(),ceil(),abs() */#include<process.h> /…

特殊權限

2.18特殊的權限set_uid [rootcentos-01 ~]# which passwd //查詢一下passwd位置// /usr/bin/passwd[rootcentos-01 ~]# ls -l /usr/bin/passwd //查詢一下passwd權限//-rwsr-xr-x. 1 root root 27832 6月 …

我的職場戰爭--一年來的開發組內戰實錄

一 戰爭準備階段 一年前&#xff0c;國內分社派我帶著幾名程序員來到日本&#xff0c;進入一個世界級大公司做項目&#xff0c;這里先期駐在了一個日本總社的社員X。沒有人想到戰爭已經臨近。 二 戰爭醞釀階段 日本人不會叫你閑著&#xff0c;頭一個月就開始了下馬威。…

linux8重啟服務代碼,linux(centos8):安裝分布式事務服務seata(seata 1.3.0/centos 8.2)

一&#xff0c;什么是seata?Seata:Simpe Extensible Autonomous Transcaction Architecture&#xff0c;是阿里中間件,開源的分布式事務解決方案。前身是阿里的Fescar官方站:http://seata.io/zh-cn/官方代碼地址:https://github.com/seata/seata官方文檔站:http://seata.io/zh…

數組與矩陣的區別

數組中的元素可以是字符等 矩陣中的只能是數 這是二者最直觀的區別。 因為矩陣是一個數學概念&#xff08;線性代數里的&#xff09;&#xff0c;數組是個計算機上的概念。 《精通MATLAB6.5版》&#xff08;張志涌編著&#xff0c;北京航空航天大學出版社&#xff09;中說&…

android自定義view(自定義數字鍵盤)

序言&#xff1a;在上周的項目中&#xff0c;需要做一個密碼鎖的功能&#xff0c;然后密碼下面還得有鍵盤&#xff0c;就類似支付寶支付的時候那樣&#xff1a; 當然了&#xff0c;我們項目的需求簡單點&#xff0c;純數字的就可以了&#xff0c;然后上周就百度了自定義鍵盤&am…

linux環境部署ltmj,Linux系統安裝與簡單配置 圖文.docx

合肥師范學院實驗報告姓名:課程名稱&#xff1a;Linux院(系&#xff1a;計算機學院 專業/年級:實於Lin^系繚公裝與苗瑕肚卅1.占克If Jf VVVork51at>un ?- If -JpMHIWortsktKia^2.?JGJiIjxiS4CLM.lt 1H. iuFI?H?*vW ?tVirtujl Machine Wisa rdGimm Oprraimv加薊aBMkonA …

矩陣的壓縮存儲

5.3 矩陣的壓縮存儲 矩陣是很多科學與工程計算問題中研究的數學對象&#xff0c;在此&#xff0c;我們討論如何存儲矩陣的元&#xff0c;從而使矩陣的各種運算能有效第進行。對于一個矩陣結構顯然用一個二維數組來表示是非常恰當的&#xff0c;但在有些情況下&#xff0c;比如常…

網絡工程師還要學linux嗎,網絡工程師要學什么

想成為一個優秀的網絡工程師&#xff0c;要學什么&#xff0c;怎么學呢?今天小編帶你了解一下網絡工程師到底要學什么。上篇我們講到了“網絡工程師發展方向”&#xff0c;列舉了許多技術方向&#xff0c;那么我們該如何根據自己的定位選擇學習哪些技術。重點是哪些&#xff0…

利用FormData對象實現AJAX文件上傳功能及后端實現

包括HTML基礎設置、CSS界面優化、JS利用FormData對象和AJAX進行上傳、后端接收文件并存儲到指定路徑以及刪除文件操作。FE HTML 基礎的設置&#xff1a; <form enctype"multipart/form-data"><input id"file" type"file" multiple"…

第 6 章 —— 裝飾模式

6.6 裝扮模式總結 裝飾模式把每個要裝飾的功能放在單獨的類中&#xff0c;并讓這個類包裝它所要裝飾的對象&#xff0c;因此&#xff0c;當需要執行特殊行為時&#xff0c;客戶端代碼就可以在運行時根據需要有選擇地、按順序地使用裝飾功能包裝對象了。 裝扮模式是為已有功能動…

廣義表及其存儲方式簡介

廣義表&#xff08;Lists&#xff0c;又稱列表&#xff09;是線性表的推廣。線性表定義為n>0個元素a1,a2,a3,…,an的有限序列。線性表的元素僅限于原子項&#xff0c;原子是作為結構上不可分割的成分&#xff0c;它可以是一個數或一個結構&#xff0c;若放松對表元素的這種限…

Vue.js:路由

ylbtech-Vue.js&#xff1a;路由1.返回頂部 1、Vue.js 路由 本章節我們將為大家介紹 Vue.js 路由。 Vue.js 路由允許我們通過不同的 URL 訪問不同的內容。 通過 Vue.js 可以實現多視圖的單頁Web應用&#xff08;single page web application&#xff0c;SPA&#xff09;。 Vue.…

圖片轉excel:“保留數字格式”在什么場景下該勾

保留數字格式是什么意思呢&#xff1f;顧名思義&#xff0c;就是將轉出來的數字保留為數字格式&#xff0c;而不是文本格式。我們知道&#xff0c;OCR程序將圖片上的文字識別為電腦可編輯的文字后&#xff0c;如果導入到excel不加處理&#xff0c;則單個數字過長的文字就會被ex…

html概述和基本結構

html概述 HTML是 HyperText Mark-up Language 的首字母簡寫&#xff0c;意思是超文本標記語言&#xff0c;超文本指的是超鏈接&#xff0c;標記指的是標簽&#xff0c;是一種用來制作網頁的語言&#xff0c;這種語言由一個個的標簽組成&#xff0c;用這種語言制作的文件保存的是…

linux添加三權,基于SELinux的三權分離技術的研究

目前&#xff0c;Linux操作系統已廣泛應用于各種設備和產品中&#xff0c;如服務器、PC機、機頂盒及路由器等。隨著Linux系統的不斷發展和廣泛應用&#xff0c;Linux系統的安全問題也引起越來越多的關注。在Linux操作系統中&#xff0c;存在一個超級用戶即root用戶。root也稱為…

二叉樹、樹和有序樹的區別

樹&#xff1a;子樹沒有左右之分 二叉樹、有序樹:左右有序 二叉樹與有序樹&#xff1a;在只有一棵樹的情況下&#xff0c;二叉樹有左右之分、有序樹無左右之分 另外&#xff1a;二叉樹是有序的&#xff0c;可以為空或一個根節點以及兩個分別稱為左子樹和右子樹的互不相交的二叉…