自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

懂點(diǎn)算法之二——順序表

開(kāi)發(fā) 前端 算法
對(duì)于開(kāi)發(fā)而言,數(shù)組是我們經(jīng)常打交道的數(shù)據(jù)類(lèi)型,那么它的內(nèi)部存儲(chǔ)結(jié)構(gòu)是怎樣的呢?我們將進(jìn)行詳細(xì)介紹。

[[407946]]

本文轉(zhuǎn)載自微信公眾號(hào)「前端萬(wàn)有引力」,作者一川。轉(zhuǎn)載本文請(qǐng)聯(lián)系前端萬(wàn)有引力公眾號(hào)。

寫(xiě)在前面

對(duì)于開(kāi)發(fā)而言,數(shù)組是我們經(jīng)常打交道的數(shù)據(jù)類(lèi)型,那么它的內(nèi)部存儲(chǔ)結(jié)構(gòu)是怎樣的呢?我們將進(jìn)行詳細(xì)介紹。

線性表

線性表是最基本、最簡(jiǎn)單,也是最常用的一種數(shù)據(jù)結(jié)構(gòu),線性表就是n個(gè)具有相同特性的數(shù)據(jù)元素的有序數(shù)列。

前驅(qū)元素:若A元素在B元素的前面,則稱(chēng)A為B的前驅(qū)元素。

后驅(qū)元素:若B元素在A元素的后面,則稱(chēng)B為A的后驅(qū)元素。

線性表的分類(lèi):線性表中數(shù)據(jù)存儲(chǔ)的方式是分為順序存儲(chǔ)和鏈?zhǔn)酱鎯?chǔ),其中:

  • 順序存儲(chǔ)是用一段地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)線性表的數(shù)據(jù)元素。
  • 鏈?zhǔn)酱鎯?chǔ)是用一段地址不連續(xù)的存儲(chǔ)單元存儲(chǔ)數(shù)據(jù),而使用結(jié)點(diǎn)進(jìn)行連接查詢(xún)地址。

隨機(jī)訪問(wèn):由于線性表存儲(chǔ)在連續(xù)的內(nèi)存位置,因此可以通過(guò)它們的索引來(lái)計(jì)算內(nèi)存地址,以便隨機(jī)訪問(wèn)數(shù)據(jù)。

順序表

順序表的存儲(chǔ)方式其實(shí)就是在內(nèi)存中找到空位置后進(jìn)行占位,然后將數(shù)據(jù)元素依次進(jìn)行存放到空位置。

是不是聽(tīng)起來(lái)有點(diǎn)像數(shù)組的結(jié)構(gòu),對(duì)的,數(shù)據(jù)就是一種線性表結(jié)構(gòu)。因此我們可以使用數(shù)組進(jìn)行表示順序表,線性表在邏輯結(jié)構(gòu)上相鄰的數(shù)據(jù)元素存儲(chǔ)在相鄰的物理存儲(chǔ)單元中,即通過(guò)數(shù)據(jù)元素物理存儲(chǔ)的相鄰關(guān)系來(lái)反映數(shù)據(jù)元素間邏輯上的相鄰關(guān)系。

