1、什么是数据结构?
先介绍几个概念。
信息是目前在生活和工作中最经常听到的一个词,但要给信息这个概念一个容易理解的确切定义并不容易。人们希望用计算机处理的终极对象就是客观存在的各种信息,因此说计算机是处理信息的工具。
数据是信息的载体,是指计算机(程序)能够处理的符号形式的综合,或说是经过了编码的信息(信息的编码显示)。数据是计算机程序加工的原料。
数据元素用于指最基本的数据单位,在计算机硬件层面,所有被存储和处理的数据最终都编码为二进制代码形式。一切数据最终都表现为二进制的序列,最基本的数据元素就是一个二进制位。但在计算机应用的各个层面上,数据可能具有更加丰富多彩的表现形式,这时说的一个数据元素就是指在当前的上下文中作为整体保存和处理的一个数据单元。
数据类型是一个值的集合和定义在此集合上的一组操作的总称。数据类型分为:1)原子类型,它的值不可再被分割的数据类型;2)结构类型,它的值还可以再分割为若干个成分的数据类型;3)抽象数据类型,抽象数据组织与之相关的操作。
数据结构是相互之间存在一种或多种特定关系的数据元素的集合,也可以这样说,数据元素互相之间都存在这某种关系(不会孤立存在),这样的数据元素之间存在的关系就被称为结构。数据结构三要素:逻辑结构、存储结构和数据的运算。
数据的逻辑结构和存储结构是密不可分的两个方面,算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的存储结构。逻辑结构可以认为是在大脑中构想出的数据之间的存储关系,存储结构则为电脑内存中存储关系。
(1)逻辑结构
逻辑结构是指数据元素之间的逻辑关系,与数据的存储无关,是独立于计算机的。数据的逻辑结构分为线性结构和非线性结构,线性表是典型的线性结构;集合、树和图是典型的非线性结构。
线性结构:数据中的元素之间只存在一对一的关系;
集合:结构中的数据元素之间除“同属于一个集合外”,别无其他关系;
树形结构:结构中的数据元素之间存在一对多的关系;
图状结构:结构中的数据元素之间存在多对多的关系。
(2)存储结构
存储结构是指数据结构在计算机中的表示(又称映像),也称物理结构。它包括数据元素的表示和关系的表示。数据的存储结构是用计算机语言实现的逻辑结构,它依赖于线性结构计算机语言。数据的存储结构主要有顺序存储、链式存储、索引存储和散列存储。
顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。优点是可以实现随机存取,每个元素占用最少的存储空间;缺点是只能使用相邻的一整块存储单元,因此可能产生较多的外部碎片。
链式存储:不要求逻辑上相邻的元素在物理位置上也相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系。优点是不会出现碎片现象,能充分利用所有存储单元;缺点是每个元素因存储指针而占用额外的存储空间,且只能实现顺序存取。
索引存储:在存储元素信息的同时,还建立附加的索引表。索引表中的每项称为索引项,索引项的一般形式是(关键字,地址)。优点是检索速度快;缺点是附加的索引表额外占用存储空间,另外,增加和删除数据时也要修改索引表,因而会花费比较多的时间。
散列存储:根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储。优点是检索、增加和删除结点的操作都很快;缺点是若散列函数不好,则可能出现元素存储单元的冲突,而解决冲突会增加时间和空间开销。
(3)运算
数据的运算包括运算的定义和实现。运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤。
2、PYTHON里的八大数据类型
不可再分的基本类型包括逻辑类型Boolean、数值型number、字符串类型string、空值None,还有一些组合数据类型包括列表list、元组tuple、集合set、字典dict。其中,不可变类型:数字、字符串、元组;可变类型:列表、集合、字典。
(1)逻辑类型Boolean
类型bool包括两个值(两个对象)True和False,可用操作包括and、or和not。
(2)空值None
空值是python里的一个特殊值,用None表示,None不能理解为0,因为0是有意义的,而None是一个特殊值。
(3)数值型number
数值型number存储数字数据,支持三种不同的数值类型,整型int、浮点型float、复数complex。
(4)字符串string
字符串就是以单引号或双引号括起来的任意文本,例如:'zifuchuan'、'字符串'。
(5)列表list
当需要存储一组数据时候,就需要用序列,序列给每个元素都分配一个索引,第一个是0,第二个是1,以此类推。常用的序列有:列表和元组,当我们需要改变序列的元素时候,就用列表,因为某些原因,序列不能修改时候,使用元组更加合适。创建一个列表,只要把逗号分割的不同的数据项使用方括号括起来即可。列表的数据项不需要相同的类型。
(6)元组tuple
某些情况下,我们需要的序列不可修改,这个时候,就需要用元组,元组和列表相似,但是元组的元素值不可修改也不能删除,可以进行分片和连接。元组创建很简单,用小括号括起来,用逗号隔开。元组是用小括号,列表使用中括号。
(7)集合set
类似dict,是一组Key的集合,不存储value,本质:无序和无重复元素的集合。
(8)字典dict
列表中元素通过下标进行定位,但是元素位置发生变化,则很难定位,python提供一种新的类型,那就是字典。字典中元素可以通过key访问。说明:字典是由花括号括起来的,包含key、value两部分,dict={'key1':'value1','key2':'value2'},字典和列表一样,也能够存储多个数据,列表中找某个元素时,是根据下标进行的,字典中找某个元素时,是根据key进行的。