电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

什么是Python中的順序表

瀏覽:8日期:2022-07-23 13:31:23

1、順序表介紹

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

什么是Python中的順序表

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

所以,訪問指定元素時無需從頭遍歷,通過計算便可獲得對應地址,其時間復雜度為O(1)。

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

圖2這樣的順序表也被稱為對實際數(shù)據(jù)的索引,這是最簡單的索引結構。

2、順序表的結構

什么是Python中的順序表

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

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

什么是Python中的順序表

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

2為分離式結構,表對象里只保存與整個表有關的信息(即容量和元素個數(shù)),實際數(shù)據(jù)元素存放在另一個獨立的元素存儲區(qū)里,通過鏈接與基本表對象關聯(lián)。

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

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

5、元素存儲區(qū)擴充

采用分離式結構的順序表,若將數(shù)據(jù)區(qū)更換為存儲空間更大的區(qū)域,則可以在不改變表對象的前提下對其數(shù)據(jù)存儲區(qū)進行了擴充,所有使用這個表的地方都不必修改。只要程序的運行環(huán)境(計算機系統(tǒng))還有空閑存儲,這種表結構就不會因為滿了而導致操作無法進行。人們把采用這種技術實現(xiàn)的順序表稱為動態(tài)順序表,因為其容量可以在使用中動態(tài)變化。

擴充的兩種策略

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

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

每次擴充容量加倍,如每次擴充增加一倍存儲空間。

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

