Python 数据结构 链表
什么是时间复杂度
时间频度:一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才知道。但是我们不可能也没有必要对每一个算法都进行上机测试,只需要知道那个算法花费的时间多,那个算法花费得到时间少就可以了。并且一个算法花费的时间与算法中语句 的执行次数成正比。那个算法的语句执行次数多,他花费的时间就多,一个算法中的语句的执行次数成为语句的频度或时间频度,记为T(n)。
时间复杂度:在刚才提到是时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化,但有时我们想知道它的变化呈现什么规律,为此,引入时间复杂度的概念。一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,记作T(n)= O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称为时间复杂度。
常见的算法时间复杂度由小到大排序:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)
一般情况下,对一个问题(或一类算法)只需选择一种基本操作来讨论算法的时间复杂度即可,有时也需要同时考虑几种基本操作,甚至可以对不同的操作赋予不同的权值,以反映执行不同操作所需的相对时间,这种做法便于综合比较解决同一问题的两种完全不同的算法。
求解算法的时间复杂度的具体步骤是:
⑴ 找出算法中的基本语句;
算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。
⑵ 计算基本语句的执行次数的数量级;
只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。
⑶ 用大Ο记号表示算法的时间性能。
将基本语句执行次数的数量级放入大Ο记号中。
如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加
# 时间复杂度是O(10)
for i in range(10):
print(i)
# 时间复杂度是O(10*10)
for i in range(10):
for j in range(10):
print(j)
# 一起的时间复杂度是 O(10)+O(10*10)
什么是链表
链表是一种常见的基础数据结构,但是不会线性的顺序存储数据,而是每一个节点里存储下一个节点的指针(Pointer),由于不必按照顺序存储,链表在插入的时候可以达到O(1)的复杂度,比起另一种线性表顺序快得多,但是查找一个节点或者访问特定编号的节点则需要O(n),的时间,而顺序表相应的时间复杂度分别是O(n)和O(1)。
链表的特点
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理,但是链表失去了数组随机读取的优点,同时链表由于增加了节点的指针域,空间开销比较大。
链表的基本结构
链表的种类
python 实现单链表
class Node(object):
def __init__(self, data, pnext=None):
# 初始化节点
self.data = data
self.next = pnext def __repr__(self):
# 打印节点信息
return str(self.data) class LinkList(object):
def __init__(self):
self.length = 0
self.head = None def is_empty(self):
# 判断是否为空
return self.length == 0 def append(self, data_or_node):
# 尾插 # 判断参数信息
if isinstance(data_or_node, Node):
item = data_or_node
else:
item = Node(data_or_node) if not self.head:
# 头指针为空
self.head = item
self.length += 1
else:
# 指向头指针所指地址
node = self.head
while node._next:
node = node._next
node._next = item
self.length += 1 def insert(self, value, index):
# 插入节点
if type(index) is int:
if index > self.length or index < 0:
print("index is out of index")
return
else:
if index == 0:
self.head = Node(value, self.head)
else:
current_node = self.head
while index-1:
current_node = current_node.next
index -= 1
i_node = Node(value, current_node.next)
current_node.next = i_node
self.length += 1
return
else:
print("Index is invaliable") def delete(self, index):
# 删除索引位置结点
if type(index) is int:
if index >= self.length or index < 0:
print("index is out of index")
return
else:
if 0 == index:
self.head = self.head.next
else:
node = self.head
while index-1:
node = node.next
index -= 1
node.next = node.next.next
self.length -= 1
return
else:
print("Index is not int") def update(self, value, index):
# 更新结点
if type(index) is int:
if index >= self.length or index < 0:
print("index is out of index")
return
else:
node = self.head
while index:
node = node.next
index -= 1
node.data = value
return
else:
return def get_value(self, index):
# 获取结点value
if type(index) is int:
if index >= self.length or index < 0:
print("index is out of index")
return
else:
node = self.head
while index:
node = node.next
index -= 1
return node.data
else:
return def get_length(self):
# 获取长度
node = self.head
length = 0
while node:
length += 1
node = node.next
print("length is ", length)
print("self.length is ", self.length) def clear(self):
# 清空链表
self.head = None
self.length = 0
print("Clear!") def print_list(self):
# 打印链表
if self.is_empty():
print("Link is empty")
else:
node = self.head
while node:
print node.data, "-->",
node = node.next
if __name__ == '__main__':
l = LinkList()
ele = Node(2)
l.append(ele)
l.insert(1,1)
l.insert(2,2)
l.insert(3,2)
# print l.get_value(2)
print l.print_list()
Python 数据结构 链表的更多相关文章
- Python—数据结构——链表
数据结构——链表 一.简介 链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构.由一系列节点组成的元素集合.每个节点包含两部分,数据域item和指向下一个节 ...
- python数据结构链表之单向链表
单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...
- Python数据结构--链表
class Node(): def __init__(self, dataval=None): self.dataval = dataval self.nextval = None class SLi ...
- Python数据结构——链表的实现
链表由一系列不必在内存中相连的结构构成,这些对象按线性顺序排序.每个结构含有表元素和指向后继元素的指针.最后一个单元的指针指向NULL.为了方便链表的删除与插入操作,可以为链表添加一个表头. 删除操作 ...
- python数据结构与算法——链表
具体的数据结构可以参考下面的这两篇博客: python 数据结构之单链表的实现: http://www.cnblogs.com/yupeng/p/3413763.html python 数据结构之双向 ...
- Python数据结构之单链表
Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...
- python数据结构之链表(一)
数据结构是计算机科学必须掌握的一门学问,之前很多的教材都是用C语言实现链表,因为c有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,有很多都是用模拟链表,不过这次,我不是用模拟 ...
- python数据结构与算法
最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...
- 算法之python创建链表实现cache
算法之python创建链表实现cache 本节内容 问题由来 解决思路 实现代码 总结 1. 问题由来 问题起因于朋友的一次面试题,面试公司直接给出两道题,要求四十八小时之内做出来,语言不限,做出来之 ...
随机推荐
- DBeaver连接达梦数据库
1.连接类型选择ODBC. 2.编辑驱动设置: 1)Class Name:dm.jdbc.driver.DmDriver 2)URL Template:jdbc:dm://{dbserver}/{da ...
- nginx的80端口跳转到443
然后在80端口设置http跳转到https 在80端口location中加入rewrite ^(.*)$ https://$host$1 permanent; 如图,然后输入命令service ngi ...
- MySQL 之 表操作
一 什么是表 表(TABLE) 是一种结构化的文件,可用来存储某种特定类型的数据.表中的一条记录有对应的标题,标题 称之为 表的字段. 二 创建表 1 2 3 4 5 CREATE TABLE 表名( ...
- Centos7下使用mail发送邮件配置
参考文档:https://blog.csdn.net/lyf844692713/article/details/81479066 安装环境查看 查看服务是否安装 rpm -qa|grep mail 如 ...
- 洛谷P1182 数列分段【二分】【贪心】
题目:https://www.luogu.org/problemnew/show/P1182 题意: 有n个数,要分成连续的m段.将每段中的数相加,问之和的最大值的最小值是多少. 思路: 和P1316 ...
- 关于ti环境搭建 IAR 为什么IAR不能跳转的真正原因
1.IAR工程莫名其妙的错误,可以通过复制工程文件来解决 2.cc2540环境配置,尽量默认到c盘,以便解决不必要的麻烦,另外,不同的库尽量安装对应的环境文件,比如freertos等环境 3.对于蓝牙 ...
- 简单的Git流程
一.安装cygwin 略 二. 1.创建一个文件 $echo "中华人民共和国">>abc.txt 2.添加到文件追踪 $git add abc.txt 上一行是提交一 ...
- nethogs 查看 Linux 进程的网络使用
有时候我们客户会发现服务器或 VPS 网络慢,进一步发现大量带宽被占用,一些客户到这里为止就不知道怎么办了.有什么简单办法能找出哪个程序(或者进程)占用了带宽呢?Linux 监控流量的小工具不少,如 ...
- netstat -s TCP连接失败 相关统计 解释
针对问题:TCP连接失败 分析:netstat -s输出中和连接失败相关的参数 202270382 invalid SYN cookies received --- 三次握手ack包,syncooki ...
- 看数据库的文件大小 MySQL Binlog日志的生成和清理规则
小结: 1.避免并行大大事务对磁盘.内存的消耗: MySQL数据文件导致实例空间满的解决办法_空间/内存_常见问题_云数据库 RDS 版-阿里云 https://help.aliyun.com/kno ...