寒假:2
今天寫了trapping rain water,
發現了,有了一些儲備的數學知識,很多問題會更容易抽象,也更容易找到解決辦法。比如解決trw時的抽象出的極值觀點。
發現了,算法是一點一點勾勒出來的,把問題一步步抽象,一步步解決。
知道了算法的時空復雜度的概念,對算法這個概念也有了更深的理解。
具體的,在寫trw時,寫出了一個找一個數組中的極大值的函數,求兩個極大值之間的存水量的函數,以及一組數求和函數。
附件:知識點們
復雜度 complexity
時間復雜度:一個算法執行耗費的時間(語句執行的次數)關於問題規模n的函數(僅考慮函數類型)
最壞時間復雜度,平均時間復雜度,
時間復雜度與具體參數有關(語句執行次數)
時間復雜度可用於評價算法性能(運行時間長短)(規模n不同時)
1(常數,但不一定小,只是不隨規模變化),n,對數,線性對數,平方,立方,2指數
分別對應普通代碼,二分,循環,分治,雙層循環,三層循環,窮舉查找
空間復雜度:
運行完一個程序需要的存儲空間的大小。包括固定部分(指令空間,數據空間(常量和簡單變量))和可變部分(動態分配的空間,遞歸棧所需的空間:為局部變量分配的空間,包括函數的形參變量和代碼塊內部變量;)。可變部分和算法有關。算法的復雜度指的是算法占用的空間和規模n的關系
一個c或c++編譯的程序占用的內存分為:
棧區stack:由編譯器自動分配或釋放,用於存儲局部變量和函數參數值。分配時的操作方式類似數據結構棧
堆區heap:由程序員通過調用malloc分配和釋放,或者程序結束時由OS回收。不同於數據結構中的堆,分配方式類似於數據結構中的鏈表。
全局區static:靜態數據存儲空間,存儲全局變量和靜態變量。初始化的和未初始化的全局變量和靜變量在兩塊相鄰的區域裏存放。程序結束後由系統釋放。
文字常量區:存放常量字符串。程序結束後由系統釋放
程序代碼區:存放函數體的二進制代碼
堆棧一方面是兩種屬於抽象數據類型的數據結構。堆滿足一定限制的限制結構,棧中元素有先進後出順序的線性結構
(抽象數據類型:自定義的數據類型,有操作範圍,有處理函數)
另一方面,堆棧是兩種類型的存儲區。特點見上。
同時,堆棧又單指棧。
算法的時空復雜度會相互影響,不可兼得。類似的,算法的所有性能之間也存在相互影響,要綜合考慮包括使用頻率,處理數據量的大小,所描述語言的特性,運行機器的系統環境等各方面的因素。
寒假:2