一、list的基本实现技术

在数据结构中,如果用python实现线性表,无疑要提到list,list是一种元素个数可变的线性表(而tuple是不变的表,不支持改变其内部状态的任何操作,其他与list性质类似),采用分离式技术实现的动态顺序表,表中元素保存在一块连续存储区内。实现约束有如下两点:

1、基于下标(位置)的高效元素访问和更新,时间复杂度是O(1)

2、允许任意添加元素,不可以出现由于表满而无法加入新元素的情况;而且在添加新元素之后,表对象标识不变。

在python的官方实现中,list的实现策略如下:

1、在建立空表(或很小的表)时,系统分配一块能容纳8个元素的存储区;
2、在执行insert或append等操作来扩充表时,如果元素区满就换一块4倍大的存储区,把所有元素copy过去;
3、如果当前的表已经“很大”(这里阈值为50000),系统将改变策略,换存储区时容量加倍,这是为了避免出现过多的空闲存储位置。

注:python没有提供检查一个list对象的当前存储块容量的操作,也没有设置容量的操作,一切与容量有关的处理都由Python解释器自动完成,这和c++、java等有很大的区别。优点是降低了编程的负担,避免人为操作可能引进的错误。但全部交给解释器来完成也限制了表的使用方式。

小练习:list的内置方法reverse,自己实现的方法:

 def my_reverse(lst):
elems = lst
i,j = 0, len(elems)-1
while i <j:
elems[i], elems[j] = elems[j], elems[i] #这里交换元素写在一行,不需要设置中间的temp作为交换媒介
i,j = i+1, j-1
return elems
a = [1,2,3,4,5,"a"]
print a
print '\nafter my reverse',my_reverse(a)

二、单链表类的实现

单链表的基础知识就不往上贴了,下面贴个python实现的实现类

1、利用循环创建一个简单的单链表

 # -*- coding:utf-8 -*-
'''
简单的循环调用一个长度为10的单链表
'''
class LNode: #实现单链表的节点类
def __init__(self,elem, next_=None):
self.elem = elem
self.next = next_ #以next_命名,避免与标准函数next重名,这是python的命名习惯 llist1 = LNode(1)
p = llist1 for i in range(2,11):
p.next = LNode(i)
p = p.next p = llist1 #把链表的指针重新指向第一个节点
while p:
print p.elem
p = p.next

2、单链表类的实现

 # -*- coding:utf-8 -*-
__author__ = 'webber'
'''单链表类的实现''' class LNode: #实现单链表的节点类
def __init__(self,elem, next_=None):
self.elem = elem
self.next = next_ #以next_命名,避免与标准函数next重名,这是python的命名习惯 class LinkedListUnderflow(ValueError): #继承标准异常的子类ValueError
pass class LList:
def __init__(self):
self._head = None def is_empty(self):
return self._head is None def prepend(self,elem):
self._head = LNode(elem,self._head) def pop(self):
if self._head is None: #无结点,引发异常
raise LinkedListUnderflow("in pop")
ele = self._head.elem
self._head = self._head.next
return ele def pop_last(self): #这里有两个特殊情况,表为空,或者表中只有一个元素,pop掉最后一个元素的时间复杂度为O(n)
if self._head is None: #空表,无结点,引发异常
raise LinkedListUnderflow("in pop_last")
p = self._head
if p.next is None: #表中只有一个元素
ele = p.elem
self._head = None
return ele
while p.next.next is not None: #直到p.next是最后的结点
p = p.next
ele = p.next.elem
p.next = None
return ele def append(self, elem):
if self._head is None:
self._head = LNode(elem)
return
p = self._head
while p.next:
p = p.next
p.next = LNode(elem) def printall(self):
p = self._head
while p:
print p.elem,
if p.next:
print ",",
p = p.next
print "" mlist1 = LList()
print mlist1.is_empty()
for i in range(10):
mlist1.prepend(i)
for i in range(11,20):
mlist1.append(i)
mlist1.printall()
print mlist1.is_empty()
for i in range(5):
mlist1.pop()
print "pop 5 个数据之后:"
mlist1.printall()

3、表的遍历

python语言为内部汇集类型提供的遍历机制是迭代器,标准使用方式是放在for语句头部,在循环体中逐个处理汇集对象的元素,用yield实现。可在上面的单链表类中添加如下方法:

  def elements(self):
p = self._head
while p is not None:
yield p.elem #返回结点元素
p = p.next for i in mlist1.elements():
print i,

筛选生成器:下面是一个筛选生成器的方法,可以将单链表中所有符合条件的结点元素返回,这里需要注意两点:一是关于yield和return的用法区别,yield使这个方法变成一个迭代器,每一次循环迭代器使用next方法返回一个值,而return如果执行的话,整个函数就结束了。二是这里在调用该方法时需要一个“判断谓词参数”,在python中可以使用lambda表达式定制这个操作参数,方法和调用如下:

  def filter(self,pred):      #筛选生成器
