数据结构笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构笔记相关的知识,希望对你有一定的参考价值。
数据结构学习笔记
1. 绪论
1.1计算机与算法
a.算法定义:是指基于特定的计算机模型,旨在解决某一信息处理问题而设计的一个指令序列。
b.算法的要素:输入,输出,基本操作
c.算法的性质:确定性与可行性,有穷性与正确性,鲁棒性。
注:这里的鲁棒性是指算法要能够适应系统各种极端情况,以及一些在考虑范围内的变化。
d.算法的效率:效率的前提是保证可计算性,然后再从时间和空间的角度度量算法的计算成本,进而依此尺度对不同算法进行比较和评判。
1.2复杂度的度量
a.时间复杂度:将算法的执行时间表示成输入规模的函数,这个函数定义为算法的时间复杂度,T(n)。
b.渐进复杂度:T(n)的渐进上界f(n),即 T(n)<c*f(n).
T(n)=O(f(n)),记号O() 有两条性质:1.O(C*f(n))=O(f(n)) ;2.a>b>0时,O(n^a+n^b)=O(n^a).
c.空间复杂度:算法及运算过程中数据所需存储空间的大小。
1.3复杂度分析
几种渐进复杂度的定义和举例。
1.4递归
语录:分支和转向是算法的灵魂,函数和过程及其之间的调用,是经过抽象和封装之后,实现分支和转向的一个重要机制;而递归则是函数和过程调用的一种特殊形式,即允许函数和过程自我调用。
a.线性递归,减而治之。即每一次递归的深入都会得到一个规模更
小的待求解问题,直至最小可解问题为止。算法实例:
//求和函数 int sum(int A[], int n){ if (n < 1) return 0;//递归基 else return sum(A, n - 1) + A[n - 1]; }
其中return 0;是递归基,是递归算法的必需品,是递归结束的条件,必须保证程序能够执行到这一点。递归分析的复杂度问题,上述算法的复杂度为:
(递归调用的深度n)*(每一步执行的命令个数3) = O(n)
b.递归模式
多递归基: 例子:数组倒置
//倒置数组元素 void reverse(int* A, int low,int high ) { if (low < high) { //swap(A[low], A[high]); int temp; temp = A[high]; A[high] = A[low]; A[low] = temp; reverse(A, low + 1,high - 1); } }
多向递归: 这里对比了蛮力版的求幂计算方法和多向递归方法的一个对比
//计算2^n //蛮力解法 _int64 power2BF_I(int n) { _int64 pow = 1; while (n-- > 0) { pow <<= 1; } return pow; } //计算2^n //多向递归 inline _int64 sqr(_int64 a) { return a*a; } _int64 power2(int n) { if (n == 0) return 1; return (n & 1) ? sqr(power2(n >> 1) )<< 1:sqr(power2(n >> 1));//>>x,右移x位,是除2^x }
对于复杂度来讲蛮力法的复杂度为O(n),而多向递归的复杂度为O(r),其中n=2^r.
以上是关于数据结构笔记的主要内容,如果未能解决你的问题,请参考以下文章