Python数据结构与算法—基本概念
数据结构基本概念
数据结构: 程序 = 数据结构 + 算法
1.数据:即信息的载体,是能够输入到计算机中并且能被计算机识别、存储和处理的符号总称。
2.数据元素:是数据的基本单位,又称之为记录(Record)。一般,数据元素由若干基本项(或称字段、域、属性)组成。
3.数据结构:指的是数据元素及数据元素之间的相互关系,或组织数据的形式。
数据之间的结构关系
一、逻辑结构:表示数据之间的抽象关系(如邻接关系、从属关系等),按每个元素可能具有的直接前趋数和直接后继数将逻辑结构分为“线性结构”和“非线性结构”两大类。
1.特点:
只是描述数据结构中数据元素之间的联系规律。
是从具体问题中抽象出来的数学模型,是独立于计算机存储器的(与机器无关)。
2.逻辑结构分类:集合,线性结构,非线性结构
1)线性结构是n个数据元素的有序(次序)集合。
集合中必存在唯一的一个"第一个元素";
集合中必存在唯一的一个"最后的元素";
除最后元素之外,其它数据元素均有唯一的"后继";
除第一元素之外,其它数据元素均有唯一的"前驱"。
2)树形结构(层次结构)
树形结构指的是数据元素之间存在着“一对多”的树形关系的数据结构,是一类重要的非线性数据结构。在树形结构中,树根结点没有前驱结点,其余每个结点有且只有一个前驱结点。叶子结点没有后续结点,其余每个结点的后续节点数可以是一个也可以是多个。
3)图状结构(网状结构)
图是一种比较复杂的数据结构。在图结构中任意两个元素之间都可能有关系,也就是说这是一种多对多的关系。
4)其他结构
除了以上几种常见的逻辑结构外,数据结构中还包含其他的结构,比如集合等。有时根据实际情况抽象的模型不止是简单的某一种,也可能拥有更多的特征。
二、存储结构:逻辑结构在计算机中的具体实现方法,分为顺序存储方法、链接存储方法、索引存储方法、散列存储方法。
1.特点:
是数据的逻辑结构在计算机存储器中的映象(或表示)
存储结构是通过计算机程序来实现的,因而是依赖于具体的计算机语言的。
2.存储结构分类:顺序存储结构、链式存储结构、索引存储结构、散列存储结构
1)顺序存储(Sequential Storage):将数据结构中各元素按照其逻辑顺序存放于存储器一片连续的存储空间中。
2)链式存储(Linked Storage):将数据结构中各元素分布到存储器的不同点,用记录下一个结点位置的方式建立它们之间的联系,由此得到的存储结构为链式存储结构。
3)索引存储(Indexed Storage):在存储数据的同时,建立一个附加的索引表,即索引存储结构=数据文件+索引表。
4)散列存储:根据节点的关键字直接计算出该节点的存储地址的一种存储方式。
算法基本概念
1.定义:算法(Algorithm)是一个有穷规则(或语句、指令)的有序集合。它确定了解决某一问题的一个运算序列。对于问题的初始输入,通过算法有限步的运行,产生一个或多个输出。
数据的逻辑结构与存储结构密切相关:
- 算法设计: 取决于选定的逻辑结构
- 算法实现: 依赖于采用的存储结构
2.算法的特性
- 有穷性 —— 算法执行的步骤(或规则)是有限的;
- 确定性 —— 每个计算步骤无二义性;
- 可行性 —— 每个计算步骤能够在有限的时间内完成;
- 输入 ,输出 —— 存在数据的输入和出输出
3.评价算法好坏的方法
- 正确性:运行正确是一个算法的前提。
- 可读性:容易理解、容易编程和调试、容易维护。
- 健壮性:考虑情况全面,不容以出现运行错误。
- 时间效率高:算法消耗的时间少。
- 储存量低:占用较少的存储空间。
时间复杂度计算
算法效率——用依据该算法编制的程序在计算机上执行所消耗的时间来度量。“O”表示一个数量级的概念。根据算法中语句执行的最大次数(频度)来 估算一个算法执行时间的数量级。
计算方法:
写出程序中所有运算语句执行的次数,进行加和
如果得到的结果是常量则时间复杂度为1
如果得到的结果中存在变量n则取n的最高次幂作为时间复杂度
下图表示随问题规模n的增大,算法执行时间的增长率。