数据结构与算法(2)
数据与数据结构:
数据,
数据项,
数据元素,
数据对象,
数据结构
数据结构分为逻辑结构,数据的存储结构,数据操作
逻辑结构
- 集合
- 线性结构
- 树结构
- 图形结构
存储结构
- 顺序存储结构
- 链式存储结构
- 索引存储结构
- 散列存储结构
数据操作
- 创建操作
- 插入操作
- 删除操作
- 查找操作
- 修改操作
- 遍历操作
- 销毁操作
字符串
特性:不能修改的字符序列。除了不能修改,可把字符串当成列表一样处理。
访问:访问字符串中某个字符同访问元组或列表中的元素是一样的,专业术语叫“分片(slicing)”。
这里不做深入讨论字符串,把字符串放在这里主要是为了说明字符串具备列表的一些特点。
列表(list)
什么是列表呢?我觉得列表就是我们日常生活中经常见到的清单。比如,统计过去一周我们买过的东西,把这些东西列出来,就是清单。由于我们买一种东西可能不止一次,所以清单中是允许有重复项的。如果我们扩大清单的范围,统计我们过去一周所有的花费情况,那么这也是一个清单,但这个清单里会有类别不同的项,比如我们买东西是一种花费,交水电费也是一种花费,这些项的类型是可以使不同的。python的列表个跟清单的道理是一样的,特点就是:可重复,类型可不同。类型不同也是跟数组最本质的区别了。python里的列表用“[]”表示。
列表是可变对象,它支持在原处修改的操作.也可以通过指定的索引和分片获取元素。
区别于元组,可动态增加,删除,更新。
可以和字符串作为比较。因为字符串具备列表的一些特点。
元组(tuple)
元组和列表在结构上没有什么区别,唯一的差异在于元组是只读的,不能修改。元组用“()”表示。
元组一旦定义其长度和内容都是固定的。
一旦创建元组,则这个元组就不能被修改,即不能对元组进行更新、增加、删除操作。
若想创建包含一个元素的元组,则必须在该元素后面加逗号“,”,否则创建的不是一个元组,而是一个字符串。
集合(set)
集合就是我们数学学的集合,没有什么特殊的定义。集合最好的应用是去重。所以,集合内的元素没有重复的元素。
集合没有特殊的表示方法,而是通过一个set函数转换成集合。
集合是一个无序不重复元素集,基本功能包括关系测试和消除重复元素.。
由于集合是无序的。所以,sets 不支持 索引, 分片,或其它类序列(sequence-like)的操作。
字典(dict)
字典存储键值对数据。
字典最外面用大括号,每一组用冒号连起来,然后各组用逗号隔开。
字典最大的价值是查询,通过键,查找值。
注意:字典和集合都是无序的。
平均情况复杂度为: n(n+3)/2(n+1)
考虑概率的平均情况复杂度为: (3n+1)/4
设某算法的计算时间表示为递推关系式 T(n) = T(n-1) + n(n为正整数) 及T(0)=1,则该算法的时间复杂度为
T(n) = T(n-1)+n
= T(n-2)+(n-1)+n
= T(n-3)+(n-2)+(n-1)+n
= T(2)+3+…+(n-2)+(n-1)+n
= T(1)+2+3 +…+(n-2)+(n-1)+n
= T(0)+1+2+3+…+(n-2)+(n-1)+n
=1+1+2+3+…+(n-2)+(n-1)+n
=1+n*(n+1)/2
= O(n^2)
线性表-数组 (ArrayList)
数组按照顺序存储在连续位置的存储器中
线性表:是最基本,最简单,也是最常用的一种数据结构,一个线性表是n个具有相同特性的数据元素的有序数列,数据按照顺序存储在连续位置的存储器中。
随机访问:由于他们存储在连续的位置因此可以使用他们的索引来计算内存地址,以便随机访问数据
数组的优点:
- 空间利用率高
- 查询速度高效,通过下标来直接存取
数组的缺点:
- 插入和删除比较慢,比如:插入或者删除一个元素时,整个表需要遍历移动元素来重新排一次顺序
- 不可以增长长度,有空间限制,当需要存取的元素个数可能多于顺序表的元素的个数时,会出现“溢出”问题。当元素个数远少于预先分配的空间时,空间浪费巨大