最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

什么是Python中的順序表

 更新時(shí)間:2020年06月02日 14:36:47   作者:愛喝馬黛茶的安東尼  
在本篇文章里小編給大家整理了一篇關(guān)于Python中順序表詳解的相關(guān)知識(shí)點(diǎn)以及實(shí)例內(nèi)容,需要的朋友們可以參考下。

1、順序表介紹

順序表是最簡(jiǎn)單的一種線性結(jié)構(gòu),邏輯上相鄰的數(shù)據(jù)在計(jì)算機(jī)內(nèi)的存儲(chǔ)位置也是相鄰的,可以快速定位第幾個(gè)元素,中間不允許有空,所以插入、刪除時(shí)需要移動(dòng)大量元素。順序表可以分配一段連續(xù)的存儲(chǔ)空間Maxsize,用elem記錄基地址,用length記錄實(shí)際的元素個(gè)數(shù),即順序表的長(zhǎng)度

上圖1表示的是順序表的基本形式,數(shù)據(jù)元素本身連續(xù)存儲(chǔ),每個(gè)元素所占的存儲(chǔ)單元大小固定相同,元素的下標(biāo)是其邏輯地址,而元素存儲(chǔ)的物理地址(實(shí)際內(nèi)存地址)可以通過存儲(chǔ)區(qū)的起始地址Loc (e0)加上邏輯地址(第i個(gè)元素)與存儲(chǔ)單元大?。╟)的乘積計(jì)算而得,即:Loc(element i) = Loc(e0) + c*i

所以,訪問指定元素時(shí)無需從頭遍歷,通過計(jì)算便可獲得對(duì)應(yīng)地址,其時(shí)間復(fù)雜度為O(1)。

如果元素的大小不統(tǒng)一,則須采用圖2的元素外置的形式,將實(shí)際數(shù)據(jù)元素另行存儲(chǔ),而順序表中各單元位置保存對(duì)應(yīng)元素的地址信息(即鏈接)。由于每個(gè)鏈接所需的存儲(chǔ)量相同,通過上述公式,可以計(jì)算出元素鏈接的存儲(chǔ)位置,而后順著鏈接找到實(shí)際存儲(chǔ)的數(shù)據(jù)元素。注意,圖2中的c不再是數(shù)據(jù)元素的大小,而是存儲(chǔ)一個(gè)鏈接地址所需的存儲(chǔ)量,這個(gè)量通常很小。

圖2這樣的順序表也被稱為對(duì)實(shí)際數(shù)據(jù)的索引,這是最簡(jiǎn)單的索引結(jié)構(gòu)。

2、順序表的結(jié)構(gòu)

一個(gè)順序表的完整信息包括兩部分,一部分是表中的元素集合,另一部分是為實(shí)現(xiàn)正確操作而需記錄的信息,即有關(guān)表的整體情況的信息,這部分信息主要包括元素存儲(chǔ)區(qū)的容量和當(dāng)前表中已有的元素個(gè)數(shù)兩項(xiàng)。

3、順序表的兩種基本實(shí)現(xiàn)方式

1為一體式結(jié)構(gòu),存儲(chǔ)表信息的單元與元素存儲(chǔ)區(qū)以連續(xù)的方式安排在一塊存儲(chǔ)區(qū)里,兩部分?jǐn)?shù)據(jù)的整體形成一個(gè)完整的順序表對(duì)象。一體式結(jié)構(gòu)整體性強(qiáng),易于管理。但是由于數(shù)據(jù)元素存儲(chǔ)區(qū)域是表對(duì)象的一部分,順序表創(chuàng)建后,元素存儲(chǔ)區(qū)就固定了。

2為分離式結(jié)構(gòu),表對(duì)象里只保存與整個(gè)表有關(guān)的信息(即容量和元素個(gè)數(shù)),實(shí)際數(shù)據(jù)元素存放在另一個(gè)獨(dú)立的元素存儲(chǔ)區(qū)里,通過鏈接與基本表對(duì)象關(guān)聯(lián)。

4、元素存儲(chǔ)區(qū)替換

