數據結構知識點總結_大牛帶你學 | 考研數據結構中線性表中順序結構的知識點總結...

478232959f9dfb780f3d48f36a55b980.png

前言

07498718ddee18c08815fe75fd20a7ea.png

我們都知道,數據結構中邏輯結構可以劃分為線性結構(線性表)與非線性結構兩大類。

存儲結構指的是數據元素在計算機中的存儲及其邏輯關系的表現,也就是在計算機當中對邏輯結構的表示。

線性表的存儲結構主要有順序結構鏈式結構兩種實現形式。本文主要探討基于線性表的順序結構也就是順序表的四種基本操作:初始化插入刪除查找

這些知識點既可能出現在選擇題的考察當中又可以出現在編程大題當中,但是考察的側重點不同,選擇題重點關注操作的時間復雜度以及特性(特別是不同結構的順序表,在實現某種操作時候的效率高低),編程大題只是關注代碼實現能力。

基本知識分析

順序存儲?:

把線性表的結點按邏輯順序依次存放在一組地址連續的存儲單元里。用這種方法存儲的線性表簡稱順序表。(為了便于理解,大家可以近似得把這一段空間理解成一個C語言數組)

由于元素順序排列,順序存儲具有以下性質和特征:

??線性表的邏輯順序與物理順序一致;

??數據元素之間的關系是以元素在計算機內“物理位置相鄰”來體現

a1到an存放情況如圖所示,設每個元素占l個單元長度。(ps:計算機中數組下標實際從0開始)

ai的地址:Loc(ai)=Loc(a1)+(i-1)×1

f060384fb0692e0719ebfac2a5365e6f.png

因此順序表的結構體當中應當包含 一塊連續的地址空間當前存放元素的長度當前分配的存儲容量。由此寫出結構體如下:

typedef struct{
ElemType *elem;//存儲空間基址
int length;//當前長度
int listsize;//當前分配的存儲容量
}SqList;

在了解順序表靜態構造的基礎上,我們可以在這個基礎上構建它的幾個基本操作了。

1

初始化

輸入:MAXSIZE,表示要申請MAXSIZE個元素大小的地址單元。

關鍵代碼:

L->elem=(ElemType *)malloc(MAX_SIZE*sizeof( ElemType));//分配空間
L->length=0;//空表長度為0
L->listsize=MAX_SIZE;//初始存儲容量

2

插入

設n個元素存放在elem[0...length-1]內。

輸入:i,e,表示要在下標為i處插入值為e的元素。

分析插入過程導致的結果:元素數量從length變成了length+1,如果只是簡單地將下標為i處的元素替換成e,會導致原先的元素丟失。因此插入操作可以表述為:(1)將該元素以及該元素之后的所有元素都向后移動一個位。(2)元素大小加1。(3)再將e寫入到下標為i處。比如對于[1,2]這個數組來說,將0插入到第一位,事實上是先使得第一位以及第一位之后的所有元素后移一位,數組變成[1,1,2],然后將0寫入第一位,數組變成[0,1,2]

dcde5517ff6d48823bf04c50789e1830.png

關鍵代碼:

//elem[i...length-1]向后移動for(j = length-1; j >= i; j--){
L->elem[j+1] = L->elem[j]
}//元素大小加1
length++;//e寫入下標為i處
L->elem[i]=e;

3

刪除

設n個元素存放在elem[0...length-1]內。

輸入:i,表示要刪除下標為i處的元素。

分析刪除過程導致的結果:元素數量從length變成了length-1,如果只是簡單地將下標為i處的元素被刪除,會導致此處出現一個空白單元。因此刪除操作可以表述為:(1)將該元素之后的所有元素都向前移動一個位。(2)元素大小減1。將i+1處的元素移動到i處時完成了覆蓋,事實上等同于刪除了i處的元素。比如對于[0,1,2]這個數組來說,將第二個元素移動到第一個,第三個元素移動到第二個也就是數組變成了[1,2,2],但是此時length=2說明數組長度為2,取前2個元素,事實上完成了對0的刪除。

c55c62d4c8e17db4d41d42b1afd7704a.png

關鍵代碼:

//elem[i+1...length-1]向前移動for(j = length-1; j > i; j--){
L->elem[j-1] = L->elem[j]
}//元素大小減1
length--;?

4

查找

設n個元素存放在elem[0...length-1]內。

輸入:e,表示查找值為e的元素。

輸出:i,表示值為e的元素位于下標為i處,若查找不成功,i=-1(或者自己定義其他不屬于0...length-1的值)

