python 下的数据结构与算法---3:python内建数据结构的方法及其时间复杂度
目录
一:python内部数据类型分类
二:各数据结构
一:python内部数据类型分类
这里有个很重要的东西要先提醒注意一下:原子性数据类型和非原子性数据类型的区别
Python内部数据从某种形式上可以分为两种:
其一是原子性数据类型:int,float,str
其余的是非原子性的(按有序性分):
有序的:list, tuple
无序的:set, dict
那么什么是原子性呢,在第一篇讲赋值语句时有个例子:
赋值语句:x = 6
其实这个过程是建立了一个指向(reference),左边的是指向,右边的是一个对象(object)或者一个有指向对象的指向,可以有多个指向指向同一个对象(object),[注意此地对象的意思,可以是值,实例,函数等等], 综上,此地时建立了一个叫x的变量(variable)让其拥有object 6的reference
注意:
>>> a=[1,2,3,4] >>> a=1
>>> b=a >>> b=a
>>> a[0]=None >>> a=2
>>> b >>> b
[None, 2, 3, 4] 1
这里就出现了一个很奇怪的现象了,左边的b跟着a变而右边的没有,其实这就是因为int为原子性数据结构带来的。可以认为原子性数据所在内存地址是固定的,这样改变了a变量的值就是改变了a变量指向的地址。而非原子性改变a就是改变了a所指内存地址所存储的东西而没有改变a指向的地址。这样就能够解释通了。
另一个有趣的例子:
my_list = [1,2,3]
A = [my_list]*3
--à[1,2,3,1,2,3,1,2,3]
变量A是三个my_list的reference的集合,my_list某个元素的改变都会折射到其上
二:各数据结构
下面会挨个说明这些内建数据结构各种方法的时间复杂度:
1:String
先回顾一下前面讲过string只有accessor method,故其所有方法都是不会改变其本身的,只是取出来做了些处理。
2:List
e.g:解析下面代码大O函数值:
def anagram_solution2(s1,s2):
a_list1 = list(s1) a_list2 = list(s2)
a_list1.sort() a_list2.sort()
pos = 0
matches = True
while pos < len(s1) and matches:
if a_list1[pos] == a_list2[pos]:
pos = pos + 1
else:
matches = False
return matches
print(anagram_solution2('abcde','edcba'))
如果不假思索的话我们会写出g(n)= n/2 + 7,则O(n) = n
其实再对照表2.2发现sort方法为O(nlogn),高阶于n,故O(n)=nlogn
说明一下:对于list,学过C语言的应该还记得其实就是利用了下标对应于起始元素的内存地址能够在O(1)计算时间找到下标为任意的元素,故list的任意元素的访问时间为O(1),若在访问了的基础上做的都是O(1)操作则自然就是O(1)啦,若做了其他的高阶操作则就是后者了。其中有个有趣的是pop()与pop(i)的不同,由于list是顺序结构,故在删除中间元素时其后所有元素要前移,故pop(i)最坏情况是pop(0),即是O(n)结合其他看起来,list是一个优于访问,败于增删的数据结构类型
3:Set
#注意啊,表1.5是set的计算符号,表1.6是set的方法
*创建set:a = { 12,’pd’,True,None }
#其时间复杂度的原理和dict一起在后面讲解
4:dict
从中可以看出痛过key获得元素的速度与list相同是O(1)的,其原理与set一起在后面说,本质上其key是通过hash函数转化作为list下标存在list中的,故与list一样是O(1),但是实际比list访问慢一些,且有可能不是O(1)
python 下的数据结构与算法---3:python内建数据结构的方法及其时间复杂度的更多相关文章
- 数据结构与算法(Python)
数据结构与算法(Python) Why? 我们举一个可能不太恰当的例子: 如果将最终写好运行的程序比作战场,我们码农便是指挥作战的将军,而我们所写的代码便是士兵和武器. 那么数据结构和算法是什么?答曰 ...
- Python中3种内建数据结构:列表、元组和字典
Python中3种内建数据结构:列表.元组和字典 Python中有3种内建的数据结构:列表.元组和字典.参考简明Python教程 1. 列表 list是处理一组有序项目的数据结构,即你可以在一个列表中 ...
- 数据结构和算法(Golang实现)(11)常见数据结构-前言
常见数据结构及算法 数据结构主要用来组织数据,也作为数据的容器,载体. 各种各样的算法,都需要使用一定的数据结构来组织数据. 常见的典型数据结构有: 链表 栈和队列 树 图 上述可以延伸出各种各样的术 ...
- 数据结构和算法(Golang实现)(12)常见数据结构-链表
链表 讲数据结构就离不开讲链表.因为数据结构是用来组织数据的,如何将一个数据关联到另外一个数据呢?链表可以将数据和数据之间关联起来,从一个数据指向另外一个数据. 一.链表 定义: 链表由一个个数据节点 ...
- 数据结构和算法(Golang实现)(13)常见数据结构-可变长数组
可变长数组 因为数组大小是固定的,当数据元素特别多时,固定的数组无法储存这么多的值,所以可变长数组出现了,这也是一种数据结构.在Golang语言中,可变长数组被内置在语言里面:切片slice. sli ...
- 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列
栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...
- 数据结构和算法(Golang实现)(15)常见数据结构-列表
列表 一.列表 List 我们又经常听到列表 List数据结构,其实这只是更宏观的统称,表示存放数据的队列. 列表List:存放数据,数据按顺序排列,可以依次入队和出队,有序号关系,可以取出某序号的数 ...
- 数据结构和算法(Golang实现)(16)常见数据结构-字典
字典 我们翻阅书籍时,很多时候都要查找目录,然后定位到我们要的页数,比如我们查找某个英文单词时,会从英语字典里查看单词表目录,然后定位到词的那一页. 计算机中,也有这种需求. 一.字典 字典是存储键值 ...
- 数据结构和算法(Golang实现)(17)常见数据结构-树
树 树是一种比较高级的基础数据结构,由n个有限节点组成的具有层次关系的集合. 树的定义: 有节点间的层次关系,分为父节点和子节点. 有唯一一个根节点,该根节点没有父节点. 除了根节点,每个节点有且只有 ...
随机推荐
- 单点登录CAS使用记(五):cas-client不拦截静态资源以及无需登录的请求。
一.问题在哪? 在配置cas-client中,有这么一段配置: <filter> <filter-name>CAS Filter</filter-name> < ...
- Android_Touch_Test
} } }); } }
- 3.3.2 嵌入汇编(摘自<linux内核完全剖析>)
内核C语言程序嵌入式汇编代码又叫内联汇编,具有输入和输出参数的嵌入汇编语句的基本格式为: ************************************************** asm( ...
- PHPCMSV9 采集网址后,再采集内容,报错:“采集采集内容 没有找到网址列表,请先进行网址采集”
解决方法:直接清除v9_collection_history 表里的内容.
- mysql导入excel数据
1.第一步我们得到了一个excel表,里面有很多需要我们导入的数据. 2.删除第1行"准考证号""XXX"....只保留我们需要的数据部分. 3.单击" ...
- 【iOS问题】字典转模型,属性个数不匹配问题
一.字典转模型的键值对与模型属性不匹配问题 1. 字典的键个数 < 模型的属性个数 (key 能与模型的属性匹配) 1> .KVO 方式: - setValuesForKeysWithDi ...
- Android 部分属性学习
android:imeOptions属性 谈一下个人的理解,设置软件盘中下一个/完成按钮的显示,如果需要监听软件盘中该按钮的事件,则需要实现 setOnEditorActionListener 其实, ...
- 从汇编来看c语言之变量
1.基础研究 对如图程序进行编译连接,再用debug加载. 我们在偏移地址1fa处查看main函数的内容: 执行到1fd处,发现n的偏移地址为01a6,段地址存储在ds寄存器里,为07c4. 再查看函 ...
- .net performance
http://msdn.microsoft.com/en-us/library/ms173196.aspx http://www.zhihu.com/question/20314377 http:// ...
- 8051单片机I/O引脚工作原理
一.P0端口的结构及工作原理 P0端口8位中的一位结构图见下图: 由上图可见,P0端口由锁存器.输入缓冲器.切换开关.一个与非门.一个与门及场效应管驱动电路构成.再看图的右边,标号为P0.X引脚的图标 ...