一體式結(jié)構(gòu)由于順序表信息區(qū)與數(shù)據(jù)區(qū)連續(xù)存儲(chǔ)在一起,所以若想更換數(shù)據(jù)區(qū),則只能整體搬遷,即整個(gè)順序表對(duì)象(指存儲(chǔ)順序表的結(jié)構(gòu)信息的區(qū)域)改變了。分離式結(jié)構(gòu)若想更換數(shù)據(jù)區(qū),只需將表信息區(qū)中的數(shù)據(jù)區(qū)鏈接地址更新即可,而該順序表對(duì)象不變。

5、元素存儲(chǔ)區(qū)擴(kuò)充

采用分離式結(jié)構(gòu)的順序表,若將數(shù)據(jù)區(qū)更換為存儲(chǔ)空間更大的區(qū)域,則可以在不改變表對(duì)象的前提下對(duì)其數(shù)據(jù)存儲(chǔ)區(qū)進(jìn)行了擴(kuò)充,所有使用這個(gè)表的地方都不必修改。只要程序的運(yùn)行環(huán)境(計(jì)算機(jī)系統(tǒng))還有空閑存儲(chǔ),這種表結(jié)構(gòu)就不會(huì)因?yàn)闈M了而導(dǎo)致操作無法進(jìn)行。人們把采用這種技術(shù)實(shí)現(xiàn)的順序表稱為動(dòng)態(tài)順序表,因?yàn)槠淙萘靠梢栽谑褂弥袆?dòng)態(tài)變化。

擴(kuò)充的兩種策略

每次擴(kuò)充增加固定數(shù)目的存儲(chǔ)位置,如每次擴(kuò)充增加10個(gè)元素位置,這種策略可稱為線性增長(zhǎng)。

特點(diǎn):節(jié)省空間,但是擴(kuò)充操作頻繁,操作次數(shù)多。

每次擴(kuò)充容量加倍,如每次擴(kuò)充增加一倍存儲(chǔ)空間。

特點(diǎn):減少了擴(kuò)充操作的執(zhí)行次數(shù),但可能會(huì)浪費(fèi)空間資源。以空間換時(shí)間,推薦的方式。

6、順序表的增刪改查操作的Python代碼實(shí)現(xiàn)

# 創(chuàng)建順序表class Sequence_Table(): 
 # 初始化
 def __init__(self):
 self.date = [None]*100
 self.length = 0 
 # 判斷是否已經(jīng)滿了
 def isFull(self): 
 if self.length>100: 
 print("該順序表已滿,無法添加元素") 
 return 1 
 else: 
 return 0 
 # 按下表索引查找
 def selectByIndex(self,index): 
 if index>=0 and index<=self.length-1: 
 return self.date[index] 
 else: 
 print("你輸入的下標(biāo)不對(duì),請(qǐng)重新輸入\n") 
 return 0 
 # 按元素查下標(biāo)
 def selectByNum(self,num):
 isContain = 0 
 for i in range(0,self.length): 
 if self.date[i] == num:
 isContain = 1 
 print("你要查找的元素下標(biāo)是%d\n"%i) 
 if isContain == 0: 
 print("沒有找你你要的數(shù)據(jù)") 
 # 追加數(shù)據(jù)
 def addNum(self,num): 
 if self.isFull() == 0:
 self.date[self.length] = num
 self.length += 1 
 # 打印順序表
 def printAllNum(self): 
 for i in range(self.length): 
 print("a[%s]=%s"%(i,self.date[i]),end=" ") 
 print("\n") 
 # 按下標(biāo)插入數(shù)據(jù)
 def insertNumByIndex(self,num,index): 
 if index<0 or index>self.length: 
 return 0
 self.length += 1 
 for i in range(self.length-1,index,-1):
 temp = self.date[i]
 self.date[i] = self.date[i-1]
 self.date[i-1] = temp
 self.date[index] = num 
 return 1 # 按下標(biāo)刪除數(shù)據(jù)
 def delectNumByIndex(self,index): 
 if self.length <= 0: 
 print("該順序表內(nèi)沒有數(shù)據(jù),不用刪除") 
 for i in range(index,self.length-1):
 temp = self.date[i]
 self.date[i] = self.date[i + 1]
 self.date[i + 1] = temp
 self.date[self.length-1] = 0
 self.length -= 1def main(): # 創(chuàng)建順序表對(duì)象
 seq_t = Sequence_Table() 
 # 插入三個(gè)元素
 seq_t.addNum(1)
 seq_t.addNum(2)
 seq_t.addNum(3) 
 # 打印驗(yàn)證 
 seq_t.printAllNum() 
 # 按照索引查找
 num = seq_t.selectByIndex(2) 
 print("你要查找的數(shù)據(jù)是%d\n" % num) 
 # 按照索引插入數(shù)據(jù)
 seq_t.insertNumByIndex(4, 1)
 seq_t.printAllNum() 
 # 按照數(shù)字查下標(biāo)
 seq_t.selectByNum(4) 
 #刪除數(shù)據(jù)
 seq_t.delectNumByIndex(1)
 seq_t.printAllNum() 
