数据结构概述及时间复杂度和空间复杂度

本文介绍了数据结构的基本概念,包括逻辑结构(线性与非线性)、存储结构(顺序、链式、索引、散列)以及数据运算。同时,文章深入讨论了算法的时间复杂度和空间复杂度,举例分析了二分查找、阶乘计算、斐波那契数列等算法的时间复杂度,并强调了算法效率的重要性。
摘要由CSDN通过智能技术生成

1.数据结构概述

1.1何为数据结构?

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。通俗的理解数据结构就是为我们储存数据并展示数据之间的特定关系,操作数据,提供的一种容器。

1.2数据结构三要素

1.数据的逻辑结构

(1)线性结构(数据元素之间只存在一对一的关系):线性表 栈 队列

(2)非线性结构: 树(一对多) 图(多对多) 集合(集合中的数据元素除同属一个集合外,别无其它关系)

2.数据的存储结构(物理结构)

(1)顺序存储:逻辑上相邻的元素存储在物理位置上也相邻的存储单元中

(2)链式存储:不要求逻辑上相邻的元素在物理位置上也相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系

(3)索引存储:在存储元素信息的同时,还建立附加的索引表

(4)散列存储:根据元素的关键字直接计算出该元素的存储地址,又称哈希存储

3.数据的运算

2.算法的时间复杂度和空间复杂度

2.1.算法效率

算法效率是由时间复杂度和空间复杂度来衡量的

2.2时间复杂度

在计算机科学中,算法的时间复杂度是一个函数,他定量描述了该算法的运行时间。

一个算法所花费的时间与其中语句的执行次数成正比例, 算法中的基本操作的执行次数,为算法
的时间复杂度。

2.2.1 O的渐进表示法

推导大 O 阶方法:
1 、用常数 1 取代运行时间中的所有加法常数。
2 、在修改后的运行次数函数中,只保留最高阶项。
3 、如果最高阶项存在且不是 1 ,则去除与这个项目相乘的常数。得到的结果就是大 O 阶。
在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为 O(N)

2.2.2易错题:

1.二分查找时间复杂度分析:

通过将目标值与排序数列中值的比较,一下可以排除一半的元素

最好为一次,最坏为O(logN),时间复杂度为log(N)

int BinarySearch(int* a, int n, int x)
{
 assert(a);
 int begin = 0;
 int end = n-1;
 // [begin, end]:begin和end是左闭右闭区间,因此有=号
 while (begin <= end)
 {
 int mid = begin + ((end-begin)>>1);
 if (a[mid] < x)
 begin = mid+1;
 else if (a[mid] > x)
 end = mid-1;
 else
 return mid;
 }
 return -1;
}

2.阶乘时间复杂度分析

long long Fac(size_t N)
{
 if(0 == N)
 return 1;
 
 return Fac(N-1)*N;
}

执行N次,时间复杂度为O(N)

3.计算斐波那契数列时间复杂度

long long Fib(size_t N)
{
 if(N < 3)
 return 1;
 
 return Fib(N-1) + Fib(N-2);
}

 

 

 F(N)=1+2+2^1+2^2+……+2^(n-2)

时间复杂度为O(2^N)

4.

int m=0,i,j;
for(i=1;i<=n;i++)
    for(j=1;j<=2*i;j++)
        m++;

n=1时,内层循环执行2次

n=2时,内层循环执行4次

……

n时,内层循环执行为2n次

F(N)=2+4+6+8+……+2n=n(n+1)

O(N^2)

5.

int func(int n)
{
    int i=0,sum=0;
    while(sum<n)
        sum += ++i;
    return i;
}

设一共执行x次

第一次:sum += 1    , sum=1,i=1;

第二次:sum += 2    , sum=1+2,i=2;

……

第x次:sum +=x       , sum=1+2+3+...+x = n

解得 x=n^1/2

6.

int sum=0;
for(int i=1;i<n;i*=2)
    for(int j=0;j<i;j++)
        sum++;

 T=1+2+4+……+x

共logn项

由等比数列求和得 n-1次

O(N) 

2.3空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中 临时占用存储空间大小的量度
注意:
函数运行时所需要的栈空间 ( 存储参数、局部变量、一些寄存器信息等 ) 在编译期间已经确定好了,因 此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枣丶睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值