数据结构(C++版)学习笔记 第一章 绪论

在大一下时就上过了数据结构的课(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;
}

递归:设计出可行且正确的解
动态规划:消除重复计算,提高效率

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。