数据结构与算法描述
⼀、数据结构概述
1. 概念
数据是能够输⼊计算机且能够被计算机处理的各种符号的集合,它既包括数值类型的数据(例如整数、浮点数等),⼜包括⾮数值型的数据(⽂字、图像、声⾳)等。
数据元素是数据的基本单位,在计算机程序中通常作为⼀个整体进⾏考虑和处理(类似于⾼级语⾔中的对象)。
数据项是构成数据元素的不可分割的最⼩单位(类似于⾼级语⾔定义的类中的数据成员)。
数据对象是性质相同的数据元素的集合,是数据的⼀个⼦集。
数据结构是数据元素相互之间的关系,是相互之间存在⼀种或多种特定关系的数据元素的集合。⼀个数据结构包含了以下三个⽅⾯的内容:
1. 数据元素之间的逻辑关系,也就是逻辑结构(就是给⼈看的、能画出来的)。
2. 数据元素及其关系在计算机内存中的表⽰,成为数据的存储结构(就是给计算机看的、具体实现相关的)。
3. 数据的运算和实现,即对数据元素可以施加的操作以及这些操作在相应存储结构上的实现(就是数据结构对外提供的操作接⼝)。
2. 逻辑结构的种类
逻辑结构可以分为线性结构和⾮线性结构:
线性结构:有且只有⼀个开始节点和⼀个终端节点,并且所有节点都最多只有⼀个直接前驱和直接后继:
graph LR; A --> B --> C --> D
⾮线性结构:⼀个节点可能有多个直接前驱和直接后继。
graph LR; A --- B A --- C B --- C B --- E B --- D C --- G D --- F E --- F
3. 存储结构的分类
存储结构可以分为顺序存储结构、链式存储结构、索引存储结构和散列存储结构:
顺序存储结构:⽤⼀组连续的内存单元依次存储数据元素,数据元素之间的逻辑关系由元素存储位置来表⽰。
链式存储结构:⽤⼀组任意的存储单元存储数据元素,数据元素之间的逻辑关系⽤指针来表⽰。
索引存储结构:在存储节点信息的同时,还建⽴附加的索引信息。索引表中的每⼀项称作⼀个索引项。
稠密索引:每个节点在索引表中都有⼀个索引项。
稀疏索引:⼀组节点在索引表中只对应⼀个索引项。
散列存储结构:根据节点的关键字直接计算出该节点的存储地址。
⼆、算法概述
算法效率通过以下两个⽅⾯来考虑:
时间效率:指的是算法所耗费的时间;
空间效率:指的是算法执⾏过程中所耗费的存储空间。
时间效率与空间效率有时是⽭盾的,⼆者往往不可兼得。
1. 算法时间效率的度量
算法时间效率可以⽤依据该算法编制的程序在计算机上执⾏时消耗的时间来度量。
事后统计:将算法实现,测算其时间和空间开销。
事前分析:对算法所消耗的资源进⾏理论估算。
由于事后统计法需要花费⼤量的时间编写程序,并且其运⾏结果很⼤程度上取决于具体的测试平台,所以事前分析法往往是更有效的评估⽅法,具体⽅法是:
T = \sum_{i=1}^n f_it_i
其中T表⽰算法的运⾏时间,f表⽰每种语句的执⾏频率,t表⽰该种语句执⾏⼀次所需的时间。
由于每条语句执⾏的时间与算法⽆关,所以我们可以假定执⾏每条指令所需的时间均为单位时间,此时上式就可简化为每种语句的执⾏频率之和,即:
T = \sum_{i=1}^n f_i
为了便于⽐较不同算法的时间效率,我们仅⽐较它们的数量级。定义算法时间复杂度的渐进表⽰如下:
\exists f(n),s.t \lim_{n\to\infty} \frac{T(n)}{f(n)} = k \neq 0
则称T(n) = O(f(n))为算法的时间复杂度。算法时间复杂度表⽰随着问题规模n的增⼤,算法执⾏时间的增长率与f(n)的增长率相同。例如,若有算法的耗费时间为:T(n)=2n^3+3n^2+2n+1,则有:
\exists f(n)=n^3, s.t \lim_{n\to\infty}\frac{T(n)}{n^3} = 2 \neq 0
所以T(n)=O(n^3),即此算法的时间复杂度为O(n^3)。由此可见,算法的时间复杂度实际上是借助于⽆穷⼤来定义的,并且这个值越⼩,表⽰算法执⾏得越快。
有的情况下,算法中基本操作重复执⾏的次数还与输⼊数据集的特性有关。例如,如果冒泡排序算法的输⼊为⼀个有序数组,那么算法可以直接退出,时间复杂度为O(1);如果输⼊为⼀个逆序数组,那么算法需要交换所有元素才能保证数组有序,时间复杂度为O(n^2)。因此,算法的时间复杂度⼜分为:
最坏时间复杂度:指在最坏的情况下,算法的时间复杂度。
最好时间复杂度:指在最好的情况下,算法的时间复杂度。
平均时间复杂度:指在所有可能的输⼊实例在等概率出现的情况下,算法的期望运⾏时间。
⼀般情况下总是会考虑最坏时间复杂度,这样可以保证算法的运⾏时间不会⽐这种情况更长。
当算法的输⼊规模n很⼤时,不同时间复杂度算法的执⾏时间差距⾮常⼤。下⾯的表格列出了⼀些常见时间复杂度的算法的执⾏时间随着输⼊规模增加的增长率:
数据结构与算法c++版 pdfn O(1)O(\log_2{n})f(n)O(n\log_2{n})f(n^2)f(n^3)f(2^n)f(n!)
110101121
211224842
4124816641624
8138246451225640320
16141664256409665536 2.0923E+13
3215321601024327684.295E+92.6313E+35
2. 算法空间效率的度量
算法的空间效率使⽤空间复杂度来度量。空间复杂度就是算法运⾏所需的存储空间的度量,记作:
S(n) = O(f(n))
算法要占据的空间包括:
算法本⾝要占据的空间,例如输⼊输出、指令、常数、变量等。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论