數(shù)組的長(zhǎng)度是存放線性表的存儲(chǔ)空間的長(zhǎng)度,分配存儲(chǔ)后這個(gè)量一般是不變的。線性表的長(zhǎng)度是線性表中數(shù)據(jù)元素的個(gè)數(shù),隨著線性表中插入和刪除操作的進(jìn)行,這個(gè)量是變化的。切記,在任何時(shí)刻線性表的長(zhǎng)度應(yīng)該小于等于數(shù)組的長(zhǎng)度。

  1. class SequenceList{ 
  2.   
  3.   constructor(){ 
  4.     // 存儲(chǔ)元素的數(shù)組 
  5.     this.elemList = []; 
  6.     // 當(dāng)前順序表中的元素個(gè)數(shù) 
  7.     this.elemLength = 0; 
  8.   } 
  9.   // 將一個(gè)線性表置為空表 
  10.   clear(){ 
  11.     this.elemLength = 0; 
  12.   } 
  13.   // 判斷當(dāng)前線性表是否為空表 
  14.   isEmpty(){ 
  15.     return this.elemLength === 0; 
  16.   } 
  17.   // 獲取當(dāng)前線性表的長(zhǎng)度 
  18.   length(){ 
  19.     return this.elemLength; 
  20.   } 
  21.   // 向線性表中添加元素 
  22.   insert(elem){ 
  23.     this.elemList[this.elemLength++] = elem; 
  24.   } 
  25.  
  26.   // 在第i個(gè)元素插入元素elem 
  27.   insertIndex(i,elem){ 
  28.     // 先將i索引位置的元素及其后面位置的元素依次向后移動(dòng)一位 
  29.     for(let index = this.elemLength - 1; index > i; index--){ 
  30.       this.elemList[index] = this.elemList[index-1]; 
  31.     } 
  32.     // 把elem元素存放在i索引位置 
  33.     this.elemList[i] = elem; 
  34.   } 
  35.  
  36.   // 刪除指定位置i處的元素后,返回該元素 
  37.   remove(i){ 
  38.     // 記錄索引i處的值 
  39.     let current = this.elemList[i]; 
  40.     // 索引i后面元素依次向前移動(dòng)一位即可 
  41.     for(let index = i; index < this.elemList - 1; index++){ 
  42.       this.elemList[index] = this.elemList[index+1]; 
  43.     } 
  44.     // 元素個(gè)數(shù)-1 
  45.     this.elemLength--; 
  46.     return current
  47.   } 
  48.  
  49.   // 查找elem元素首次出現(xiàn)在順序表的位置 
  50.   indexOf(elem){ 
  51.     for(let i = 0; i< this.elemLength; i++){ 
  52.       if(this.elemList[i] === elem){ 
  53.         return i; 
  54.       } 
  55.       return -1; 
  56.     } 
  57.   } 

數(shù)組的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  • 在內(nèi)存空間的利用率高
  • 查詢(xún)?cè)匦矢撸ㄟ^(guò)元素下標(biāo)進(jìn)行存取

缺點(diǎn):

  • 插入和刪除元素效率低。(在數(shù)組中間插入或刪除元素時(shí),需要先移動(dòng)遍歷整個(gè)表才能操作元素并重新排序)
  • 有空間長(zhǎng)度限制,不能擴(kuò)增線性表長(zhǎng)度。(當(dāng)存取元素長(zhǎng)度大于順序表的元素個(gè)數(shù)時(shí),會(huì)出現(xiàn)“溢出”;當(dāng)元素長(zhǎng)度小于預(yù)先分配的空間時(shí),空間浪費(fèi)嚴(yán)重)

小結(jié)

本篇文章是《懂點(diǎn)算法》系列的第二篇文章,主要講述的線性表的第一類(lèi)順序存儲(chǔ),以及介紹了如何實(shí)現(xiàn)順序存儲(chǔ)。

 

責(zé)任編輯:武曉燕 來(lái)源: 前端萬(wàn)有引力
相關(guān)推薦

2021-06-28 06:15:14

算法Algorithm時(shí)間空間復(fù)雜度

2021-01-18 05:33:08

機(jī)器學(xué)習(xí)前端算法

2009-08-11 14:30:32

C#數(shù)據(jù)結(jié)構(gòu)與算法

2023-04-04 08:01:00

java坐標(biāo)距離

2013-12-24 09:38:50

asm.jsJavascript

2022-03-04 15:43:36

文件管理模塊Harmony鴻蒙

2022-05-09 11:52:38

Java卡片服務(wù)卡片

2021-10-11 11:58:41

Channel原理recvq

2021-12-01 07:02:16

虛擬化LinuxCPU

2021-01-21 05:22:36

排序算法選擇

2021-02-15 15:36:20

Vue框架數(shù)組

2021-12-17 07:47:37

TCASwiftUI 運(yùn)作

2012-03-15 16:27:13

JavaHashMap

2020-10-15 14:10:51

網(wǎng)絡(luò)攻擊溯源

2018-04-19 14:11:50

2021-10-28 19:27:08

C++指針內(nèi)存

2021-03-19 10:25:12

Java數(shù)據(jù)結(jié)構(gòu)算法

2011-11-28 12:55:37

JavaJVM

2022-04-14 11:35:01

HarmonyOS手表Demo操作系統(tǒng)

2021-01-06 05:31:13

線性表鏈表數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)