在大一下时就上过了数据结构的课(C#版),但除了大一的暑期课,之后一直没怎么用过相关知识,最近准备保研拿出来复习一下,同时也做些leetcode相关的习题练习一下,做些笔记以备之后保研复习~希望能够坚持学完!
2019.5.6
首先以起泡排序为例,说明什么是算法
void bubblesort1A ( int A[], int n )
{
bool sorted = false; //初始未未排序状态
while ( !sorted )
{
sorted = true; //每一轮先默认已排序,如果后续没有进行交换操作直接跳出循环
for ( int i = 1; i < n; i++)
{
if ( A[i-1] > A[i] )
{
swap ( A[i-1], A[i] ); //如果相邻两元素逆序则交换
sorted = false; //该标志的设置主要是为了提前结束以减小不必要的比较
}
}
n--; //每过一轮,末端已排序的元素就加一,前端未完成排序的元素个数减一
}
}
所谓算法,即特定计算模型下,旨在解决特定问题的指令序列,其主要具有以下几个特点:
- 具有输入与输出,即问题与答案
- 确定性与可行性,算法可描述为由若干语义明确的基本操作组成的指令序列,且各指令可行
- 有穷性与正确性,在执行有限次基本操作后应终止并输出,并且正确
算法的计算成本涵盖诸多方面,要考虑时间复杂度与空间复杂度。大O为上界。
常见级数计算复杂度
- 算术级数与末项平方同阶:T(n)=1+2+3+....+n=O(n2 )
- 幂方级数比幂次高出一阶:T(n)=12 +22 +32 +...+n2 =O(n3)
- 几何级数与末项同阶(a>1):Ta(n)=a0+a1+a2+...+an=O(an)
两个比较高效的算法:
//数组倒序
void reverse (int* A, int lo, int hi){
while(lo < hi)
swap(A[lo++], A(hi--));
}
//Fibonacci数计算
_int64 fib(int n){
_int64 f = 1, g = 0;
while(0 < n--) {g += f; f = g - f;}
return g;
}
递归:设计出可行且正确的解
动态规划:消除重复计算,提高效率