Lec1 Introduction
概念
Algorithm: a well defined(不同人的理解是一致的) sequence of steps for solving a computational problem
算法
选择排序
选择排序的逻辑是,按照同一方向不断搜索数组中的最小值,并且和上游交换,从而保证上游顺序。
def selection_sort(A[], n):
for int i = 1 to n-1:
k = i
for int j = i+1 to n:
if A[k] > A[j]:
k = j
swap A[k] and A[i]
这里的思想并不是用双指针找出最小值, i i i 是搜索范围的第一项下标,而 k k k 是用来记录最大(最小)值的参数
设计算法的思想
Incremental techniques
将前n-1个位置排好,在处理第n个位置
Recursive techniques
把一个大问题不停地分割,化成很多个简单的小问题
# 题目要求依次打印a到b之间的所有整数
def printSeries(a, b):
if(a==b) # 这是base case
print(b)
return
else # 这是recursive case
print(a+',')
printSeries(a+1, b)
在递归算法中,要搞清楚base case和recursive case,这样就能够比较轻松地写出代码
Lec2 Algorithm Analysis
RAM Computation Model
Memory, CPU, Algorithm
ROM:厂商写死的内存
CPU从RAM(GB水平)中读取数据,将数据(指令)传给ALU,进行运算后输出
算法分析
有以下几个方面:
Correctness analysis
常见的错误有:WA和TLE
Cost analysis
计算机一秒钟能够进行
1
0
8
10^8
108 次基本运算
基本运算:
- Initializaiton
- Arithmetic
- Comparison
- Memory access
Space complexity
算法
二分查找
def search():
int left = 0
int right = n -1
while(left < right) // 等于截止,成为目标值
int mid = (left + right) / 2
if(a[mid] > k)
right = mid - 1
else if(a[mid] = k)
return mid
else if(a[mid] < k)
left = mid + 1
查找<=k的最大index
def search_right()
int left = 0
int right = n -1
while(left < right) // 等于截止,成为目标值
int mid = (left + right) / 2
if(a[mid] > k)
right = mid // mid有可能是答案,不能直接减一
else if(a[mid] = k)
right = mid
else if(a[mid] < k)
left = mid + 1
查找>=k的最小index
def search_left()
int left = 0
int right = n -1
while(left < right) // 等于截止,成为目标值
int mid = (left + right + 1) / 2
if(a[mid] > k)
right = mid - 1
else if(a[mid] = k)
left = mid
else if(a[mid] < k)
left = mid
二分答案
适用于:不好解,但是好验证的问题,并且这个问题的答案是单调的。