6、順序表的增刪改查操作的Python代碼實現(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('你輸入的下標不對,請重新輸入n') return 0 # 按元素查下標 def selectByNum(self,num): isContain = 0 for i in range(0,self.length): if self.date[i] == num: isContain = 1 print('你要查找的元素下標是%dn'%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') # 按下標插入數(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 # 按下標刪除數(shù)據(jù) def delectNumByIndex(self,index): if self.length <= 0: print('該順序表內沒有數(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)建順序表對象 seq_t = Sequence_Table() # 插入三個元素 seq_t.addNum(1) seq_t.addNum(2) seq_t.addNum(3) # 打印驗證 seq_t.printAllNum() # 按照索引查找 num = seq_t.selectByIndex(2) print('你要查找的數(shù)據(jù)是%dn' % num) # 按照索引插入數(shù)據(jù) seq_t.insertNumByIndex(4, 1) seq_t.printAllNum() # 按照數(shù)字查下標 seq_t.selectByNum(4) #刪除數(shù)據(jù) seq_t.delectNumByIndex(1) seq_t.printAllNum() if __name__ == '__main__': main()

運行結果為:

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

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

#include<stdio.h>// 1、定義順序表的儲存結構typedef struct{ //用數(shù)組存儲線性表中的元素 int data[100]; // 順序表中的元素個數(shù) int length;}Sequence_table,*p_Sequence_table;// 2、順序表的初始化,void initSequenceTable(p_Sequence_table T){ // 判斷傳過來的表是否為空,為空直接退出 if (T == NULL) { return; } // 設置默認長度為0 T->length = 0;}// 3、求順序表的長度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、按序號查找int selectSequenceTableByIndex(p_Sequence_table T,int index){ if (index>=0&&index<=T->length-1) { return T->data[index]; } printf('你輸入的序號不對,請重新輸入n'); return 0;}// 6、按內容查找是否存在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('你要找的元素的下標是:%dn',i); } } if (isContain == 0) { printf('沒有找到你要的數(shù)據(jù)n'); }}// 7、添加元素(在隊尾添加)void addNumber(p_Sequence_table T,int num){ // 順序表還沒有滿的時候 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)建順序表的結構體 Sequence_table seq_t; // 初始化 initSequenceTable(&seq_t); // 添加數(shù)據(jù) addNumber(&seq_t, 1); addNumber(&seq_t, 2); addNumber(&seq_t, 3); // 打印驗證 printAllNumOfSequenceTable(&seq_t); // 根據(jù)索引下標查內容 int num = selectSequenceTableByIndex(&seq_t, 2); printf('你查的數(shù)據(jù)是:%dn',num); // 插入 insertNumByIndex(&seq_t, 4, 1); printAllNumOfSequenceTable(&seq_t); // 根據(jù)內容查下標 selectSequenceTableByNum(&seq_t, 4); // 根據(jù)下標刪除數(shù)據(jù) delectNum(&seq_t, 1); printAllNumOfSequenceTable(&seq_t); return 0;}

運行結果為:

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

知識點擴展:

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

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

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

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

基于下標(位置)的高效元素訪問和更新,時間復雜度應該是O(1);

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

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

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

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

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

以上就是什么是Python中的順序表的詳細內容,更多關于Python中順序表詳解的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 阻燃剂-氢氧化镁-氢氧化铝-沥青阻燃剂-合肥皖燃新材料 | 货车视频监控,油管家,货车油管家-淄博世纪锐行电子科技 | 模温机-油温机-电加热导热油炉-工业冷水机「欧诺智能」 | 合金ICP光谱仪(磁性材料,工业废水)-百科 | 超声波反应釜【百科】-以马内利仪器 | 塑胶跑道_学校塑胶跑道_塑胶球场_运动场材料厂家_中国塑胶跑道十大生产厂家_混合型塑胶跑道_透气型塑胶跑道-广东绿晨体育设施有限公司 | 无锡网站建设-做网站-建网站-网页设计制作-阿凡达建站公司 | 高效复合碳源-多核碳源生产厂家-污水处理反硝化菌种一长隆科技库巴鲁 | 三氯异氰尿酸-二氯-三氯-二氯异氰尿酸钠-优氯净-强氯精-消毒片-济南中北_优氯净厂家 | 水质传感器_水质监测站_雨量监测站_水文监测站-山东水境传感科技有限公司 | 广州中央空调回收,二手中央空调回收,旧空调回收,制冷设备回收,冷气机组回收公司-广州益夫制冷设备回收公司 | ph计,实验室ph计,台式ph计,实验室酸度计,台式酸度计 | 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 | 杭州货架订做_组合货架公司_货位式货架_贯通式_重型仓储_工厂货架_货架销售厂家_杭州永诚货架有限公司 | 工作心得_读书心得_学习心得_找心得体会范文就上学道文库 | 咖啡加盟,咖啡店加盟连锁品牌-卡小逗| 西点培训学校_法式西点培训班_西点师培训_西点蛋糕培训-广州烘趣西点烘焙培训学院 | 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 吊篮式|移动式冷热冲击试验箱-二槽冷热冲击试验箱-广东科宝 | HV全空气系统_杭州暖通公司—杭州斯培尔冷暖设备有限公司 | 铝单板_铝窗花_铝单板厂家_氟碳包柱铝单板批发价格-佛山科阳金属 | 无刷电机_直流无刷电机_行星减速机-佛山市藤尺机电设备有限公司 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 明渠式紫外线杀菌器-紫外线消毒器厂家-定州市优威环保 | 垃圾清运公司_环卫保洁公司_市政道路保洁公司-华富环境 | 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 深圳市超时尚职业培训学校,培训:月嫂,育婴,养老,家政;化妆,美容,美发,美甲. | 蜘蛛车-登高车-高空作业平台-高空作业车-曲臂剪叉式升降机租赁-重庆海克斯公司 | 物流之家新闻网-最新物流新闻|物流资讯|物流政策|物流网-匡匡奈斯物流科技 | 汽车水泵_汽车水泵厂家-瑞安市骏迪汽车配件有限公司 | 工业用品一站式采购平台|南创工品汇-官网|广州南创 | 杭州用友|用友软件|用友财务软件|用友ERP系统--杭州协友软件官网 | 井式炉-台车式回火炉-丹阳市电炉厂有限公司| 电缆接头_防水接头_电缆防水接头_防水电缆接头_上海闵彬 | 座椅式升降机_无障碍升降平台_残疾人升降平台-南京明顺机械设备有限公司 | 超声波流量计_流量标准装置生产厂家 _河南盛天精密测控 | 不锈钢搅拌罐_高速搅拌罐厂家-无锡市凡格德化工装备科技有限公司 | 二手色谱仪器,十万分之一分析天平,蒸发光检测器,电位滴定仪-湖北捷岛科学仪器有限公司 | 大_小鼠elisa试剂盒-植物_人Elisa试剂盒-PCR荧光定量试剂盒-上海一研生物科技有限公司 | ORP控制器_ORP电极价格-上优泰百科 | 有声小说,听书,听小说资源库-听世界网 | 穿线管|波纹穿线管|包塑金属软管|蛇皮管?闵彬专注弱电工程? |