数据结构概念

数据结构:是计算机存储、组织数据的方式。相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。

数据结构三要素:

数据的(物理)存储结构:

  1. 顺序存储:逻辑上相邻的元素在实际存储的位置上也相邻。优点:可以随机存取,占用空间较少;缺点:只能使用相邻的一整块存储单元,可能产生较多外部碎片。例如:数组。
  2. 链接存储:逻辑上相邻的元素不必物理上实际存储也相邻。优点:不会出现碎片,充分利用存储单元;缺点:每个元素需要存储指针而额外占用存储空间,并且只能顺序存取。例如:链表就是链接存储。
  3. 索引存储:在存储元素信息的同时,还建立附加的索引表。索引表中的每一项索引项的一般形式:(关键字,地址)。优点:检索速度快;缺点:增加索引表,会占用较多存储空间。另,在增加和删除数据时要修改索引表,会花费较多的时间。例如:数据库中增加索引可以提升检索速度。
  4. 散列存储:根绝元素的关键字直接计算出该元素的存储地址,又称Hash存储。优点:检索、增加、删除节点的操作都很快;缺点:如果散列函数不好可能出现元素存储单元的冲突,而解决冲突会增加时间和空间的开销。

例题:1、以下与数据的存储结构无关的术语是( )

              A、循环队列          B. 链表            C、哈希表            D、栈

数据结构五个特征:有穷性、确定性、可行性、输入、输出。

效率度量:时间复杂度、空间复杂度。

例题:2、设n是描述问题规模的非负整数,下面程序片段的时间复杂度是( )

x=2;

while(x<n/2)

x=x*2;

        A、O(log2n)          B、O(n)          C、O(nlog2n)              D、O(n^2)

3、下列程序段的时间复杂度是(    )

count = 0;

for(k=1; k<= n; k*=2)

     for(j=1; j<=n; j++)

          count++;

          A、O(log2n)          B、O(n)          C、O(nlog2n)              D、O(n^2)

4、以下算法中加下划线语句的执行次数为( )

    int  m=0,i,j;

    for(i=1; i<=n; i++)

           for(j=1; j<=2*i; j++)

                 m++;

          A、n(n+1)             B、n            C、n+1             D、n^2

5、是分析下列程序段的时间复杂度。

for(i=1; i<=n; i++)

     for(j=1; j<=j; j++)

          for(k=1; k<= j; k++)

               x++;

 

答案:1、D,数据的存储结构有顺序存储、链式存储、索引存储和散列存储。栈是一种抽象数据类型,课采用顺序存储或链式存储,指标是逻辑结构。

2、A,在程序中执行频率最高的语句为“x=x*2”。设该语句共执行 t 次,则2^(t+1) < n/2,故log2(n/2)-1 = log2n-2,得T(n)=O(log2n)。

3、C,内层循环条件j<=n与外层循环的变量无关,每次循环j自增1,每次内层循环都执行n次。外层循环条件为k<=n,增量定义为k*=2,克制循环次数为2^k <= n,即k <= log2n。所以内层循环的时间复杂度是O(n),外层循环的时间复杂度是O(log2n)。对于嵌套循环,根据乘法规则知,该段程序的时间复杂度T(n) = T1(n) * T2(n) = O(n) * O(log2n) = O(nlog2n)。

4、A,m++语句的执行次数为   \sum_{i=1}^{n}\sum_{j=1}^{2i}1=\sum_{i=1}^{n}2i=2\sum_{i=1}^{n}i=n(n+1)

5、x++是基本语句,T(n)=O(\sum_{i=1}^{n}\sum_{j=1}^{i}\sum_{k=1}^{j}1)=O(\frac{1}{6}n^{​{3}})= O(n{3})

归纳总结:

时间复杂度分析推导过程:

一、循环主体中的变量参与循环条件的判断

      此类题应该找出主体语句中与T(n)成正比的循环变量,将之带入条件中进行计算,如1.while(i<=n) i=i*2; 其中i乘以2的次数正式主体语句的执行次数t,因此有2^t<=n,取对数后,即得t <= log2n,则T(n)=O(log2n)。又如:while( (j+1) * (j+1) < n) y=y+1; 其中y加1的次数恰好与T(n)成正比,则记t为该程序的执行次数并令t=y-5,即 y=t+5,(t+5+1)*(t+5+1) < n,得出t <\sqrt{n}-6,即T(n)=O(\sqrt{n})。

二、循环主体中的变量与循环条件无关

      此类题课采用数学归纳法或者直接累计循环次数。多层循环时从内到外分析,忽略单补语句、条件判断语句,只关注主体语句的执行次数。此类问题又可分为递归程序和非递归程序:

  • 递归程序一般使用公式进行递推。例如int fact(int n){ if(n<=1) return 1; return n*fact(n-1); }的时间复杂度分析为T(n)=1+T(n-1)=1+1+T(n-2)=……=n-1 +T(1)  即T(n) = O(n).
  • 非递归程序比较简单,可以直接累计次数。例如例题4等。

以上内容摘自王道17考研数据结构。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值