資料結構與演算法之美06

2022-09-05 10:00:09 字數 2164 閱讀 5843

個人學習筆記總結,詳見資料結構與演算法之美(度娘)

線性表:

非線性表:

陣列

1、儲存結構:鏈式儲存,前驅後繼關聯

2、操作:

crud(前後索引關聯,涉及最優最糟問題)

特點:非常低效

查詢操作:

了解其儲存方式,即查詢就是通過陣列下標進行。

插入操作:

假設陣列的長度為n,現在,如果我們需要將乙個資料插入到陣列中的第k個位置。為了把第k個位置騰出來,給新來的資料,我們需要將第k~n這部分的元素都順序地往後挪一位。那插入操作的時間複雜度是多少呢?

如果在陣列的末尾插入元素,那就不需要移動資料了,這時的(最優)時間複雜度為o(1)。但如果在陣列的開頭插入元素,那所有的資料都需要依次往後移動一位,所以最壞時間複雜度是o(n)。因為我們在每個位置插入元素的概率是一樣的,所以平均情況時間複雜度為(1+2+.n)/n=o(n)。

如果陣列中的資料是有序的,我們在某個位置插入乙個新的元素時,就必須按照剛才的方法搬移k之後的資料。但是,如果陣列中儲存的資料並沒有任何規律,陣列只是被當作乙個儲存資料的集合。在這種情況下,如果要將某個陣列插入到第k個位置,為了避免大規模的資料搬移,我們還有乙個簡單的辦法就是,直接將第k位的資料搬移到陣列元素的最後,把新的元素直接放入第k個位置。例:假設陣列a[10]中儲存了如下5個元素:a,b,c,d,e。我們現在需要將元素x插入到第3個位置。我們只需要將c放入到a[5],將a[2]賦值為x即可。最後,陣列中的元素如下:a,b,x,d,e,c。

刪除操作:

跟插入資料類似,如果我們要刪除第k個位置的資料,為了記憶體的連續性,也需要搬移資料,不然中間就會出現空洞,記憶體就不連續了。 和插入類似,如果刪除陣列末尾的資料,則最好情況時間複雜度為o(1);如果刪除開頭的資料,則最壞情況時間複雜度為o(n);平均情況時間複雜度也為o(n)。

實際上,在某些特殊場景下,我們並不一定非得追求陣列中資料的連續性。如果我們將多次刪除操作集中在一起執行,刪除的效率是不是會提高很多呢? 例:

陣列a[1]中儲存了8個元素:a,b,c,d,e,f,g,h。現在,我們要依次刪除a,b,c三個元素。

為了避免d,e,f,g,h這幾個資料會被搬移三次,我們可以先記錄下已經刪除的資料。每次的刪除操作並不是真正地搬移資料,只是記錄資料已經被刪除。當陣列沒有更多空間儲存資料時,我們再觸發執行一次真正的刪除操作,這樣就大大減少了刪除操作導致的資料搬移。

訪問陣列越界問題:

即訪問陣列以外的資源;

容器能否完全替代陣列?

針對陣列型別,很多語言都提供了容器類,比如j**a中的arraylist、c++stl中的ector。在專案開發中,什麼時候適合用陣列,什麼時候適合用容器呢? arraylist與陣列相比,有哪些優勢呢? arraylist的優勢就是可以將很多陣列操作的細節封裝起來。比如前面提到的陣列插入、刪除資料時需要搬移其他資料等。另外,它還有乙個優勢,就是支援動態擴容。 陣列本身在定義的時候需要預先指定大小,因為需要分配連續的記憶體空間。如果我們申請了大小為10的組,當第11個資料需要儲存到陣列中時,我們就需要重新分配一塊更大的空間,將原來的資料複製過去,然後再將新的資料插入。

注意 因為擴容操作涉及記憶體申請和資料搬移,是比較耗時的。所以,如果事先能確定需要儲存的資料大小,最好在建立arraylist的時候事先指定資料大小。

例:

arraylistusers = new arraylist(10000);

for (int i = 0; i < 10000; ++i)

1.j**a arraylist無法儲存基本型別,比如int、long,需要封裝為integer、long類,而autoboxing、unboxing則有一定的效能消耗,所以如果特別關注效能,或者希望使用基本型別,就可以選用陣列。 2.如果資料大小事先已知,並且對資料的操作非常簡單,用不到arraylist提供的大部分方法,也可以直接使用陣列。 3.還有乙個是我個人的喜好,當要表示多維陣列時,用陣列往往會更加直觀。比如object array;而用容器的話則需要這樣定義:arraylistarray。

陣列下標問題:

《資料結構與演算法之美》06 佇列

一 概念 佇列 先進者先出。與棧一樣,也是一種受限的線性表,同樣有兩個基本操作 入隊和出隊。二 佇列實現 佇列有兩種實現方式 順序佇列和鏈式佇列。順序佇列 用陣列實現的佇列叫作順序佇列。需要兩個指標 head指標和 tail 指標,分別指向隊頭和隊尾。隨著入隊和出隊操作,head和 tail 會移到...

資料結構與演算法之美

什麼是資料結構?什麼是演算法 狹義重點 複雜度分析 方法 邊學邊練,適度刷題 複雜度分析 時間複雜度 常見時間複雜度 非多項式量級 非常低效的演算法 空間複雜度 漸進空間複雜度,表示演算法的儲存空間和資料規模的增長關係 最好情況時間複雜度 理想情況的時間複雜度 最壞情況時間複雜度 最糟糕的情況下的時...

資料結構與演算法之美 開篇

資料結構與演算法,是計算機的核心課程之一,是程式設計師武功體系的內功,想成為武林高手必須內功過硬,作為乙個非科班碼農,面試時因為內功不強而碰壁數次,使我真實的體驗到學好資料結構與演算法的重要性,為了不在這個方面繼續碰壁,也為了能在軟體開發工程師的道路上走的更遠更快,我決心集中精力學習突破這道關口 以...