1A2B 小專案 + 演算法初探
Text
窮舉法
先把所有的選擇列出來,再一個個將不合選項的刪除
考慮複雜度
所有選項
10*9*8*7 = 5040
窮舉法
使用窮舉法時要注意複雜度的問題,很常會遇到複雜度會變成O(a^n),但是在這一題中,我們根據我們每次的推算可以發現大部分可以在10次以內推算成功,且每一次都會刪除許多選項(剪枝)
存的時候用vector
談談貪心
先試著想一下,我現在有好多功課/報告要趕,他們分別都有不同的截止日期和需要的時間,假設每一個功課都同等重要,你會如何排序?
談談貪心
1. 時間短的先做
2. 時間長的先做
3. 截止日期先到先做
void insertionSort(int arr[], int n)
{
for (int i = 1; i < n; i++)
{
int key = arr[i]; // 要插入的值
int j = i - 1;
while (j >= 0 && arr[j] > key)
{
arr[j + 1] = arr[j]; // 往後移
j--;
}
arr[j + 1] = key; // 插入正確位置
}
}Class
可以想成進階版的struct!
不同之處
private:
不可以對裡面的內容直接進行修改
public:
基本上跟struct一樣,想成struct是全部都是public的class
指標(pointer)-
指標是一種變數,用來存放記憶體位址
int a; // 一個普通的整數變數
int *ptr = &a; // ptr是指標,&a代表取得a的記憶體位址既然可以存放記憶體,那也可以配置一塊記憶體
int *p = new int; // 新配置的一塊記憶體
*p = 42;
cout << *p << endl; // 輸出42
delete p; //既然是新配置的,那麼也要記得刪除
int *arr = new int [10]; //配置新的陣列所需的記憶體
delete[] arr; //清除陣列記憶體指標(pointer)
new 的記憶體是從哪裡拿的?
我如果忘記delete會怎麼樣?
用動態配置的記憶體不會自動釋放,所以他會一直佔據空間
造成Memory leak(記憶體外洩)
指標和參考變數雖然觀念題不考,實作也不一定會用到,但是很重要的觀念!
參考變數
跟原本一模一樣的變數,改動此變數的時候,原本的變數的值也會跟著改動。
int a; // 一個普通的整數變數
int &cpa = a; // cpa是a的參考變數為甚麼會需要指標和參考變數?
* 變數的作用域
* 方便記錄的另一種方法
Merge sort
將陣列不停切半,確保左邊的排序好,右邊的也排序好,最後將兩個陣列合併

void MergeSort(vector<int> &arr, int start, int end)
{
int mid = (start + end) / 2;
if(start == end)
return;
MergeSort(arr, start, mid);
MergeSort(arr, mid + 1, end);
Merge();
}啊關鍵的Merge怎麼寫?
先自己想想看!下次公布
void MergeSort(int &arr[], int start, int end)
{
int mid = (start + end) / 2;
MergeSort(arr[], start, mid);
MergeSort(arr[], mid + 1, end);
Merge();
}Quick sort
在數列中任意挑選一個數,稱為pivot
然後調整數列,
使得「所有在pivot左邊的數,都比pivot還小」
而「在pivot右邊的數都比pivot大」。
接著,將所有在pivot左邊的數視為「新的數列」
所有在pivot右邊的數視為「另一個新的數列」

隨機
rand/srand可以用來產生隨機數
但要注意,電腦生成的隨機數並不是完全隨機,而是通過複雜的演算法讓亂數種子對應出相對的亂數
#include <cstdlib>
#include <bits/stdc++.h>
using namespace std;
int main()
{
int x;
srand(x); // 設定亂數種子
cout << rand(); // 隨機產生的數字
}Time
通常上面的隨機可以再搭配time函數達成製造每次都不一樣的結果
#include <ctime>
#include <cstdlib>
#include <bits/stdc++.h>
using namespace std;
int main()
{
time_t start = time(0); // 「從1970年1月1日0時0分0秒」到「現在」的時間差,單位為秒。
srand( time(NULL) );
/* 產生亂數 */
int x = rand();
}Copy of Copy of Minimal
By yujuan
Copy of Copy of Minimal
- 99