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个有限节点组成的具有层次关系的集合. 树的定义: 有节点间的层次关系,分为父节点和子节点. 有唯一一个根节点,该根节点没有父节点. 除了根节点,每个节点有且只有 ...
随机推荐
- Chrome下的语音控制框架MyVoix.js使用篇(四)
在上一篇博文中,我为大家介绍了myvoix.js中的smart learning模块,以及何如使用该功能.(myvoix.js的源码地址会在每一篇文章末尾放出) 文本将拓展 Chrome下的语音控制框 ...
- Javascript Array Distinct (array.reduce实现)
javascript 没有原生的Distinct功能 . (至少现在还没有)但我们可以通过简单的script 自己实现 . Distinct就是把数组中重复出现2次或以上的值给删除掉,确保数组内每个值 ...
- uva 10026 Shoemaker's Problem
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- BZOJ1651: [Usaco2006 Feb]Stall Reservations 专用牛棚
1651: [Usaco2006 Feb]Stall Reservations 专用牛棚 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 509 Sol ...
- iOS 9之WatchKit for WatchOS 2
金田(github示例源码) 自AppleWatch发行的同时就可以为AppWatch开发相应的应用程序,不过最初的版本,能开发的功能极为有限,所以也只是有少数的App厂商为Apple定制了App,所 ...
- U8800安装软件显示无效的URI问题
看到很多人遇到这个问题,其中包括我自己,最后找到可行的解决办法,现整理出来一个新帖,有同样问题的U友可以参考下. 手机先连接电脑,进入USB存储状态,然后在计算机上找到SD卡目录下的.android_ ...
- HDOJ 1323 Perfection(简单题)
Problem Description From the article Number Theory in the 1994 Microsoft Encarta: "If a, b, c a ...
- Android取得电池的电量
首先需要用到的是一个类继承BrocastReceiver 2 代码如下: public class Battery_Info extends BroadcastReceiver { @Override ...
- Android中程序包的相关操作
//获取系统中已经安装的应用程序 List<PackageInfo> packageinfos=this.getPackageManager().getInstalledPackages( ...
- 大型分布式C++框架《一:框架简介》
首先名字要取得霸气才能吸引人气,哈哈~~ 下面简单介绍下情况.框架是腾讯电商平台的分布式框架.虽然腾讯拍拍已经玩完了.但是这套框架还是很不错的.而且据原腾讯同事说微信也是用的这套框架.源码肯定是不能说 ...