分析查找過程:其實是從頭到尾遍歷每一個元素,比較當前元素是否等于查找值e,若等于則返回下標i,當遍歷完畢n個元素還是沒有返回值,說明表中不存在要查詢的元素。

關鍵代碼:

//遍歷比較每一個元素for(i=0; i < length; i++){if(EQ(L->elem[i], e)){?return?i;}
}//遍歷結束沒有返回值,說明不存在return?-1;

9259f118279add91cd0fe571989a653b.png

選擇題角度

重點考察 時間復雜度特性以及執行相關操作的效率

根據前面的分析以及關鍵代碼部分可以觀察到:

1

初始化

關鍵代碼只涉及到一次堆分配malloc以及修改listsize和length,頻度為3,時間復雜度為O(1)

2

插入

關鍵代碼分為三步:(1)修改length,頻度為1,時間復雜度為O(1);(2)elem[i...n-1]向后移動,移動n-i次,頻度為n-i,時間復雜度為O(n);(3)向下標為i處寫入元素e,頻度為1,時間復雜度為O(1)。綜上總的時間復雜度為O(n)

3

刪除

關鍵代碼分為兩步:(1)修改length,頻度為1,時間復雜度為O(1);(2)elem[i+1...n-1]向前移動,移動n-i-1次,頻度為n-i-1,時間復雜度為O(n)。綜上總的時間復雜度為O(n)

4

查找

關鍵代碼:遍歷整個序列比較是否有元素的值為e,遍歷結束時查找不成功則返回-1。顯然若第一個元素就是要找的元素時,只比較一次,若最后一個元素是要找的元素則比較n次,若不存在該元素同樣是比較n次,比較次數的取值范圍為1到n,若每個元素出現頻率相等,查找成功的情況下平均比較次數為(n+1)/2次,時間復雜度為O(n)

綜上,在順序表中,訪問下標為i的元素可以通過 隨機訪問?,如elem[i]獲取,時間復雜度為O(1),但是對于插入和刪除這樣的動態操作時間復雜度都為O(n),順序查找時間復雜度也為O(n)。

編程角度

一個完整的操作函數,是由 健壯性保證?以及 關鍵代碼?兩部分組成的。

1

初始化

malloc可能會有分配失敗的可能,因此要對此進行判斷。

bool InitList(SqList *L){
L->elem=(ElemType *)malloc(MAX_SIZE*sizeof( ElemType));//分配空間if(!L->elem){ return?false;}//基址指針為空時分配失敗
L->length=0;//空表長度為0
L->listsize=MAX_SIZE;//初始存儲容量return?true;
}

2

插入

??對于elem[0...length-1]來說合法的插入范圍應該是0~length,要對輸入的i進行判斷。

??插入會使得表長加1,可能會發生上溢,也就是分配空間不夠,所以要對此進行判斷。

bool ListInsert(SqList *L, int?i, ElemType e){int?j;if(i < 0?|| i > L->length) { return?false;}//i輸入是否合法if(L->length >= L->listsize){
?newbase = (ElemType *)realloc(L->elem, (L->listsize + INCREMENT)*sizeof( ElemType));//分配空間if(!newbase){return?false;}//分配失敗
?L->elem = newbase;
?L->listsize += INCREMENT;
}//是否上溢//elem[i...n-1]向后移動for(j = L->length-1; j >= i; j--){
?L->elem[j+1] = L->elem[j]
}//元素大小加1
L->length++;//e寫入下標為i處
L->elem[i]=e;return?true;
}

3

刪除

??對于elem[0...length-1]來說合法的刪除范圍應該是0~length-1,要對輸入的i進行判斷。

bool ListDelete(SqList *L, int?i, ElemType &e){if(i < 0?|| i > L->length - 1){ retrun false;}//i輸入是否合法
e = *(&L->elem[i]);//elem[i+1...length-1]向前移動for(j = L->length-1; j > i; j--){
?L->elem[j-1] = L->elem[j]
}//元素大小減1
L->length--;return?true;
}

4

查找

int?Locate(SqList* L, ElemType e){int?i;//遍歷比較每一個元素for(i=0; i < L.length; i++){if(EQ(L->elem[i], e)){ return?i;}
}//遍歷結束沒有返回值,說明不存在return?-1;
}

以上就是學長給大家歸納的關于線性表的相關基本操作了。

這里大牛學長幫大家最后總結一下。

??對于增、刪、查、改幾個基本操作,由于順序表元素存在于一片連續空間。每一次做遍歷相關操作的時候,都需要用一個全局的for循環去近似遍歷整個表,因此這幾個操作的時間復雜度都是O(n),即線性的。

