什么是时间复杂度

时间频度:一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才知道。但是我们不可能也没有必要对每一个算法都进行上机测试,只需要知道那个算法花费的时间多,那个算法花费得到时间少就可以了。并且一个算法花费的时间与算法中语句 的执行次数成正比。那个算法的语句执行次数多,他花费的时间就多,一个算法中的语句的执行次数成为语句的频度或时间频度,记为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!)

一般情况下,对一个问题(或一类算法)只需选择一种基本操作来讨论算法的时间复杂度即可,有时也需要同时考虑几种基本操作,甚至可以对不同的操作赋予不同的权值,以反映执行不同操作所需的相对时间,这种做法便于综合比较解决同一问题的两种完全不同的算法。

  求解算法的时间复杂度的具体步骤是:

  ⑴ 找出算法中的基本语句;

  算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。

  ⑵ 计算基本语句的执行次数的数量级;

  只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。

  ⑶ 用大Ο记号表示算法的时间性能。

  将基本语句执行次数的数量级放入大Ο记号中。

  如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加 

  1. # 时间复杂度是O(10)
  2. for i in range(10):
  3. print(i)
  4. # 时间复杂度是O(10*10)
  5. for i in range(10):
  6. for j in range(10):
  7. print(j)
  8. # 一起的时间复杂度是 O(10)+O(10*10)

什么是链表

链表是一种常见的基础数据结构,但是不会线性的顺序存储数据,而是每一个节点里存储下一个节点的指针(Pointer),由于不必按照顺序存储,链表在插入的时候可以达到O(1)的复杂度,比起另一种线性表顺序快得多,但是查找一个节点或者访问特定编号的节点则需要O(n),的时间,而顺序表相应的时间复杂度分别是O(n)和O(1)。

链表的特点

使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理,但是链表失去了数组随机读取的优点,同时链表由于增加了节点的指针域,空间开销比较大。

链表的基本结构   

链表的种类

python 实现单链表

  1. class Node(object):
  2. def __init__(self, data, pnext=None):
  3. # 初始化节点
  4. self.data = data
  5. self.next = pnext
  6.  
  7. def __repr__(self):
  8. # 打印节点信息
  9. return str(self.data)
  10.  
  11. class LinkList(object):
  12. def __init__(self):
  13. self.length = 0
  14. self.head = None
  15.  
  16. def is_empty(self):
  17. # 判断是否为空
  18. return self.length == 0
  19.  
  20. def append(self, data_or_node):
  21. # 尾插
  22.  
  23. # 判断参数信息
  24. if isinstance(data_or_node, Node):
  25. item = data_or_node
  26. else:
  27. item = Node(data_or_node)
  28.  
  29. if not self.head:
  30. # 头指针为空
  31. self.head = item
  32. self.length += 1
  33. else:
  34. # 指向头指针所指地址
  35. node = self.head
  36. while node._next:
  37. node = node._next
  38. node._next = item
  39. self.length += 1
  40.  
  41. def insert(self, value, index):
  42. # 插入节点
  43. if type(index) is int:
  44. if index > self.length or index < 0:
  45. print("index is out of index")
  46. return
  47. else:
  48. if index == 0:
  49. self.head = Node(value, self.head)
  50. else:
  51. current_node = self.head
  52. while index-1:
  53. current_node = current_node.next
  54. index -= 1
  55. i_node = Node(value, current_node.next)
  56. current_node.next = i_node
  57. self.length += 1
  58. return
  59. else:
  60. print("Index is invaliable")
  61.  
  62. def delete(self, index):
  63. # 删除索引位置结点
  64. if type(index) is int:
  65. if index >= self.length or index < 0:
  66. print("index is out of index")
  67. return
  68. else:
  69. if 0 == index:
  70. self.head = self.head.next
  71. else:
  72. node = self.head
  73. while index-1:
  74. node = node.next
  75. index -= 1
  76. node.next = node.next.next
  77. self.length -= 1
  78. return
  79. else:
  80. print("Index is not int")
  81.  
  82. def update(self, value, index):
  83. # 更新结点
  84. if type(index) is int:
  85. if index >= self.length or index < 0:
  86. print("index is out of index")
  87. return
  88. else:
  89. node = self.head
  90. while index:
  91. node = node.next
  92. index -= 1
  93. node.data = value
  94. return
  95. else:
  96. return
  97.  
  98. def get_value(self, index):
  99. # 获取结点value
  100. if type(index) is int:
  101. if index >= self.length or index < 0:
  102. print("index is out of index")
  103. return
  104. else:
  105. node = self.head
  106. while index:
  107. node = node.next
  108. index -= 1
  109. return node.data
  110. else:
  111. return
  112.  
  113. def get_length(self):
  114. # 获取长度
  115. node = self.head
  116. length = 0
  117. while node:
  118. length += 1
  119. node = node.next
  120. print("length is ", length)
  121. print("self.length is ", self.length)
  122.  
  123. def clear(self):
  124. # 清空链表
  125. self.head = None
  126. self.length = 0
  127. print("Clear!")
  128.  
  129. def print_list(self):
  130. # 打印链表
  131. if self.is_empty():
  132. print("Link is empty")
  133. else:
  134. node = self.head
  135. while node:
  136. print node.data, "-->",
  137. node = node.next
  138. print
  139. if __name__ == '__main__':
  140. l = LinkList()
  141. ele = Node(2)
  142. l.append(ele)
  143. l.insert(1,1)
  144. l.insert(2,2)
  145. l.insert(3,2)
  146. # print l.get_value(2)
  147. print l.print_list()

