Open Fionn88 opened 9 months ago
搜索引擎
使用者下 query,把 document 去做 metric 並把資料抓出來顯示
Analysis
當你設計一個系統,思考他的 input 跟 output 是什麼
Design
這些 Data objects 所實現的 function 是什麼
Function:設計演算法來達到
各種 Test Case 看正確性跟有效性
回傳 Error Code 並且寫註解
Yahoo 新聞首頁
一個 Team 做出來的,並且來自各國,EX: 印度, 美國, etc.
- 啟動備份新聞平台去測試小功能 => Testing
是否有符合預期的規格
是否正常的運作
有無寫文件
每個 Data object 對應到的 function 是否可以運作
Code 是否看得懂
儲存是否有效率(雖然說現今儲存很便宜,但是如果是行動裝置的話,對於應用程式的儲存更要求)
通常愈快愈好,愈小愈好(較為主觀)
Struct student { char last_name;
int student_id;
char grade; }
integer: +, -, *, /, %, =, ==, atoi()
- Representation: char 1 byte, int 4 bytes
Abstract Data Type (ADT): data type specification(object & operation) is separated from representation.
ADT is implementation-independent
也就是外部類別只需要呼叫介面提供的方法,不用也不需要知道內部如何實作
解決問題的方法
反應出你的問題是什麼
解決問題的目的
有限的步驟去達成,會停止
有效率的做法
program doesn’t have to be finite (e.g. OS scheduling)
從小到大的排序,選最小的出來,放到第一個 有兩個 Set 的數字,一個是已排序,一個是 unsort.
void sort(int list[ ], int n)
{
for (i=0; i < n-1; i++) {
min = i;
for (j = i+1; j < n; j++) {
if (list[j] < list[min])
min = j; }
SWAP(list[i], list[min], temp);
}
}
如是 comparison base 的話是 Quick Sort 是最快的:O(nlogn),非 comparison base 的話則是 Radix Sort
前提數字是排好序的
input:你想找的數字 output:數字是否有在這個 List
Binary Search 跟 Binary Search Tree 是不同的東西
int compare(int x, int y)
/* return -1 for less than, 0 for equal */
int binsearch(int list[], int searchno, int left, int right)
{
while (left <= right) {
middle = (left + right) / 2;
switch ( COMPARE(list[middle], searchno) ) {
case -1: left = middle +1;
break;
case 0: return middle;
case 1: right = middle -1;
}
}
}
Selection problem: select the kth largest among N numbers input:找第幾大的數字 output:該位數字
Solutions
Direct recursion: functions that call themselves
Indirect recursion: Functions that call other functions that invoke calling function again
C(n,m) = n!/[m!(n-m)!] ⇒ C(n,m)=C(n-1,m)+C(n-1,m-1)
Boundary condition for recursion
呼叫自己停的條件為什麽
n! = n × (n-1)! ⇒fact(n) = n × fact(n-1) 0 ! = 1
int fact(int n)
{ if ( n== 0)
return (1);
else
return(n*fact(n-1));
}
int mult(int a, int b)
{ if ( b== 1)
return (a);
else
return( mult(a, b-1) + a );
}
不同的 Data structure 實作演算法(解決問題的方式)時會有不同的複雜度
空間複雜度為:O(N)。
int sum(int n)
{ if ( n== 1)
return (1);
else
return( sum(n-1) + n );
}
For Loop 去解決加總演算法的話,空間複雜度為:O(1)。
時間複雜度:Recursive Summation > For Loop
int binsearch(int list[], int searchno, int left, int right)
{
if (left <= right) {
middle = (left + right)/2;
switch (COMPARE(list[middle], searchno) )
{
case -1: return binsearch(list, searchno, middle+1, right)
case 0: return middle;
case 1: return binsearch(list, searchno, left, middle-1);
}
}
return -1;
}
void perm(char *list, int i, int n)
{
if ( i == n) {
for (j=0; j <=n; j++)
cout<<list[j];
}
else {
for (j = i; j <= n; j++) {
SWAP(list[i], list[j], temp);
perm(list, i+1, n);
SWAP(list[i], list[j], temp);
}
}
}
跟機器沒有關係
跟機器有關係
c: fixed space(instruction, simple variables, constant
存放變數的 storage,與怎麼實作演算法叫有關係
Sp(I): depends on characteristics of instance I
Sp(I):Input 的量的大小
Characteristics: number, size, values of I/O associated with I
if n is the only characteristic, Sp(I) ⇒ Sp(n)
c: compile time Tp(I): program execution time depends on characteristics of instance I
Characteristic: number, size, values of I/O associated with I
predict the growth in run time as the instance characteristics change