数据结构笔记(一)

数据结构学习笔记

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.

 

你可能感兴趣的:(数据结构笔记(一))