算法的五個基本特性:輸入(0-多個輸入)、輸出(1-多個輸出)、有窮性(算法程序的運行時間是有限的)、確定性(算法中的每個程序步驟都必須有明確的定義,不允許有模棱兩可的多義性)、可行性(針對實際問題而設計的算法,執行后能得到滿意的結果)。算法設計的要求:可讀性(便於閱讀)、健壯性(一個算法對不合理數據的反應能力和處理能力)、時間效率高和存儲量低。
時間復雜度O(f(n))=T(n)(語句總的執行次數)的推導:用常熟1取代運行時間中的所有加法常數、在修改后的函數f(n)(增長率與運行時間函數的增長率相同)中只保留最高階項、如果最高階項不是1則去除與這個項相乘的常數,從而得到大O階。空間復雜度S(n)=O(f(n)),n為問題規模,f(n)為語句關於n所占存儲空間的函數。復雜度(時間復雜度)。
線性表的自定義函數格式:InitList(*L):初始化操作,建立一個空的線性表L。ListEmpty(L):判斷線性表是否為空表,若線性表為空表返回ture,否則返回false。ClearList(*L):將線性表清空。GetElem(L,I,*e):將線性表L中的第i個位置元素值返回給e。LocateElem(L,e):在線性表L中查找與給定值e相等的元素,如果查找成功,返回該元素在線性表中的序號(線性表的序號從1開始)表示成功,否則返回0表示失敗。ListInsert(*L,i,e):在線性表的第i個位置插入元素e。ListDelete(*L,i,*e):刪除線性表第i個位置元素,並用e返回其值。ListLength(L):返回線性表L的元素個數。
順序存儲結構線性表的地址計算方法:LOC(ai)=LOC(a1)+(i-1)*C(C為元素的存儲單元即字節),通過這個公式可以計算出線性表任意位置的地址,存儲時間性能為O(1),稱之為隨機會存儲結構。
順序存儲結構線性表的優點:可以快速的存取表中任意位置的元素、無需增加額外的存儲空間,缺點:插入和刪除操作需要移動大量的元素、當線性表長度變化過大時難以確定存儲空間的容量、容易造成存儲空間的碎片化。
鏈式存儲結構線性表:把存儲數據元素信息的域稱為數據域,把存儲直接后繼位置的域為指針域,指針域中存儲的信息稱為指針或鏈,由這兩部位組成的數據元素稱為存儲映像,稱為結點。單鏈表每個結點中只2包含一個指針域。頭指針是鏈表指向第一個f結點的指針,頭結點放在第一個元素的結點之前,數據域一般無意義(可用來存放鏈表長度),頭結點不一定是鏈表的必要元素。對於插入或刪除越頻繁的操作,單鏈表的效率優勢就越是明顯。
靜態鏈表:用數組構成的鏈表,第一個元素和最后一個元素的data不存放數據。將未使用的數據元素稱為備用鏈表。數組的第一個元素(含有完整信息的結點)的游標存放備用鏈表的第一個結點的下標。數組的最后一個元素的游標存放第一個有數值的元素的下標。對靜態鏈表的操作:改游標。靜態鏈表的優點:在插入和刪除操作時,只需要修改游標,不需要移動元素。缺點:沒有解決連續存儲分配(數組)帶來的表長難以確定的問題、失去了順序存儲結構隨機存取的特性。
判斷鏈表有沒有環有2種方法:判斷步數相同法:一個指針一直下移另一個指針不斷重新從頭開始下移到相同位置判斷步數是否相同。指針快慢法:一個指針速度正常另一個速度是它的2倍,判斷位置是否相同。