? 對于增、刪操作,一定要做好合法性判斷,在編程大題中,合法性判斷是判卷老師對于學生編程素質的重點考察點,你不能說老師一定會關注合法性判斷,但是寫上合法性判斷相關的代碼一定會為你加上一點“印象分”!

今天是2020年8月18日

距離2021考研還有?122?天??

全力以赴,才有資格說盡力。

大牛學長一直在~

e2a66ea0f2784ad661c56ac09556aeb6.png

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

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

相關文章

java矩形翻轉_如何判斷一個點在旋轉后的矩形中

前言最近在做的一款游戲中&#xff0c;用到點與旋轉矩形的判定來獲得一個選中的物體。在此做個記錄如圖所示&#xff0c;黃色的顏料屏是旋轉的&#xff0c;如果不做處理直接判斷點是否在矩形中&#xff0c;那么點擊紅點的位置會判定為選中物體。顯然這是不對的。如果物體沒有旋…

python中用函數設計棧的括號匹配問題_數據結構和算法(Python版):利用棧(Stack)實現括號的匹配問題...

算法數據結構數據結構和算法(Python版)&#xff1a;利用棧(Stack)實現括號的匹配問題在平時寫程序當中&#xff0c;我們會經常遇到程序當中括號的匹配問題&#xff0c;也就是在程序當中左括號的數量和右括號的數量必須相等。如果不相等的話則程序必然會報錯。Hint:在讀取程序的…

python創建空元組_Python——元組的基本語法(創建、訪問、修改、刪除)

原標題&#xff1a;Python——元組的基本語法(創建、訪問、修改、刪除)Python 元組的使用Python 的元組與列表類似&#xff0c;不同之處在于元組的元素不能修改。元組使用小括號 ( )&#xff0c;列表使用方括號 [ ]。元組創建很簡單&#xff0c;只需要在括號中添加元素&#xf…

openssl 生成證書_CentOS7 httpd(Apache)SSL 證書部署

在之前我的文章中我已經搭建了nextcloud服務器&#xff0c;現在我們需要通過域名及https訪問怎么辦1. 進行了簡單的httpd設置后&#xff0c;就可以為網站添加SSL證書功能了。2. 首先得獲取證書&#xff0c;有了證書才能添加。我們采用本地上傳的方式將SSL證書上傳到CentOS上。獲…

FJ的字符串java問題_藍橋杯VIP試題 之 基礎練習 FJ的字符串- JAVA

問題描述FJ在沙盤上寫了這樣一些字符串&#xff1a;A1 “A”A2 “ABA”A3 “ABACABA”A4 “ABACABADABACABA”… …你能找出其中的規律并寫所有的數列AN嗎&#xff1f;輸入格式僅有一個數&#xff1a;N ≤ 26。輸出格式請輸出相應的字符串AN&#xff0c;以一個換行符結束。…

java仿qq gui_Java仿QQ登入頁面

1.[代碼][Java]代碼package com.myqq.frame;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Cursor;import java.awt.FlowLayout;import java.awt.Font;import java.awt.GridLayout;import java.awt.Image;import java.awt.event.MouseAdapter;import ja…

python數據預處理 重復行統計_Python數據分析之數據預處理(數據清洗、數據合并、數據重塑、數據轉換)學習筆記...

1. 數據清洗1.1 空值和缺失值的處理?空值一般表示數據未知、不適用或將在以后添加數據。缺失值是指數據集中某個或某些屬性的值是不完整的。?一般空值使用None表示&#xff0c;缺失值使用NaN表示1.1.1 使用isnull()和notnull()函數?可以判斷數據集中是否存在空值和缺失值1.1…

java編寫系統登錄界面_java 登陸界面怎么寫,連接數據庫后

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓界面是package 界面類;import javax.jws.soap.SOAPBinding.Use;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing…

python如何復制oracle數據_Python使用cx_Oracle模塊將oracle中數據導出到csv文件的方法...

本文實例講述了Python使用cx_Oracle模塊將oracle中數據導出到csv文件的方法。分享給大家供大家參考。具體實現方法如下&#xff1a;# Export Oracle database tables to CSV files# FB36 - 201007117import sysimport csvimport cx_Oracleconnection raw_input("Enter Or…

JAVA構造函數是不是封裝_Java 封裝與構造函數

面向對象思想思想的三個特征&#xff1a;封裝&#xff0c;繼承&#xff0c;多態。封裝&#xff1a;表現&#xff1a;函數就是一個最基本的封裝體&#xff0c;類也是一個封裝體。好處&#xff1a;1、提高了代碼的復用性&#xff0c;2、隱藏了實現細節&#xff0c;可以對外提供可…

