数据结构
我们如何⽤Python中的类型来保存⼀个班的学⽣信息? 如果想要快速 的通过学⽣姓名获取其信息呢?
实际上当我们在思考这个问题的时候,我们已经⽤到了数据结构。列表和字 典都可以存储⼀个班的学⽣信息,但是想要在列表中获取⼀名同学的信息 时,就要遍历这个列表,其时间复杂度为O(n),⽽使⽤字典存储时,可将学 ⽣姓名作为字典的键,学⽣信息作为值,进⽽查询时不需要遍历便可快速获 取到学⽣信息,其时间复杂度为O(1)。
我们为了解决问题,需要将数据保存下来,然后根据数据的存储⽅式来设计 算法实现进⾏处理,那么数据的存储⽅式不同就会导致需要不同的算法进⾏ 处理。我们希望算法解决问题的效率越快越好,于是我们就需要考虑数据究 竟如何保存的问题,这就是数据结构。
在上⾯的问题中我们可以选择Python中的列表或字典来存储学⽣信息。列表 和字典就是Python内建帮我们封装好的两种数据结构。
概念
数据是⼀个抽象的概念,将其进⾏分类后得到程序设计语⾔中的基本类型。 如:int,float,char等。数据元素之间不是独⽴的,存在特定的关系,这些 关系便是结构。数据结构指数据对象中数据元素之间的关系。
Python给我们提供了很多现成的数据结构类型,这些系统⾃⼰定义好的,不 需要我们⾃⼰去定义的数据结构叫做Python的内置数据结构,⽐如列表、元 组、字典。⽽有些数据组织⽅式,Python系统⾥⾯没有直接定义,需要我们 ⾃⼰去定义实现这些数据的组织⽅式,这些数据组织⽅式称之为Python的扩 展数据结构,⽐如栈,队列等。
算法与数据结构的区别
数据结构只是静态的描述了数据元素之间的关系。
⾼效的程序需要在数据结构的基础上设计和选择算法。
程序 = 数据结构 + 算法
总结:算法是为了解决实际问题⽽设计的,数据结构是算法需要处理的问题 载体
抽象数据类型(Abstract Data Type)
抽象数据类型(ADT)的含义是指⼀个数学模型以及定义在此数学模型上的⼀ 组操作。即把数据类型和数据类型上的运算捆在⼀起,进⾏封装。引⼊抽象 数据类型的⽬的是把数据类型的表示和数据类型上运算的实现与这些数据类 型和运算在程序中的引⽤隔开,使它们相互独⽴。
最常⽤的数据运算有五种:
插⼊ 删除 修改 查找 排序
顺序表
在程序中,经常需要将⼀组(通常是同为某个类型的)数据元素作为整体管 理和使⽤,需要创建这种元素组,⽤变量记录它们,传进传出函数等。⼀组 数据中包含的元素个数可能发⽣变化(可以增加或删除元素)。
对于这种需求,最简单的解决⽅案便是将这样⼀组元素看成⼀个序列,⽤元 素在序列⾥的位置和顺序,表示实际应⽤中的某种有意义的信息,或者表示 数据之间的某种关系。
这样的⼀组序列元素的组织形式,我们可以将其抽象为线性表。⼀个线性表 是某类元素的⼀个集合,还记录着元素之间的⼀种顺序关系。线性表是最基 本的数据结构之⼀,在实际程序中应⽤⾮常⼴泛,它还经常被⽤作更复杂的 数据结构的实现基础。
根据线性表的实际存储⽅式,分为两种实现模型:
顺序表,将元素顺序地存放在⼀块连续的存储区⾥,元素间的顺序关系 由它们的存储顺序⾃然表示。 链表,将元素存放在通过链接构造起来的⼀系列存储块中。
顺序表的基本形式
图a表示的是顺序表的基本形式,数据元素本身连续存储,每个元素所占的存 储单元⼤⼩固定相同,元素的下标是其逻辑地址,⽽元素存储的物理地址 (实际内存地址)可以通过存储区的起始地址Loc (e )加上逻辑地址(第i个 元素)与存储单元⼤⼩(c)的乘积计算⽽得,即:
Loc(e) = Loc(e ) + c*i
故,访问指定元素时⽆需从头遍历,通过计算便可获得对应地址,其时间复 杂度为O(1)。
如果元素的⼤⼩不统⼀,则须采⽤图b的元素外置的形式,将实际数据元素另 ⾏存储,⽽顺序表中各单元位置保存对应元素的地址信息(即链接)。由于 每个链接所需的存储量相同,通过上述公式,可以计算出元素链接的存储位 置,⽽后顺着链接找到实际存储的数据元素。注意,图b中的c不再是数据元 素的⼤⼩,⽽是存储⼀个链接地址所需的存储量,这个量通常很⼩。
图b这样的顺序表也被称为对实际数据的索引,这是最简单的索引结构。
转载来自51CTO博客作者我是小谷粒的原创作品:https://blog.51cto.com/13517854