算法和数据结构学习笔记------基础概念

1.基本程序要素

       Python程序包含一个或多个模块。模块只是Python代码的一个文件,其中包括语句、函数定义和类定义。简短的Python程序也称为脚本,可以包含在一个模块当中。而较长的或较为复杂的程序,通常包含一个主模块和多个支持模块。主模块包含了程序执行的起点,支持模块包含了函数和类的定义。

        Python语句可分为输入语句、输出语句、赋值语句、循环和条件语句。只要对于基本语句熟练掌握,Python更复杂的结构也就变得简单。

        在程序中,一般会包含注释。这里也就不再赘述,写程序时一定要适当的添加注释和文档字符串。

       作为面向对象语言,Python自然包含类。在Python中类也是一个变量,其实例方法可分为修改器方法和访问器方法。修改器方法通过修改对象的实例变量来修改或改变对象的内部状态;访问器方法直接查看或使用对象的实例变量的值。以列表为例,其修改器方法有append、insert、pop、remove和sort;其访问器方法有索引切片等。

       对于Python来说,其算法和数据结构是通过类来实现的,它能够将一系列对象联系在一起,这些对象组成的整体一般会被称为集合。

2.集合概述

       注意:在数据结构与算法中集合的概念是指一系列对象所组成的一个整体,而不是Python中狭义的set或frozenset,这里更倾向于数学领域中的集合概念(可能不具备数学集合的互异性)。

       Python包含了几种内建的集合类型:字符串、列表、元祖、集(set)和字典。字符串和列表可能是最常用和最基本的集合类型了。其他重要的集合类型还包括栈、队列、优先队列、树、堆、图、包(bag)和给中类型的有序集合。

       集合可以是同构的,这意味着集合中的所有项必须具有相同的类型;也可以是异构的,也就是这些项可以是不同的类型。Python中支持异构的集合,但是在其他很多编程语言中,集合是同构的。

       集合通常是动态的而不是静态的,也就是问题的规模可能随时需要增加或缩小,而且每一项也是可变得。当然这些规则对于一些集合是例外的,例如Python的字符串和元组。

       区分集合的另一个重要特征是它们的组织方式不同。例如线性集合,层级集合,图集合,无序集合,有序集合等。

2.1线性集合

       线性集合中的项就像在银行排队办理业务的人一样,都是按照位置有序存在的。除第一项外每一项都有唯一的前驱,除最后一项每一项都有唯一的后继。如下图所示,D2的前驱是D1,D2的后继是D3。线性集合的示例如购物的清单、串起来的算筹等。


2.2层级集合

       层级集合中的数据项,在结构中的顺序类似于一棵上下颠倒的树(和ubuntu中tree结构类似)。除最顶端的第一个数据项每个数据项都只有一个前驱,称为其父亲,但可能有多个后继,称为其孩子。如下图,D3的前驱为D1,D3的后继为D4、D5、D6。


2.3图集合

       图集合也叫图,这个集合中的每一项都可能有多个前驱和多个后继,如下图。示例:城市间的航线图。


2.4无序集合

       正如其名称所示,无序集合中的项没有特定的顺序,并且讨论一个项的前驱或后继也没有意义。如一袋玻璃球,尽管可以将玻璃球放入一个袋子,也可以按照任意的顺序将所有玻璃球取出,但是玻璃球之间并没有顺序。

2.5有序集合

       有序集合是在其项上添加一个自然的顺序。如电话簿中的条目。

       为了施加一种自然的顺序,必须要有某种规则来比较各项,比如itemi <= itemi+1,以便能够访问有序集合中的各个项。

       有序列表是有序集合中最常见的一个例子,有序集合并不需要是线性的或者是按照位置来排序的。再例如层级集合的一种特殊的类型叫做二叉搜索树,它也是在其各项上施加了一种自然的顺序。

       一个有序的集合,允许按照拍好的顺序来访问其所有的项。一些操作,例如搜索,在有序集合上可能比在无序集合上更为高效。

