数据结构初章之时间复杂度/空间复杂度

第一次认识数据结构

数据结构:在计算机科学中,数据结构是计算中存储、组织数据的方式。数据结构意味着接口或封装:一个数据结构可被视为两个函数之间的接口,或者是由数据类型联合组成的存储内容的访问方法封装。

典型的数据结构——二叉树:


在了解深层次数据结构之前还要理解一个概念——算法:在计算机科学之中,为任何良定义的具体计算步骤的一个序列,常用于计算、数据处理和自动推理。精确而言,算法是一个表示为有限长列表的有效方法。算法应包含清晰定义的指令用于计算函数。

算法特性:输入:算法具有零个或者多个输入

输出:只要有一个或多个输出

有穷性:算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且一个步骤在可接受的时间内完成。

确定性:算法的每一个步骤都有确定含义,不会出现义性

可行性:算法的每一步必须是可行的,也就是说,每一步都能够通过执行有限次数完成。

设计算法的要求:

正确性、可读性、健壮性、时间效率高且空间使用率低、简单性

    时间复杂度:

计算机科学中,算法的时间复杂度是一个函数,它定性的描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度函数。时间复杂度常用大O表示,不包括这个函数的低阶项和首项系数。

由此我们可以看出计算时间复杂度的方法:    

1、用常数1取代式中的所有加法常数

2、在修改后的运行次数函数中,只保留最高阶项

3、如果最高阶项系数存在且不是1,则去除与这个项相乘的常数

空间复杂度:

空间复杂度是度量算法所需存储空间的大小(算法的空间复杂度并不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数)记做S(n)=O(f(n))。简单来说空间复杂度就是程序在执行过程中创建了多少变量。 

下面我们来计算一下时间复杂度和空间复杂度:

nt main()
{
    int i = 0;
    int j = 0;
    int count = 0;

    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {

            count++;
        }
    }//执行n*n次

    for (i = 0; i < n; i++)
    {
        count++;
    }//执行n次

    int sum = 10;

    while (sum--)
    {
        count++;
    }//执行10次
    return 0;
}

整个函数会执行n*n+n+10次根据时间复杂度的计算方法可得

O(n*n)

空间复杂度为O(1)

二分法的时间复杂度和空间复杂度:

int Binary_Search(int *dest,int len, int x)
{
    int left = 0;
    int right =len-1;

    while (left <= right)
    {
        int mid = left + (right - left) / 2;
        if (x == *(dest + mid))
        {
            return mid;
        }
        else if (x < *(dest + mid))
        {
            right = mid - 1;

        }
        else if (x > *(dest + mid))
        {
            left = mid + 1;
        }

    }
    return -1;
}

所以时间复杂度为O(log2n)

由于辅助空间是常数级别的所以空间在复杂度为O(1)






猜你喜欢

转载自blog.csdn.net/CHR_1s/article/details/80480223