NOIP複賽複習(六)演算法分析與排序模板
演算法分析
演算法分析的目的是預測演算法所需的資源,如計算時間(CPU 消耗)、記憶體空間(RAM 消耗)、通訊時間(頻寬消耗)等,以及預測演算法的執行時間,即在給定輸入規模時,所執行的基本運算元量,或者稱為演算法複雜度。
演算法的執行時間取決於輸入的資料特徵,輸入資料的規模和執行時間的上限(因為執行時間的上限是對使用者的承諾)。演算法分析一般忽略掉那些依賴於機器的常量,而關注執行時間的增長趨勢。一般僅考量演算法在最壞情況下的執行情況,使用 O 記號法表示最壞執行情況的上界。例如:
線性複雜度O(n) 表示每個元素都要被處理一次。
平方複雜度 O(n2)表示每個元素都要被處理 n 次。
復雜度 |
標記符號 |
描述 |
常量(Constant) |
O(1) |
操作的數量為常數,與輸入的資料的規模無關。 |
對數(Logarithmic) |
O(log2n) |
操作的數量與輸入資料的規模 n 的比例是 log2 (n) |
線性(Linear) |
O(n) |
操作的數量與輸入資料的規模 n 成正比。 |
平方(Quadratic) |
O(n2) |
操作的數量與輸入資料的規模 n 的比例為二次平方。 |
立方(Cubic) |
O(n3) |
操作的數量與輸入資料的規模 n 的比例為三次方。 |
指數(Exponential |
O(2n) O(kn) O(n!) |
指數級的操作,快速的增長。 |
不同時間複雜度中元素數量與操作次數的關係圖:
而通常時間復雜度與執行時間有一些常見的比例關係:
復雜度 |
10 |
20 |
50 |
100 |
1000 |
10000 |
100000 |
O(1) |
<1s |
<1s |
<1s |
<1s |
<1s |
<1s |
<1s |
O(log2(n)) |
<1s |
<1s |
<1s |
<1s |
<1s |
<1s |
<1s |
O(n) |
<1s |
<1s |
<1s |
<1s |
<1s |
<1s |
<1s |
O(n*log2(n)) |
<1s |
<1s |
<1s |
<1s |
<1s |
<1s |
<1s |
O(n2) |
<1s |
<1s |
<1s |
<1s |
<1s |
2s |
3-4 min |
O(n3) |
<1s |
<1s |
<1s |
<1s |
20s |
5 hours |
231 days |
O(2n) |
<1s |
<1s |
260 days |
hangs |
hangs |
hangs |
hangs |
O(n!) |
<1s |
hangs |
hangs |
hangs |
hangs |
hangs |
hangs |
O(nn) |
3-4 min |
hangs |
hangs |
hangs |
hangs |
hangs |
hangs |
計算程式碼塊的漸進執行時間,即演算法複雜度的方法有如下步驟:
1、確定決定演算法執行時間的組成步驟。
2、找到執行該步驟的程式碼,標記為 1。
3、檢視標記為 1 的程式碼的下一行程式碼。如果下一行程式碼是一個迴圈,則將標記 1 修改為 1 倍於迴圈的次數 1 * n。如果包含多個巢狀的迴圈,則將繼續計算倍數,例如 1 * n * m。
4、找到標記到的最大的值,就是執行時間的最大值,即演算法複雜度描述的上界。
如,斐波那契數列:
Fib(0) = 0,Fib(1)= 1,Fib(n) = Fib(n-1) + Fib(n-2)
F() = 0, 1, 1, 2, 3,5, 8, 13, 21, 34 ...
例1
int Fibonacci(int n)
{
if (n <= 1)
return n;
else
return Fibonacci(n - 1) + Fibonacci(n -2);
}
這裡,給定規模 n,計算Fib(n) 所需的時間為計算 Fib(n-1) 的時間和計算 Fib(n-2) 的時間的和。T(n<=1) = O(1),T(n)= T(n-1) + T(n-2) + O(1),通過使用遞迴樹的結構描述可知演算法複雜度為 O(2n)。
例2
int Fibonacci(int n)
{
if (n <= 1)
return n;
else
{
int[] f = new int[n + 1];
f[0] = 0;
f[1] = 1;
for (int i = 2; i <= n; i++)
{
相關推薦
NOIP複賽複習(六)演算法分析與排序模板
演算法分析 演算法分析的目的是預測演算法所需的資源,如計算時間(CPU 消耗)、記憶體空間(RAM 消耗)、通訊時間(頻寬消耗)等,以及預測演算法的執行時間,即在給定輸入規模時,所執行的基本運算元量,或者稱為演算法複雜度。 演算法的執行時間取決於輸入的資料特徵,輸入
NOIP複賽複習(七)STL容器與字串模板
STL容器 STL 容器是一些模板類,提供了多種組織資料的常用方法。常用的STL容器包括pair(組合)、list(列表,類似於連結串列)、vector(向量,類似於陣列)、priority_queue(優先佇列)、set(集合)、map(對映)、stack(棧)等,通過模板的引數
NOIP複賽複習(二)競賽環境與注意事項
一、比賽不提供紙質試題,只提供電子版試題檔案。 該檔案壓縮包儲存在計算機桌面上。監考人公佈密碼後,選手自行解密試題。 試題解壓密碼會影響一個人的心情,一定要一次輸對,注意大小寫,不要邊輸入邊檢查,要對自己有自信。 二、江蘇複賽選手上機可自選windows或linux作業系統。
NOIP複賽複習(一)常見問題與常用策略
數學類問題 1. 精度處理(高精度、實數處理、各種浮點型別處理方法) 2. 組合數學問題(斐波那契數列、第二類數、卡特蘭數、Polya原理、排列組合計數、加法原理與乘法原理) 3. 進位制問題(特定二進位制串的統計、二分查詢、利用二進位制進行路徑、狀
NOIP複賽複習(十三)圖論演算法鞏固與提高
一、圖的儲存 1、鄰接矩陣 假設有n個節點,建立一個n×n的矩陣,第i號節點能到達第j號節點就將[i][j]標記為1(有權值標記為權值), 樣例如下圖: /*無向圖,無權值*/ i
NOIP複賽複習(八)STL演算法與樹結構模板
STL演算法 STL 演算法是一些模板函式,提供了相當多的有用演算法和操作,從簡單如for_each(遍歷)到複雜如stable_sort(穩定排序),標頭檔案是:#include <algorithm>。常用STL 演算法庫包括:sort快速排序演算法、二分
NOIP複賽複習(十)怎樣才能拿到高分?
摘要 考場策略和程式測試是資訊學競賽中非常重要的環節,很多優秀的選手在很多比賽中總是會在這兩個環節上犯下這樣和那樣的錯誤,導致得到的分數和實力不成正比,最後留下了無盡的遺憾。本文將探討一些這兩個環節上值得注意的地方,提出一些可行的方法,分享一些經驗,以此希望幫助選手們在比賽中發揮水平,減少失
NOIP複賽複習(九)如何設計測試資料?
有些同學參加一次資訊學比賽之後,自我感覺非常不錯,但是測評結果成績卻並不理想。造成這種情況的原因有多方面,但是我認為其中不可忽視的一大原因就是在寫完程式之後,他們並不知道如何保證程式的正確性。在這裡,我就這個問題提出一點自己的看法。 先從考試的時間分配問題講起。很多同學覺得考試時間很充分,N
NOIP複賽複習(五)程式對拍與圖論模板
程式對拍 所謂“對拍”,顧名思義,就是讓兩者相互比對。所謂“兩者”,一是你要測試的程式,二是一個答案在該程式在一定範圍(時間/空間)內結果必定正確的程式(一般是用暴力求解的程式)。對拍一般需要造資料程式(data.exe),保證正確性的暴力對拍程式(test.exe)與測試程式(以moo.e
NOIP複賽複習(四)讀寫外掛與高精度模板
讀入輸出掛 讀入輸出掛就是逐個字元地讀入資料,從而讓讀入更加快速。輸出掛的原理也是一樣的,都是通過將輸出數字變成輸出字元以加快速度。當然輸入輸出外掛一般用在大量輸入輸出的情況下,這樣價效比才高一些,否則得不償失。 void Rd(int &res){ &nbs
NOIP複賽複習(三)檔案讀寫與數論模板
檔案讀入讀出 假設題目名為“add”,那麼資料夾名為“add”,c++程式名為“add.cpp”,讀入檔名為“add.in”,輸出檔名為“add.out”。四個的拼寫均不可有誤,包括大小寫差異。千萬不要除錯後就忘記修改檔案讀入讀出了。 #include<cstdio&
javaScript複習(六)Math物件與MathAPI 、Date物件與DateAPI
Math: 專門執行數學計算的物件,封裝了數學計算中常用的常量 1. 取整:3種: 上取整: Math.c
NOIP複賽複習(十四)字串演算法鞏固與提高
一、Trie樹 1.定義: 通過字串建成一棵樹,這棵樹的節點個數一定是最少的。例如:4個字串"ab","abc","bd","dda"對應的trie樹如下: 其中紅色節點表示存在一個字串是以這個點結尾的。 一個性質:在樹上,兩個點u,
NOIP複賽複習(十二)數論演算法鞏固與提高
一、數論 1.數 整數、自然數(大於等於0的整數)、正整數(大於0的整數)、負整數、非負整數、非正整數、非零整數、奇數偶數。 2.整除性 設a,b∈Z,如果存在c∈Z並且a=bc,則
NOIP複賽複習(十一)基礎演算法鞏固與提高
一、倍增演算法: 定義:用f[i][j]表示從i位置出發的2j個位置的資訊綜合(狀態) 一個小小的問題:為什麼是2j而不是3j,5j,…?因為,假設為kj,整個演算法的時間複雜度為(k-1)logk,當k=2時,時間複雜度最小。 這個演算法的三個應用:
NOIP複賽複習(十五)動態規劃鞏固與提高
經典例題:數字金字塔(Luogu 1216) 寫一個程式來查詢從最高點到底部任意處結束的路徑,使路徑經過數字的和最大。每一步可以走到左下方的點也可以到達右下方的點。 我們現在這裡討論搜尋如何實現: 狀態:目前在第x行第y列
【NOIP模擬賽(六)】花園的守護之神(greendam)-最短路-最大流最小割
greate make rand pair bsp min com solution bool Problem Greemdam 題目大意 給一個圖$G=(V,E)$,求要使這個圖的最短路增長所需要增加的最小權值的值。 Solution 既然是要求這個玩意兒,我們可
Giraph源代碼分析(六)——Edge 分析
available align put and mark lin cer mutable oba HamaWhite 原創,轉載請註明出處。歡迎大家增加Giraph 技術交流群: 228591158 歡迎訪問:
JAVA基礎複習(六)泛型和集合
1、泛型的優點是能在編譯時檢測出錯誤,一旦編譯器認為泛型型別是安全使用的,就會將它轉換為原始型別,泛型類或方法允許使用者指定可以和這些類或方法一起工作的物件型別 2、泛型型別必須是引用型別,不能使用int、double等基本型別來替代泛型集合 3、泛型集合類的構造方法和普通類相同,定義一個泛
系統學習NLP(六)--語義分析
轉自:https://www.jianshu.com/p/7463267b0106 對於不同的語言單位,語義分析的任務各不相同。在詞的層次上,語義分析的基本任務是進行詞義消歧(WSD),在句子層面上是語義角色標註(SRL),在篇章層面上是指代消歧,也稱共指消解。 詞義消歧 由於詞是能夠獨