p = self._head
while p:
if pred(p.elem):
yield p.elem
p = p.next for i in mlist1.filter(lambda i:i>10): #谓词参数,返回单链表中元素大于10的元素
print i,

数据结构---python---表的更多相关文章

  1. hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)

    基础数据结构——顺序表(2) Time Limit: 1000 MS    Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...

  2. hrbust-1545-基础数据结构——顺序表(2)

    http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1545 基础数据结构——顺序表(2) ...

  3. [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList

    一.线性表 1,什么是线性表 线性表就是零个或多个数据元素的有限序列.线性表中的每个元素只能有零个或一个前驱元素,零个或一个后继元素.在较复杂的线性表中,一个数据元素可以由若干个数据项组成.比如牵手排 ...

  4. 数据结构-ST表

    数据结构-ST表 不可修改,在线查询的 RMQ 问题. 其中 \(f[i][j]\) 表示 \(i\sim i+(1<<j)-1\) 这段的 RMQ 值. 时间复杂度 \(O(n\log ...

  5. Redis数据结构—跳跃表

    目录 Redis数据结构-跳跃表 跳跃表产生的背景 跳跃表的结构 利用跳跃表查询有序链表 Redis跳跃表图示 Redis跳跃表数据结构 小结 Redis数据结构-跳跃表 大家好,我是白泽,最近学校有 ...

  6. [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)

    [数据结构-线性表1.2] 链表与 LinkedList<T> [注:本篇文章源码内容较少,分析度较浅,请酌情选择阅读] 关键词:链表(数据结构)    C#中的链表(源码)    可空类 ...

  7. python算法与数据结构-顺序表(37)

    1.顺序表介绍 顺序表是最简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空,所以插入.删除时需要移动大量元素.顺序表可以分配一段连续的存储空间 ...

  8. python数据结构——线性表

    线性表 线性表可以看作是一种线性结构(可以分为顺序线性结构,离散线性结构) 1. 线性表的种类: 顺序表 元素存储在一大块连续存储的地址中,首元素存入存储区的起始位置,其余元素顺序存放. (元素之间的 ...

  9. 【数据结构 Python & C++】顺序表

    用C++ 和 Python实现顺序表的简单操作 C++代码 // Date:2019.7.31 // Author:Yushow Jue #include<iostream> using ...

  10. Python数据结构-序表

    序表解包: list=['aa','bb','cc'] [a1,a2,a3]=list

随机推荐

  1. 牛客网 牛客小白月赛1 E.圆与三角形-公式题

    E.圆与三角形   链接:https://www.nowcoder.com/acm/contest/85/E来源:牛客网     这个题把公式推一下, 发现就是1+sinA*r,sinA最大为1,所以 ...

  2. 洛谷——P3387 【模板】缩点

    P3387 [模板]缩点 题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点, ...

  3. HDU 3549 Flow Problem (dinic模版 && isap模版)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 题意: 给你一个有向图,问你1到n的最大流. dinic模版 (n*n*m) #include ...

  4. mysql老司机之路

    MYSQL数据库基础: 数据库帮我们解决以下数据存取难题: 较大数据量 事务控制 持久化和数据安全 高性能要求 高并发访问 关系型:mysql,oracle,sql server,postgresql ...

  5. 双网卡环境导致Oracle连接异常

    现在就是流行向最高水平看齐,这次项目的部署,好好的SQL Server扔了(有正版授权的企业版,神啊...),逢人就夸:“俺们那上的可是最顶级的Oracle Database System!”.看了看 ...

  6. New Ubuntu 16.04 Server Checklist

    新的云服务器需要进行一些配置和安装一些软件,推荐Digitalocean社区的一些教程 服务器配置(包括SSH,安全设置):https://www.digitalocean.com/community ...

  7. leetcode第一刷_Word Search

    这道题之前一直没敢做,没想到前天用递归一遍过了. . 当时为什么想着用递归,而不是dp呢.由于我想到达某个位置的情况有非常多,即使从当前位置開始的搜索是已知的,但之前的状态是如何的也无从得知啊,实话实 ...

  8. vue 组件创建与销毁

    vue 组件(如对话框组件)实时创建与销毁: 使用v-if <search-history :show="showSearchHistory" @close="sh ...

  9. vue prop单向数据流

    Prop 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是反过来不会.这是为了防止子组件无意间修改了父组件的状态,来避免应用的数据流变得难以理解. 另外,每次父组件更新时,子组件的所有 pro ...

  10. tyvj-1460 旅行

    题目描写叙述: A国有n座城市,每座城市都十分美,这使得A国的民众们很喜欢旅行. 然而,A国的交通十分落后,这里仅仅有m条双向的道路.而且这些道路都十分崎岖,有的甚至还是山路.仅仅能靠步行.通过每条道 ...