第1章数据结构和算法

http://localhost:8888/notebooks/%E7%AC%AC%E4%B8%80%E7%AB%A01.ipynb

1.序列类型(6个,常见列表与元组)

1.1列表list——方括号 & 逗号隔开 & 允许不同类型数据项并存

①截取:第一个索引为0,list[0]、list[N:]、list[-N]

②修改:list.append()、del list[N]、list1+list2、list*N、N in list、for i in [n,m,l,...]

③函数:比较两个列表(比较是否同类型数据、比较数字、数字是最小的、长的大、平局返回0、-1后者大、1前者大)cmp(list1,list2)、len(list)、max(list)、min(list)、list(seq)

④方法:末尾追加list.append(obj)、统计obj出现次数list.count(obj)、追加多个值list.extend(seq)、找出obj第一个匹配项的索引值list.index(obj)、插入特定位置list.insert(index,obj)、移除并输出(默认-1)list.pop([index=-1])、移除第一个匹配项list.remove(obj)、反向列表list.reverse()、排序(cmp规定排序方式、key为指定的进行比比较的元素如def takeSecond(elem) return elem[1]、reverse=True降序,默认False升序、无返回值)、list.sort(cmp=None,key=None,reverse=False)、清空列表list.clear()、复制列表list.copy()

1.2元组tuple——小括号或引号 & 逗号隔开 & 元素不可修改

只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用

索引从0开始,可截取、组合

del tuple、len(tuple)、max(tuple)、min(tuple)、tuple(seq)、截取&修改同列表

1.3集合set:无序的不重复元素序列 & 集合内值唯一(可应用于去重复set(list),但不能保证元素间顺序不变)

set={,,}、set(value)、obj in set、&^|-、for x in set、添加元素s.add()、添加元素且参数可以是列表,元组,字典等s.update()、指定移除不存在报错s.remove(x)、指定移除不存在不报错s.discard()、随机移除s.pop()、统计个数len(s)、清空s.clear()、返回两个集合组成的新集合,但会移除两个集合的重复元素x.symmetric_difference(y)、返回两集合并集s.union()、返回两集合交集s.intersection()、返回两交集的差集s.difference()、移除集合中的元素,该元素在指定的集合也存在s.difference_update()、判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False,判断集合 y 中是否有包含 集合 x 的元素,s.isdisjoint()、判断集合 x 的所有元素是否都包含在集合 y 中x.issubset(y)

1.4字典dictionary——花括号 & 冒号隔开 & 可变容器模型,且可存储任意类型对象

键必须是唯一且不可变的(字符串、数字、元组),value=dict[key]

删除键del dict[key]、清空字典dict.clear() 、删除字典del dict、统计个数len(dict)、以可打印的字符串表示str(dict)、删除字典内所有元素radiansdict.clear()、返回字典的浅复制radiansdict.copy()、创建字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值radiansdict.fromkeys()、返回指定键的值,如果值不在字典中返回default值radiansdict.get(key,default=None)、和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default,radiansdict.setdefault(key,default=None)以列表返回可遍历的(键, 值) 元组数组radiandict.items()、返回一个迭代器,可以使用 list() 来转换为列表radiansdict.keys()、返回一个迭代器,可以使用 list() 来转换为列表radiansdict.values()、把字典dict2的键/值对更新到dict里radiandict.update(dict2)、删除特定键对应的值返回被删除的值若无返回default,pop(key[,default])、随机返回并删除字典中的最后一对键和值popitem()、判断键存在否key in dict

1.2其他概念

1.2.1可迭代对象

https://www.cnblogs.com/wswang/p/6047994.html

https://blog.csdn.net/liangjisheng/article/details/79776008

1.2.2*表达式:

当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值。

1.2.3三元条件判断表达式(and or/if else)

https://www.cnblogs.com/yunlong-study/p/8915949.html

1.2.4递归https://www.cnblogs.com/zhangxinqi/p/8007537.html

递归算法是一种直接或间接调用自身算法的过程,但不是Python的强项。

解决问题的特点:

(1)递归就是在过程或函数里调用自身

(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

(3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低,所以一般不提倡用递归算法设计程序。

(4)在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储,递归次数过多容易造成栈溢出等。

递归算法所体现的“重复”一般有三个要求:

(1)每次调用在规模上都有所缩小(通常是减半)

(2)是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出作为后一次的输入)

(3)在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模位达到直接解答的大小为条件)无条件递归调用将会成为死循环而不能正常结束。

1.2.5复杂度https://blog.csdn.net/mycoolx/article/details/6538350

一个算法的评价主要从时间复杂度和空间复杂度来考虑。 

一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。 

空间复杂度是指算法在计算机内执行时所需存储空间的度量。记作: S(n)=O(f(n)) 。我们一般所讨论的是除正常占用内存开销外的辅助存储单元规模。

常见算法时间复杂度:

O(1): 表示算法的运行时间为常量

O(n): 表示该算法是线性算法

O(㏒2n): 二分查找算法

O(n2): 对数组进行排序的各种简单算法,例如直接插入排序的算法。

O(n3): 做两个n阶矩阵的乘法运算

O(2n): 求具有n个元素集合的所有子集的算法

O(n!): 求具有N个元素的全排列的算法

优<---------------------------<劣

O(1)<O(㏒2n)<O(n)<O(n2)<O(2n)

时间复杂度按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n2)、立方阶O(n3)、……k次方阶O(nk)、指数阶O(2n)。

push和pop的复杂度是O(logN)

1.2.6堆

堆是一个二叉树,其中每个父节点的值都小于或者等于其所有子节点的值。整个堆的最小元素总是位于二叉树的根节点

1.2.7lambda匿名函数

https://baijiahao.baidu.com/s?id=1594710285340462950&wfr=spider&for=pc

1.2.8class类https://blog.csdn.net/wklken/article/details/6313265

两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问

在类内部的方法中使用时 self.__private_attrs

类的专有方法:

__init__  构造函数,在生成对象时调用

__del__   析构函数,释放对象时使用

__repr__ 打印,转换

__setitem__按照索引赋值

__getitem__按照索引获取值

__len__获得长度

__cmp__比较运算

__call__函数调用

__add__加运算

__sub__减运算

__mul__乘运算

__div__除运算

__mod__求余运算

__pow__称方

1.2.9计算程序运行时间

https://www.cnblogs.com/rookie-c/p/5827694.html

1.2.10列表&栈&队列https://blog.csdn.net/nfr413/article/details/78448954

栈结构,其实就是一个后进先出的一个线性表,只能在栈顶压入或弹出元素。用列表表示栈,则向栈中压入元素,可以用列表的append()方法来实现,弹出栈顶元素可以用列表的pop()方法实现。

队列,其实就是一个先进先出的线性表,只能在队首执行删除操作,在队尾执行插入操作。用列表表示队列,可以用append()方法实现在队尾插入元素,用pop(0)方法实现在队首删除元素。

1.2.11字典dict

zip()将字典的键和值反转,zip创建了一个迭代器,内容只被消费一次既只执行一次。因为字典的处理只对键进行处理,而非值;结合sorted()进行排序

可哈希的对象:

1.3.12flat file 平面文件

https://blog.csdn.net/weixin_38300566/article/details/84841602

1.2.13slice()切片

slice(n,N)  [n,N)

del items[a] 会删除items中的数据

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容