程式的演算法有好有壞,而執行時間和空間占有率是關鍵。
一般使用大o表示法討論執行時間,它指出了最糟糕情況下的執行時間。
使用陣列意味著資料在記憶體中都是相連的(緊靠在一起),就像朋友聚餐,找到地方後又來了乙個朋友,但原來的地方沒有空位置,只得再找乙個可以坐下所有人的地方,但是如果又來了乙個朋友,而之前的地方也沒有空位置,那麼又得再次轉移,太麻煩!而且記憶體轉移很是耗時。一種解決之道是「預留位置」,提前找個有10個位置的地方,即向計算機申請10個記憶體大小空間,但是存在以下缺點:
這種問題,可使用鍊錶解決
鍊錶中新增元素也很容易,只需將其放入記憶體,並將其位址儲存到前乙個元素中。
但是鍊錶也有其缺點:不能直接讀取鍊錶中的元素,因為你不知道它所在的位址,必須訪問元素#1,從中獲取元素#2的位址,在訪問元素#2並從中獲取元素#3的位址,依次類推。如果同時讀取所有的元素時,鍊錶的效率很高。鍊錶是順序訪問的。
優勢在於插入、刪除
陣列與鍊錶不同,我們是知道每個元素的位址的,因為它們的位址是相連的,那麼只需要執行簡單的數**算就可以了。例如陣列中第乙個元素的位址為00,那麼第5個元素的位址就是04。陣列是隨機訪問的。
優勢在於查詢、隨機訪問
演算法學習 大O表示法
上一節我們使用了兩種不同的方式來獲得兩個數的最大公約數,那麼如何判斷我們應該使用哪一種方式呢?這裡就涉及到了演算法的時間複雜度 空間複雜度 穩定性等幾個方面的因素,這次我們要討論的大o表示法就是用來表示時間複雜度。大o表示法法讓你能夠比較運算元,它指出了演算法執行時間的增速 演算法 在開始學習之前請...
演算法學習筆記 鍊錶與陣列
1.陣列,所有元素都連續的儲存於一段記憶體中,且每個元素占用的記憶體大小相同。這使得陣列具備了通過下標快速訪問資料的能力。但連續儲存的缺點也很明顯,增加容量,增刪元素的成本很高,時間複雜度均為 o n 增加陣列容量需要先申請一塊新的記憶體,然後複製原有的元素。如果需要的話,可能還要刪除原先的記憶體。...
演算法學習筆記 樹狀陣列
樹狀陣列 binary indexed trees 是一種可以支援單點修改,較快維護字首和的資料結構。他的實現方式是用乙個陣列維護乙個 樹狀 的結構 如下圖所示 記錄一些區間的區間和,實現快速計算字首和。能看到這裡的同學應該已經對字首和不陌生了。本片部落格就不再贅述 lowbit 操作是表達二進位制...