if __name__ == "__main__":
 main()

運(yùn)行結(jié)果為:

a[0]=1 a[1]=2 a[2]=3
你要查找的數(shù)據(jù)是3
a[0]=1 a[1]=4 a[2]=2 a[3]=3
你要查找的元素下標(biāo)是1
a[0]=1 a[1]=2 a[2]=3

7、順序表的增刪改查操作的C語言代碼實(shí)現(xiàn)

#include<stdio.h>
// 1、定義順序表的儲(chǔ)存結(jié)構(gòu)
typedef struct
{
 //用數(shù)組存儲(chǔ)線性表中的元素
 int data[100];
 // 順序表中的元素個(gè)數(shù)
 int length;
}Sequence_table,*p_Sequence_table;
// 2、順序表的初始化,
void initSequenceTable(p_Sequence_table T)
{
 // 判斷傳過來的表是否為空,為空直接退出
 if (T == NULL)
 {
 return;
 }
 // 設(shè)置默認(rèn)長(zhǎng)度為0
 T->length = 0;
}
// 3、求順序表的長(zhǎng)度
int lengthOfSequenceTable(p_Sequence_table T)
{
 if (T==NULL)
 {
 return 0;
 }
 return T->length;
}
// 4、判斷順序表是否已滿
int isFull(p_Sequence_table T)
{
 if (T->length>=100)
 {
 printf("該順序表已經(jīng)裝滿,無法再添加元素");
 return 1;
 }
 return 0;
}
// 5、按序號(hào)查找
int selectSequenceTableByIndex(p_Sequence_table T,int index)
{
 if (index>=0&&index<=T->length-1)
 {
 return T->data[index];
 }
 printf("你輸入的序號(hào)不對(duì),請(qǐng)重新輸入\n");
 return 0;
}
// 6、按內(nèi)容查找是否存在
void selectSequenceTableByNum(p_Sequence_table T,int num)
{
 int isContain = 0;
 for (int i=0; i<T->length; i++)
 {
 if (T->data[i] == num)
 {
 isContain = 1;
 printf("你要找的元素的下標(biāo)是:%d\n",i);
 }
 }
 if (isContain == 0)
 {
 printf("沒有找到你要的數(shù)據(jù)\n");
 }
}
// 7、添加元素(在隊(duì)尾添加)
void addNumber(p_Sequence_table T,int num)
{
 // 順序表還沒有滿的時(shí)候
 if (isFull(T) == 0)
 {
 T->data[T->length] = num;
 T->length++;
 }
}
// 8、順序表的遍歷
void printAllNumOfSequenceTable(p_Sequence_table T)
{
 for (int i = 0; i<T->length; i++)
 {
 printf("T[%d]=%d ",i,T->data[i]);
 }
 printf("\n");
}
//9、插入操作
int insertNumByIndex(p_Sequence_table T, int num,int index)
{
 if (index<0||index>T->length)
 {
 return 0;
 }
 T->length++;
 for (int i = T->length-1; i>index; i--)
 {
 int temp = T->data[i];
 T->data[i] = T->data[i-1];
 T->data[i-1] = temp;
 }
 T->data[index] = num;
 return 1;
}
// 10、刪除元素
void delectNum(p_Sequence_table T,int index)
{
 if (T->length <= 0)
 {
 printf("該順序表中沒有數(shù)據(jù),不用刪除");
 }
 for (int i = index;i<T->length-1; i++)
 {
 int temp = T->data[i];
 T->data[i] = T->data[i+1];
 T->data[i+1] = temp;
 }
 T->data[T->length-1] = 0;
 T->length--;
}
int main(int argc, const char * argv[]) {
 
 // 創(chuàng)建順序表的結(jié)構(gòu)體
 Sequence_table seq_t;
 // 初始化
 initSequenceTable(&seq_t);
 // 添加數(shù)據(jù)
 addNumber(&seq_t, 1);
 addNumber(&seq_t, 2);
 addNumber(&seq_t, 3);
 // 打印驗(yàn)證
 printAllNumOfSequenceTable(&seq_t);
 // 根據(jù)索引下標(biāo)查內(nèi)容
 int num = selectSequenceTableByIndex(&seq_t, 2);
 printf("你查的數(shù)據(jù)是:%d\n",num);
 // 插入
 insertNumByIndex(&seq_t, 4, 1);
 printAllNumOfSequenceTable(&seq_t);
 // 根據(jù)內(nèi)容查下標(biāo)
 selectSequenceTableByNum(&seq_t, 4);
 // 根據(jù)下標(biāo)刪除數(shù)據(jù)
 delectNum(&seq_t, 1);
 printAllNumOfSequenceTable(&seq_t);
 return 0;
}

