《数据结构》学习笔记——概论

本文介绍了数据结构的基本概念,包括数据对象的逻辑和物理结构,以及抽象数据类型的定义。算法的描述与实现无关,重点关注其时间和空间复杂度。通过渐进表示法(O(n),Ω(n),Θ(n))分析算法效率,并给出了算法复杂度分析的技巧。内容涵盖了数据结构、算法设计与分析的关键要素。
摘要由CSDN通过智能技术生成

数据结构

定义

数据结构的定义包含:

数据对象在计算机中的组织方式;
与数据对象相关联的一个操作集,以及实现这些操作的最高效的算法。

数据对象在计算机中的组织方式,包含两个概念:

一是数据对象集的逻辑结构;
二是数据对象集在计算机中的物理存储结构。

抽象数据类型

抽象数据类型(Abstract Data Type)是一种对“数据类型”的描述,这种描述是“抽象”的。

数据类型描述两方面的内容:
一是数据对象集,二是与数据集相关联的操作集。

抽象 是指,我么描述数据类型的方法不依赖于具体实现的,即数据对象集和操作集的描述与存放数据的机器无关、与数据存储的物理结构无关、与实现操作的算法和编程语言均无关。
抽象数据类型只描述数据对象集合相关操作集“是什么”,并不涉及“如何做到”的问题。

算法

定义

一般而言,算法是一个有限指令集,它接受一些输入(有些情况下不需要输入),产生输出,并一定在有限步骤之后终止。
算法的每一条指令必须有充分明确的目标,不可以有歧义;必须在计算机能处理的范围之内;且其描述不依赖于任何一种计算机语言以及具体的实现手段。

算法不是程序。
两者的区别:
程序可以无限运行(如操作系统),但算法必须在有限步后终止。
算法比程序“抽象”,强调表现“做什么”,而忽略细节性的“怎么做”。

算法复杂程度

比较算法优劣的指标:

(1)空间复杂度 S(n)——根据算法写成的程序在执行时占用存储单元的长度。
空间复杂度过高的算法可能导致使用的内存超限,造成程序非正常中断。

(2)时间复杂度 T(n)——根据算法写成的程序在执行时耗费时间的长度。
时间复杂度过高的低效算法可能导致我们有生之年都等不到运行结果。

在分析一般算法的效率是,我们经常关注下面两中复杂度:

(1)最坏情况复杂度 T w o r s t ( n ) T_{worst }(n) Tworst(n)
(2)平均复杂度 T a v g ( n ) T_{avg}(n) Tavg(n)

渐进表示法

定义1: T ( n ) = O ( f ( n ) ) T(n) = O(f(n)) T(n)=O(f(n))

表示存在常数 C > 0 , n 0 > 0 C > 0 , n_0 >0 C>0,n0>0,使得当 n > = n 0 n>=n_0 n>=n0时有 T n < = C ( f ( n ) ) Tn<= C(f(n)) Tn<=C(f(n))

定义2: T ( n ) = Ω ( g ( n ) ) T(n) = \Omega (g(n)) T(n)=Ω(g(n))
表示存在常数 C > 0 , n 0 > 0 C > 0 , n_0 >0 C>0,n0>0,使得当 n > = n 0 n>=n_0 n>=n0时有 T n > = C ( g ( n ) ) Tn>= C(g(n)) Tn>=C(g(n))

定义3: T ( n ) = Θ ( h ( n ) ) T(n) = \Theta (h(n)) T(n)=Θ(h(n))
表示同时有 T ( n ) = O ( h ( n ) ) T(n) = O(h(n)) T(n)=O(h(n)) T ( n ) = Ω ( h ( n ) ) T(n) = \Omega (h(n)) T(n)=Ω(h(n))

在对给定的算法做渐进分析时的几个窍门:

  1. 若两段算法分别有复杂度 T 1 ( n ) = O ( f 1 ( n ) T_1(n)=O(f_1(n) T1(n)=O(f1(n) T 2 ( n ) = O ( f 2 ( n ) ) T_2(n)=O(f_2(n)) T2(n)=O(f2(n)),那么
    (1)两段算法串联在一起的复杂度 T 1 ( n ) + T 2 ( n ) = m a x ( O ( f 1 ( n ) ) , O ( f 2 ( n ) ) ) T_1(n)+T_2(n)=max(O(f_1(n)),O(f_2(n))) T1(n)+T2(n)=max(O(f1(n)),O(f2(n))),即比较慢的那个算法决定了串联后的效率。
    (2)两段算法嵌套在一起的复杂度 T 1 ( n ) ∗ T 2 ( n ) = O ( f 1 ( n ) ∗ f 2 ( n ) ) T_1(n)*T_2(n)=O(f_1(n)*f_2(n)) T1(n)T2(n)=O(f1(n)f2(n))
  2. 若T(n)是关于n的k阶多项式,那么 T ( n ) = Θ ( n k ) T(n)=\Theta(n^k) T(n)=Θ(nk)
  3. 一个for循环的时间复杂度等于循环次数乘以循环体代码的复杂度。
  4. 若干层嵌套循环的时间复杂度等于各层循环次数的乘积再乘以循环体代码的复杂度。
  5. if-else结构的复杂度取决于if的条件判断复杂度和两个分支的复杂度,总体复杂度取三者中最大。

学习参考资料:

《数据结构》 第2版
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值