Python 数据结构 链表的更多相关文章

  1. Python—数据结构——链表

    数据结构——链表 一.简介 链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构.由一系列节点组成的元素集合.每个节点包含两部分,数据域item和指向下一个节 ...

  2. python数据结构链表之单向链表

    单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...

  3. Python数据结构--链表

    class Node(): def __init__(self, dataval=None): self.dataval = dataval self.nextval = None class SLi ...

  4. Python数据结构——链表的实现

    链表由一系列不必在内存中相连的结构构成,这些对象按线性顺序排序.每个结构含有表元素和指向后继元素的指针.最后一个单元的指针指向NULL.为了方便链表的删除与插入操作,可以为链表添加一个表头. 删除操作 ...

  5. python数据结构与算法——链表

    具体的数据结构可以参考下面的这两篇博客: python 数据结构之单链表的实现: http://www.cnblogs.com/yupeng/p/3413763.html python 数据结构之双向 ...

  6. Python数据结构之单链表

    Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...

  7. python数据结构之链表(一)

    数据结构是计算机科学必须掌握的一门学问,之前很多的教材都是用C语言实现链表,因为c有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,有很多都是用模拟链表,不过这次,我不是用模拟 ...

  8. python数据结构与算法

    最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...

  9. 算法之python创建链表实现cache

    算法之python创建链表实现cache 本节内容 问题由来 解决思路 实现代码 总结 1. 问题由来 问题起因于朋友的一次面试题,面试公司直接给出两道题,要求四十八小时之内做出来,语言不限,做出来之 ...

随机推荐

  1. Ubuntu 基于Docker的TensorFlow 环境搭建

    基于Docker的TensorFlow 环境搭建 基于(ubuntu 16.04LTS/ubuntu 14.04LTS) 一.docker环境安装 1)更新.安装依赖包 sudo apt-get up ...

  2. a or an

    在英语句子中用a还是用an,一直是个容易出错的问题. 原则为:如果下一个词的发音为元音则用an,否则用a. 例: a man an elephant a house an hour 对于大写字母要注意 ...

  3. mui---取消掉默认加载框

    我们在进行打开页面新页面的时候,在APP中会在中间有一个加载框,考虑到用户体验,要取消掉,具体方法是,对openWindow进行配置: 具体参考:http://dev.dcloud.net.cn/mu ...

  4. numpy中数据合并,stack ,concentrate,vstack,hstack

    在python的numpy库中有一个函数np.stack(), 看过一些博文后觉得别人写的太复杂,然后自己有了一些理解之后做了一些比较简单的解释 np.stack 首先stack函数用于堆叠数组,其调 ...

  5. H - Farey Sequence

    The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/ ...

  6. scala 可变集合与内存清理的关系

    留坑待填 使用scala.collection.mutable._期间,发现了当程序运行内存开销较多时,使用系统工具进行内存清理,然后程序报出了变量找不到.内存无法访问.数组访问越界,堆栈溢出等多种错 ...

  7. Dapper的数据库连接管理(打开、关闭)

    Dapper对于数据库连接的管理:如果已经打开,它会关闭连接.如果你只是做一个快速查询-让Dopter自己处理它. 如果你做了很多事情,你应该自己打开连接,并在最后关闭连接,所有的查询在中…只是从效率 ...

  8. 存储json数据的编码问题

    在使用json.dumps时要注意一个问题   >>> import json >>> print json.dumps('中国') "\u4e2d\u5 ...

  9. 使用babel与@babel/node

    安装 yarn add -D @babel/cli @babel/node 编译entry-server.js yarn babel ./src/ssr/entry-server.js --prese ...

  10. Exception 06 : org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session :

    异常名称: org.hibernate.NonUniqueObjectException: A different object with the same identifier value was ...