運(yùn)行結(jié)果為:

T[0]=1 T[1]=2 T[2]=3
你查的數(shù)據(jù)是:3
T[0]=1 T[1]=4 T[2]=2 T[3]=3
你要找的元素的下標(biāo)是:1
T[0]=1 T[1]=2 T[2]=3

知識(shí)點(diǎn)擴(kuò)展:

Python中的list和tuple兩種類型采用了順序表的實(shí)現(xiàn)技術(shù),具有前面討論的順序表的所有性質(zhì)。

tuple是不可變類型,即不變的順序表,因此不支持改變其內(nèi)部狀態(tài)的任何操作,而其他方面,則與list的性質(zhì)類似。

list的基本實(shí)現(xiàn)技術(shù)

Python標(biāo)準(zhǔn)類型list就是一種元素個(gè)數(shù)可變的線性表,可以加入和刪除元素,并在各種操作中維持已有元素的順序(即保序),而且還具有以下行為特征:

基于下標(biāo)(位置)的高效元素訪問和更新,時(shí)間復(fù)雜度應(yīng)該是O(1);

為滿足該特征,應(yīng)該采用順序表技術(shù),表中元素保存在一塊連續(xù)的存儲(chǔ)區(qū)中。

允許任意加入元素,而且在不斷加入元素的過程中,表對(duì)象的標(biāo)識(shí)(函數(shù)id得到的值)不變。

為滿足該特征,就必須能更換元素存儲(chǔ)區(qū),并且為保證更換存儲(chǔ)區(qū)時(shí)list對(duì)象的標(biāo)識(shí)id不變,只能采用分離式實(shí)現(xiàn)技術(shù)。

在Python的官方實(shí)現(xiàn)中,list就是一種采用分離式技術(shù)實(shí)現(xiàn)的動(dòng)態(tài)順序表。這就是為什么用list.append(x) (或 list.insert(len(list), x),即尾部插入)比在指定位置插入元素效率高的原因。

在Python的官方實(shí)現(xiàn)中,list實(shí)現(xiàn)采用了如下的策略:在建立空表(或者很小的表)時(shí),系統(tǒng)分配一塊能容納8個(gè)元素的存儲(chǔ)區(qū);在執(zhí)行插入操作(insert或append)時(shí),如果元素存儲(chǔ)區(qū)滿就換一塊4倍大的存儲(chǔ)區(qū)。但如果此時(shí)的表已經(jīng)很大(目前的閥值為50000),則改變策略,采用加一倍的方法。引入這種改變策略的方式,是為了避免出現(xiàn)過多空閑的存儲(chǔ)位置。

