所有範例程式非唯一正解
有任何錯誤歡迎糾正
這份講義包含
對初學者來說很硬,要背很多東西,但一旦會了就非常方便
vector
算是從基礎語法晉升到競賽程式最明顯的指標了,所以特別的重要,vector是可以動態改變大小的陣列,不像傳統陣列開了就不能再修改
二維vector常常被使用來做linked-list或圖,完全沒有空間被浪費
註: string
也算
大部分都能這樣用所以可以背起來
可以將STL排序,大部分用在vector
sort
的*arg
*arg
是排序方式,傳入一個布林函式,作為比較函式,做到自定義排序,會以這個形式呈現sort(v.begin(), v.end(), *arg);
greater<int>
是讓sort
由大到小排列,可以學看看
mycmp
回傳的布林值是兩個相鄰的資料的關係,讓sort
函式內部知道要怎麼排序,infront>back
是告訴sort
函式,前面的數字要大於後面的數字,於是sort
函式就會由大到小排序了pair
用法
如果要對vector<pair<int, int>>
進行排序,會先排序前項,如果前項相同再排列後項,如果要進行其他方式,那可能要使用自定義排序
name.size()
name.empty()
name.begin(), name.end()
}
可以吧queue
想像成一個水管,只能右進左出,只能訪問最前面跟最後面
而stack
則是像一個桶子,後進先出,只能訪問最上面
將最重要的元素放在最頂端,只能訪問最前項,預設是將最大當作最重要
pq
的時間常數比set
還要低set主要的功能有排序與去重:
把資料送入set時,若set內已有該數值就會被刪除,若沒有就會被排序
即所有相同資料在set中只能存在一個
multiset是允許多個相同數值存在的set
使用方法和set大致相同
用於儲存離散化的資料,像是一個陣列,但陣列索引可能是任何資料型態,特別是當需要開一個很大的陣列的時候可以考慮使用它,通常都以map<int, int>
來做
其實還有一些很厲害的 ,但我很懶,就放在這邊等你們探索吧
很重要,所以要說三遍
可以在極短的時間內找到需要的值
但只能在排序好的資料中使用
傳統的二分搜過程是:
- 選擇資料中的中位數
- 若所要的資料大於中位數則丟棄所有小於較小的資料
- 再對大於的資料中繼續找中位數並丟棄不需要的資料
- 直到找到所需的資料
由於二分搜不需要檢查每個資料,只需要折半再折半,因此對比線性搜尋的時間,時間複雜度為的二分搜非常 星爆 快
要注意維護左閉右開
或左開右閉
重點是先找到中間點,如果要找的值大於中點,則找中點的右邊,否則則找中點的左邊,若區間只有一個值,那就是答案了
但是要左邊右邊找找去好麻煩
還要管左閉右開之類的問題
所以這邊提供一個比較好的二分搜寫法我平常也用這個,我稱為跳跳二分搜
跟上面的傳統二分搜比起來簡單很多吧!只需要判斷能不能往前跳,如果不能要跳小格一點,等到一次跳的距離變成0格,答案就出來了,時間複雜度也一樣是 可是二分搜只能在排序好的陣列中使用欸! 要怎麼做出排序好的陣列?
排序演算法有很多
e.g.泡沫排序
,選擇排序
,快速排序
,合併排序
,希爾排序
…非常非常多種,最常使用的是快速排序和合併排序,因為時間複雜度低,只需要,但原理不好理解,如果之後有時間再解釋