2.6集合类型的分类

       对于这些主要的集合类型,可以对其进行分类,可以用图表的形式将他们之间的组织关系表示出来,但是要注意这个分类中的类型名称并不意味着集合的一个特定的实现,因为一种特定类型的集合可以有多种实现方式。如下图所示。


3.集合上的操作

       在一个集合上可以执行的操作,会根据所使用的集合类型的不同而有所不同,这些操作可以分为下表3.1所示的几种类型。

表3.1                                                          集合的操作的分类
操作分类说明
确定大小使用Python的len函数来获取集合中当前项的数目
测试项的成员关系使用Python的in运算符在集合中搜索一个给定的目标项。如果找到这个项,返回True,否则返回False
遍历集合使用Python的for循环来访问集合中的每一个项。访问项的顺序取决于集合的类型
集合的字符串表示使用Python的str函数来获取集合的字符串表示
测试相等性使用Python的==运算符来确定两个集合是否相等。如果两个集合具有相同的类型且包含相同的项,那么他们是相等的。比较哪两对项的顺序,取决于集合的类型
连接两个集合使用Python的+运算符来获取和运算数相同类型的一个新的集合,并且这个新的集合中包含了两个运算数中的项
转换为另一种类型的集合使用源集合中相同的项,来创建一个新的集合。克隆是类型转换的一个特例,其中两个集合具有相同的类型
插入一项给集合添加一项,可能在一个给定的位置添加
删除一项从集合中删除一项,可能在一个给定的位置删除
替换一项将删除和插入组合到一个操作之中
访问或获取一项获取一项,可能从一个给定的位置获取
  
       注意,这些操作中有几个和标准的Python运算符、函数或控制语句有关,例如,in/+/len/str/for循环。对于Python中的插入、删除、替换或访问操作来说,并没有单独的名称,然而,有一些标准的变体。例如pop方法用于从Python列表中给定的位置删除项,或者从Python字典中删除给定的键的值。remove方法用于从Python集或列表中删除给定的项。针对这些操作,尽量使用标准的运算符、函数或方法名。

4.集合的实现

一般情况下,并不关心集合实现的具体细节(偏向底层的细节),而更多的是将集合作为一个抽象体来使用,在计算机科学中,集合也称为抽象数据类型(abstract data types, ADT)。ADT的用户只关心其接口,或者说关心该类型的对象所识别的一组操作。所以,在编写时可以隐藏或忽略那些不重要的细节。一般会采用封装类的方法将各种集合的实现细节封装,只留接口。

5.小结

  • 集合是保存0个或多个其他对象的对象。集合拥有访问对象、插入对象、删除对象、确定集合大小以及遍历或访问集合的对象的操作。
  • 集合的5个主要类别是:线性集合、层次集合、图集合、无序集合和有序集合。
  • 线性集合按照位置来排列其项,除了第一项每一项都有唯一的前驱,除了最后一项每一项都有唯一的后继。
  • 层次集合中的项都拥有唯一的前驱(除最顶层的那个)以及0个或多个后继。
  • 图中的项都拥有0个或多个后继以及0个或多个前驱。
  • 无序集合中的项没有特定的顺序。
  • 集合是可迭代的,可以用一个for循环来访问包含在集合中的每一项。
  • 抽象的数据类型是一组对象,以及这些对象上的操作。因此,集合是抽象数据类型。
  • 数据结构是表示集合中包含的数据的一个对象。

6.参考文献

[1]  [美] Kenneth A.Lambert 著; 李军译.  数据结构(Python语言描述). 北京:人民邮电出版社,2017.12

7.版权声明

本文系笔者参考所购图书. 北京人民邮电出版社2017.12版数据结构(Python语言描述)》编写,仅用于数据结构和算法的学习交流,无作他用。如需转载请注明出处。本文网址: https://blog.csdn.net/Mengrui_1991/article/details/80950392


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值