以上就是什么是Python中的順序表的詳細(xì)內(nèi)容,更多關(guān)于Python中順序表詳解的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python實(shí)現(xiàn)矩陣可視化的示例代碼

    Python實(shí)現(xiàn)矩陣可視化的示例代碼

    matplotlib中提供了兩個(gè)矩陣可視化函數(shù),分別是imshow和matshow,本文主要為大家詳細(xì)介紹了如何使用這兩個(gè)函數(shù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • python多線程實(shí)現(xiàn)動(dòng)態(tài)圖繪制

    python多線程實(shí)現(xiàn)動(dòng)態(tài)圖繪制

    這篇文章主要介紹了python多線程實(shí)現(xiàn)動(dòng)態(tài)圖繪制,文章基于Python的相資料展開動(dòng)態(tài)圖的繪制相關(guān)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04
  • Python+PuLP實(shí)現(xiàn)線性規(guī)劃的求解

    Python+PuLP實(shí)現(xiàn)線性規(guī)劃的求解

    線性規(guī)劃(Linear?programming),在線性等式或不等式約束條件下求解線性目標(biāo)函數(shù)的極值問題,常用于解決資源分配、生產(chǎn)調(diào)度和混合問題。本文將利用PuLP實(shí)現(xiàn)線性規(guī)劃的求解,需要的可以參考一下
    2022-04-04
  • 通過實(shí)例簡(jiǎn)單了解Python sys.argv[]使用方法

    通過實(shí)例簡(jiǎn)單了解Python sys.argv[]使用方法

    這篇文章主要介紹了通過實(shí)例簡(jiǎn)單了解Python sys.argv[]使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 使用Python進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)可視化的多種方法與技巧

    使用Python進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)可視化的多種方法與技巧

    可視化是理解和解釋大量數(shù)據(jù)的強(qiáng)大工具之一,而Python作為一種流行的編程語言,提供了豐富的庫(kù)和工具來進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)可視化,本文將介紹一些使用Python進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)可視化的方法與技巧,并提供相應(yīng)的代碼實(shí)例,需要的朋友可以參考下
    2024-05-05
  • python委派生成器的具體方法

    python委派生成器的具體方法

    在本篇內(nèi)容中小編給大家整理了一篇關(guān)于python委派生成器的具體方法內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2022-11-11
  • Python中常用操作字符串的函數(shù)與方法總結(jié)

    Python中常用操作字符串的函數(shù)與方法總結(jié)

    這篇文章主要介紹了Python中常用操作字符串的函數(shù)與方法總結(jié),包括字符串的格式化輸出與拼接等基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-02-02
  • Python實(shí)現(xiàn)光速定位并提取兩個(gè)文件的不同之處

    Python實(shí)現(xiàn)光速定位并提取兩個(gè)文件的不同之處

    如果你經(jīng)常與Excel或Word打交道,那么從兩份表格/文檔中找到不一樣的元素是一件讓人很頭疼的工作。本文就將以兩份真實(shí)的Excel/Word文件為例,講解如何使用Python光速對(duì)比并提取文件中的不同之處
    2022-08-08
  • python計(jì)算機(jī)視覺實(shí)現(xiàn)全景圖像拼接示例

    python計(jì)算機(jī)視覺實(shí)現(xiàn)全景圖像拼接示例

    這篇文章主要為大家介紹了python計(jì)算機(jī)視覺實(shí)現(xiàn)全景圖像拼接示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python入門篇之?dāng)?shù)字

    Python入門篇之?dāng)?shù)字

    本文的主題是 Python 中的數(shù)字。會(huì)詳細(xì)介紹每一種數(shù)字類型,它們適用的各種運(yùn)算符, 以及用于處理數(shù)字的內(nèi)建函數(shù)。在文章的末尾, 簡(jiǎn)單介紹了幾個(gè)標(biāo)準(zhǔn)庫(kù)中用于處理數(shù)字的模塊。
    2014-10-10

最新評(píng)論

南开区| 多伦县| 钟山县| 新巴尔虎右旗| 石泉县| 龙州县| 凌海市| 锡林浩特市| 浮山县| 清流县| 台中市| 九龙城区| 泾阳县| 故城县| 麻城市| 九台市| 洛浦县| 洛浦县| 云浮市| 通榆县| 海林市| 天水市| 东平县| 仪陇县| 怀化市| 卓资县| 稷山县| 卓资县| 五台县| 印江| 水城县| 保定市| 泸定县| 灵石县| 五常市| 河源市| 天气| 安福县| 南川市| 颍上县| 十堰市|