python獲取mysql數據為excel中的sheet_python 從excel、csv、mysql、txt獲取數據源

使用python進行數據分析工作的第一步是獲取數據源&#xff0c;數據源來可能來自于excel、txt、csv文件、mysql數據庫。分別看看這些數據源怎么導入到python中。1. Excel 數據源導入python首先導入pandas 模塊import pandas as pdexcel 導入格式為&#xff1a;pd.read_excel( 路…

我的世界seus光影java版下載_我的世界0.17SEUS PE光影材質包(水反高清)下載

我的世界0.17SEUS PE光影材質包已經震撼發布&#xff0c;隨著我的世界pe0.17系列版本瘋狂的出現&#xff0c;很多玩家都有點開始不適應了&#xff0c;畢竟這個更新的頻率和速度太快了&#xff0c;0.16.0版本還沒有玩夠了&#xff0c;下面給大家提供我的世界0.17SEUS PE光影材質…

針式打印機風格英文字體_可愛漂亮的圣誕節和新年賀卡藝術字體推薦!

圣誕節即將到來&#xff0c;各種相應的促銷活動和宴會搞起來&#xff0c;今天macz小編為您帶來幾款風格可愛漂亮的圣誕節和新年賀卡藝術字體推薦&#xff01;可以用于卡片、海報、邀請函、徽標、產品介紹、T恤等&#xff0c;效果魅力非常哦&#xff01;可愛漂亮的圣誕節和新年賀…

golang mysql curd_用 golang 造了個 curd api 的輪子

最近需要寫個接口的項目 準備順便熟悉一下 golang在 github 找了下 golang 的 resetful 接口項目 大部分需要對每張表定義一個 model 文件所以就造了個輪子 不需要定義 model 類型的 curd 接口基于 gin 框架 只支持 mysql只需要改下 config/db.go 數據庫配置文件就能直接 go ru…

miniui展示日歷能點擊_2020年日歷設計,除了366天有新字體,還有新形式

點擊上方藍字&#xff0c;把我設置為星標☆吧今天是12月1日&#xff0c;距離2020年還有最后一個月。在我們度過的日子中&#xff0c;我們應該銘記每一天&#xff0c;每一個日子。講究儀式感的人&#xff0c;才是生活真正的智者。那么&#xff0c;對于2020年的日歷&#xff0c;應…

fopen php 讀取_PHP使用fopen與file_get_contents讀取文件實例分享

php中讀取文件可以使用fopen和file_get_contents這兩個函數&#xff0c;二者之間沒有本質區別&#xff0c;只是前者讀取文件的php代碼相比后者要復雜一點。本文章通過實例向大家講解fopen和file_get_contents讀取文件的實現代碼。需要的碼農可以參考一下。fopen讀取文件的代碼如…

php外部對象如何使用方法,php面向對象全攻略 (三)特殊的引用“$this”的使用...

7.特殊的引用“$this”的使用現在我們知道了如何訪問對象中的成員&#xff0c;是通過“對象->成員”的方式訪問的&#xff0c;這是在對象的外部去訪問對象中成員的形式&#xff0c;那么如果我想在對象的內部&#xff0c;讓對象里的方法訪問本對象的屬性&#xff0c;或是對象…

python編程制作接金幣游戲_一個簡單的pygame接金幣游戲

左右鍵控制小人移動去接空中下來的金幣&#xff0c;接住金幣得5分&#xff0c;接不住游戲結束&#xff0c;金幣速度會隨著level的關數而越來越快import pygame,sys,os,randompygame.init()class rect():#畫出小人def __init__(self,filename,initial_position):self.imagepygam…

php 126怎么設置發送郵箱驗證碼,phpmailer發送網易126郵箱的例子

本文介紹下&#xff0c;使用phpmailer發送網易126.com郵件的例子&#xff0c;有需要的朋友參考下。使用PHPMailer類發郵件的例子&#xff1a;IsSMTP();//郵件服務器$mail->Host "smtp.126.com";$mail->SMTPDebug 0;//使用SMPT驗證$mail->SMTPAuth true;/…

容器中apscheduler不執行_APScheduler:定時任務框架

APScheduler:定時任務框架安裝文檔: https://apscheduler.readthedocs.io/en/stable/userguide.html安裝$ pip install apscheduler>>> import apscheduler>>> apscheduler.version3.6.3組件APScheduler由一下四部分組成triggers:觸發器,指定定時任務執行的時…