日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线性表及其逻辑和存储结构(二级)

發布時間:2024/4/13 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线性表及其逻辑和存储结构(二级) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

從線性表開始,我們首先要知道線性表及其結構,線性表有哪些結構,邏輯結構和存儲結構,我們主要講兩種存儲結構,一個是采用數組的方式,手動來寫一下JAVA里面的ArrayList,鏈表里面我們講了一個單鏈表,我們學過了LinkedList,這個底層采用的不是單鏈表,而是雙鏈表,我們會寫一個簡單的單鏈表的結構,怎么對單鏈表做簡單的增刪改查操作,但是要明確他不是針對LinkedList的其他鏈表有雙向鏈表,單鏈表是單個方向的,還有循環的,收尾相連,JAVA的LinkedList使用的是雙向鏈表,Java中哪些類用到了線性表呢,Vector: 已經被淘汰了,被ArrayList替換了ArrayList:LinkedList: 對于LinkedList我們有一個擴展的內容,比如大家寫了單鏈表之后呢,大家可以研究一下在LinkList里面它是怎么來實現添加操作的,鏈表里面怎么加5個數據,增加5個元素,內存里面就會生成一個一個的圖,然后代碼就這幾行就夠 我們從頭開始講了,先看第一個什么叫線性表?線性表就是n個類型相同元素的有限數列,通常我們記作(a0,a1,.....an-1),a0開始,一直到an-1,索引一般從0開始,從0開始便于地址的運算,這個大家要明確,怎么理解這句話呢,首先要記住相同數據類型,這點要明確1. 相同數據類型: 就是線性表里面可以放很多的數據,但是他們必須是同一種數據類型,比如說都是數字,都是字符,都是學生,都是商品,都是裝備,但是絕對不可以是線性表里既有數字,又有字符,又有學生,又有商品,不同數據類型是不允許的,因為相同的數據類型在內存里面分配空間的時候占的空間是一樣的,他占的空間是一樣的,便于我們后續的查找定位 2. 序列:什么叫做序列,他的序號要記住,他的序號是從0開始的,每個元素都有一個序號,從0開始,哪怕是鏈表也是有序號的,那對于n個數據元素的線性表里面,他的序號一般稱之為索引,是從0開始,到n-1,大家要明確,序列,有限的序列,序列是指數是有先后順序的,比如ai-1,他的后一個元素就是ai,他是ai的直接前驅,ai是他的直接后繼,唯一沒有前驅的是第一個,唯一沒有后繼的是最后一個,除了第一個和最后一個之外,每個元素有一個唯一的前驅,有一個唯一的直接的后繼,滿足這個條件的就是線性表,3,有限:有限長度是有限的,不能是無限的,長度為n,n是一個有限值,n為0的時候是一個空表生活中有哪些案例?冰糖葫蘆滿足這個特點,我們從這些具體的圖里面,抽象出一個邏輯圖,就是線性表的邏輯結構,每一個點我們稱之為一個節點,這個節點可能代表山楂,可能代表人,可能代表分數,可能代表學生,都是有可能的,下面我們再來看存儲結構,我們講兩個存儲結構,一個叫順序表,叫順序存儲結構 有哪些存儲結構?1. 順序表-順序存儲結構: 特點是在內存中分配連續的空間,只存數據,不存地址,位置就隱含著地址,雖然很熟悉了,還是說明白,一下子分配了連續的分配了空間,每個節點占的空間都是一樣的,我們來指定他的索引,他的長度是7,每個元素占多長啊,那要看是什么數據類型了,可以有重復的數據,分配一個連續的空間,有沒有存地址,沒有才存地址,這一共分配了這么幾個空間,沒有一個浪費的,全部用來存數據的,明確一下這是一塊連續的空間,只存數據,不存地址,他有什么優點,不存地址的話就節省空間了,沒有一個多余的內容,都是數據,滿滿的索引查找效率高,什么意思呢,首地址1024,第二個是1028,因為整數占4個,第7個1068,就是這么來的啊,他這里面最大的優點就是,我想按照索引來獲取,我想獲取第0個,第5個元素花的時間是一樣的,為什么呢,數組的起始地址+每個元素的大小*索引,花的時間都是一樣的,我想知道第0個,當然是按照索引來查的,1024加上每個元素的長度,1024+4*0=1024,你看他找到了吧,我想找第5個,1024+4*5=1044,索引是5的這個,是不是1044,這個時間是特別快的,我要獲取第n個呢,1024+4*n,大家要記住數組最大的優點就是這個,找數據特別的快,這是他的優點,我們這里都有一個相應的說明,有沒有缺點,有,有什么缺點,我要刪除,我們要找索引是2的元素,更新不是刪除,他還占著一個位置,什么叫刪除,我想添加一個元素,就得從后向前移動,所以這是他的一個缺點什么缺點呢?1. 插入和刪除需要大量的移動元素,效率是比較低的2. 因為比如JAVA里面的數組,需要實現分配一塊連續的空間,那這個空間有多大呢,假如我一開始分配了100個,結果你就占了2個,那還有98個是閑置的,就會導致浪費,那有人說那就分配5個唄,萬一不夠了呢,是不是可能不夠,所以這是他的一個缺點,分配多了會導致浪費,分配少了就不夠了,當然不夠我們也有辦法,就是ArrayList不夠了動態的擴容就可以了,但是你要擴容還是要分配更多的空間,還要做一些轉移的操作,這是一個缺點,還有什么缺點呢,我想找索引是3的,索引是5的,直接套這個式子就可以了,當是如果我想看一下我這里面有沒有89這個數,怎么辦啊,不是找索引了,是找值了,只能逐個的比較,這效率是比較低的,大家想一下,如果長度是n,那你的效率好的話,你找的是56,一次就找到了,如果你找的是80,是不是要找到最后,如果我們找的每個節點的概率是一樣的話,如果總的長度是n,你需要找二分之n次,需要找一半,為什么要找一半,我們算一下啊,如果出一個題目讓你算算,數組中按照內容查詢元素的時間復雜度是多少,T(n)=O(n),為什么是O(n)這只是一個規模,這不是一個具體的數,我們來算一下,一共有n個元素,找每個元素的概率是一樣的,他的概率是多少啊,概率是n分之一,找每個元素的概率都是n分之一的,概率相同,每個元素的概率是1/n,請問找第一個元素要花多長時間,找第一個元素第一次就可以了,找索引是3的1+2+3+4次,找第n個的時候,那就需要n次了,這是不是總的次數,把它們加起來(1+2+3+4+....+n),乘以每個元素的概率,乘以1/n,有人說這不好理解那我們這么做,找第一個元素1*(1/n),找第二個元素2*(1/n),找兩次,概率也是n分之一,在加上3*1/n,最后加上n*1/n,和上面的式子一樣的,(1+n)n/2*n,最后等于n/2+1/2,這是平均的查找次數,我們算的不是這一個,我們要的是級別,把1/2的常數項去了,把這個系數去了,我們大家以后要會算時間復雜度,概率相同的情況下要會算,我要把一個元素刪除,他的時間復雜度是多少,那你要看刪除誰呢,你要刪除56,我要把56刪除了,那麻煩大了,那都得動,如果我要是把80刪除,是不是不用動了,同樣按照我們剛才的公式來算舉例: 長度為n的數組中刪除元素,假設每個元素刪除的概率是相同的,問世間復雜是多少?按照我們相同的辦法,最后得到T(n)=(n-1)/2,時間復雜度還是n,T(n)=O(n),這個大家要明白這個就是我們講的順序表的優點和缺點,2. 鏈表-鏈式存儲結構: 我們來看鏈表,鏈式存儲結構,他有什么特點?數據元素的存儲對應不連續的空間,地址是不連續的,我們搜一個單鏈表,找一個圖片,在內存里面是不連續的空間,怎么不連續了,head我們先不管他,這個可能是1024,這個可能是5012,這個可能是2558,這個可能是9999,有沒有規律,完全沒有規律,是不連續的空間,那問題就來了,我這里面存的是A第一個元素,我讀了A之后我怎么找到B,這地址是沒有任何規律,那應該怎么辦,每個節點除了要存數據之外,這里還要存一個5012,引用就是指針,地址讀了這個A之后,根據這個地址跳到這兒來,找到B了,這應該放2558找到C了,C就放9999,這已經是最后一個了,最后一個方null,表明到了末尾了,我想再追加一個元素呢,那你就這么來追加唄,他里面是有值的,值比如我們給個Z,那這個地址是多少,地址是8888,它是最后一個元素,在這里要補上一個null,我們是在最后追加的,關鍵我怎么知道E的后面是這個,把E的null改成8888,注意啊,這8888不是一個數字,是一個地址,就像對象的引用一樣,他就指向Z了,這是我們講的一個單鏈的,他有什么缺點,首先你看,數組里面不要存地址,鏈表里面有額外的地址存儲地址,這個地址是為了找到下一個,鏈表從這個角度來看是要多占一些空間,多占一些空間來指向下一個元素,還有一個,這個是索引為0的,這個是索引為1的,這個是索引為2的,這是索引為3的,這是索引是4的,我想找索引是4的元素,怎么辦,你怎么找到,我們用1024+4*幾有用嗎,地址完全沒有規律,算不出來,不能算,所以第二個缺點,按照索引來查找,只能逐個的從頭開始,我想找索引是4的,就數唄,需要逐個的比較,逐個的后移,不是一次計算到位的,他的效率就是比較低的,你發現他和數組正好相反,但它有個優點,我把這個2刪除怎么辦,我想把B這個元素刪除了,刪除了他,沒有了,后面的不要動,只要做一個操作就行了,前面的就不要寫5012,這個要寫2558,只要你寫個2558他就指向了2558了,A的下一個元素就是C了,而B垃圾回收了,我們做刪除的話,后面需不需要移動啊,不要移動,只是本來就沒有規律,只要給下個指針就可以了,我想再E和C中間加上一個節點,那應該怎么辦,我在C和E之間加一個元素,后面的元素還要動嗎?不用,直接增加一個節點,我們要在C和E之間加一個節點,元素叫K,他沒有加到鏈表里面,我們給K取個地址叫7777,K的地址要指向9999,為什么呢,你這里存的9999相當于指向E,不對啊,你沒有說C的下一個是K啊,C指向的地址就不是9999了,這個指向關系就不存在了,這里應該寫7777,這不就連起來了嗎,在我們的鏈表里面做刪除和添加操作的話,還是比較方便的,需要修改相應的指針就可以了,你想在C和E之間加上一個節點,你是不是要先找到C和E,是不是還得從頭找,這是我們講的一個內容,優點和缺點都已經寫好了優點:1. 插入和刪除靈活,效率比較高,2. 還有一個,鏈表到底是浪費空間還是節省空間呢,他需要存地址,它是浪費空間的,多占用一些空間的,反過來你會發現,他不存在閑置的情況他不會有這種情況,這里面引著一個節點,里面沒有值,然后他又引了一個節點,里邊沒有值,他會不會有這種情況,既然存在著節點,都是有值的所以不會像數組一樣,數組里面一下子分配了10個空間,結果就用了3個,暫時空閑著7個,不用的時候就是一個空的鏈表,一個元素也沒有,從這個角度來說,這個鏈表又是節省空間的,所以以后在面試的時候,鏈表是浪費空間還是節省空間,那要從不同的角度來說,這個就收我們講的鏈表的優點和缺點,包括他的一個特點,我給大家說到這兒,在這里比較細致的說一下,理解成我們實際開發中的數組就可以了

?

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的线性表及其逻辑和存储结构(二级)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。