python数据结构之动态数组
数组列表:动态数组(Array List)
简介:
最基础简单的数据结构、最大的优点就是支持随机访问(O(1)),但是增加和删除操作效率就低一些(平均时间复杂度O(n))
动态数组也称数组列表,在python中一般为List
由于Python包装好了很多算法上的现成的数组操作函数,通过学习对其内部进行进一步的了解;
下面我对内置函数进行整理学习写下学习笔记:
- 动态数组(数组列表)的概念
- 数组操作函数
- 数组内置函数方法的时间复杂度
- 把内置函数的内部实现方法用python去实现
1.数组列表的概念:
- 顺序存储数据
- 连续存储
- 任意顺序访问,可变大小的列表数据结构允许增加、删除元素
2.数组操作函数:

3.数组内置操作函数的时间复杂度:


4.用python实现内置函数的方法:
#函数上会标明该方法的时间复杂度
#动态数组的类 class DynamicArray: def __init__ (self):
'Create an empty array.'
self._n = 0 #size
self._capacity = 10 #先给个10
self._A = self._make_array(self._capacity) def __len__ (self):
return self._n def is_empty(self):
return self._n == 0 # O(1)
def __getitem__ (self, k):
if not 0 <= k < self._n:
raise ValueError('invalid index')
return self._A[k] # O(1)
def append(self, obj):
if self._n == self._capacity: #首先要判断该容器是否放得下
self._resize(2 * self._capacity)
self._A[self._n] = obj
self._n += 1 def _make_array(self, c):
return (c * ctypes.py_object)( ) def _resize(self, c):
B = self._make_array(c)
for k in range(self._n):
B[k] = self._A[k]
self._A = B
self._capacity = c # O(n)
def insert(self, k, value):
if self._n == self._capacity:
self._resize(2 * self._capacity)
for j in range(self._n, k, -1): #从后往前一个一个往后移
self._A[j] = self._A[j-1]
self._A[k] = value
self._n += 1 # O(n)
def remove(self, value):
for k in range(self._n):
if self._A[k] == value: #一个个查value
for j in range(k, self._n - 1):
self._A[j] = self._A[j+1] ##再一个个移上来
self._A[self._n - 1] = None
self._n -= 1
return
raise ValueError( 'value not found' ) def _print(self):
for i in range(self._n):
print(self._A[i], end = ' ')
print() mylist = DynamicArray()
print ('size was: ', str(len(mylist)))
mylist.append(10)
mylist.append(20)
mylist.append(30)
mylist.insert(0, 0)
mylist.insert(1, 5)
mylist.insert(3, 15)
mylist._print()
mylist.remove(20)
mylist._print()
print ('size is: ', str(len(mylist))) #输出结果
size was: 0
0 5 10 15 20 30
0 5 10 15 30
size is: 5
python数据结构之动态数组的更多相关文章
- (2)redis的基本数据结构是动态数组
redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; ]; }; 这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针, ...
- JAVA数据结构--ArrayList动态数组
在计算机科学中,动态数组,可扩展数组,可调整数组,动态表,可变数组或数组列表是一种随机存取可变大小列表数据结构,允许添加或删除元素.它提供许多现代主流编程语言的标准库.动态数组克服了静态数组的限制,静 ...
- nginx学习七 高级数据结构之动态数组ngx_array_t
1 ngx_array_t结构 ngx_array_t是nginx内部使用的数组结构.nginx的数组结构在存储上与大家认知的C语言内置的数组有相似性.比方实际上存储数据的区域也是一大块连续的内存. ...
- 用最复杂的方式学会数组(Python实现动态数组)
Python序列类型 在本博客中,我们将学习探讨Python的各种"序列"类,内置的三大常用数据结构--列表类(list).元组类(tuple)和字符串类(str). 不知道你发现 ...
- 常用数据结构-线性表及Java 动态数组 深究
[Java心得总结六]Java容器中——Collection在前面自己总结的一篇博文中对Collection的框架结构做了整理,这里深究一下Java中list的实现方式 1.动态数组 In compu ...
- 数据结构(1) 第一天 算法时间复杂度、线性表介绍、动态数组搭建(仿Vector)、单向链表搭建、企业链表思路
01 数据结构基本概念_大O表示法 无论n是多少都执行三个具体步骤 执行了12步 O(12)=>O(1) O(n) log 2 N = log c N / log c N (相当于两个对数进行了 ...
- 纯数据结构Java实现(1/11)(动态数组)
我怕说这部分内容太简单后,突然蹦出来一个大佬把我虐到哭,还是悠着点,踏实写 大致内容有: 增删改查,泛型支持,扩容支持,复杂度分析.(铺垫: Java语言中的数组) 基础铺垫 其实没啥好介绍的,顺序存 ...
- C/C++顺序数据结构——动态数组测试
这是一篇顺序表数据结构——动态数组的测试, 实现 //初始化数组 //插入 //根据位置删除 //根据值删除 //查找 //打印 //释放动态数组的内存 //清空数组 //获得动态数组容量 //获得动 ...
- 一篇文章让你了解动态数组的数据结构的实现过程(Java 实现)
目录 数组基础简单回顾 二次封装数组类设计 基本设计 向数组中添加元素 在数组中查询元素和修改元素 数组中的包含.搜索和删除元素 使用泛型使该类更加通用(能够存放 "任意" 数据类 ...
随机推荐
- python读取文件embedded null character是什么原因
地址的\需要转义符: 将\写成\\ 或者在整个字符串前面添加字母r
- 设置ADB网络连接目标板
adb connect 网络连接目标板报错,原因参考[http://ytydyd.blog.sohu.com/146260552.html].而且指定 adb connect <IP>:5 ...
- ipcs命令以及oracle内存段
今天是2014-01-06,在没过春节之前重新复习一下2013年学习的内容,关于oracle内存段在我之前写的blog中有详细操作.在此记录一下ipcs命令的用法. http://blog.csdn. ...
- UVA 10120 - Gift?!(搜索+规律)
Problem D. Gift?! The Problem There is a beautiful river in a small village. N rocks are arranged ...
- 使用 github Pages 服务建立个人独立博客全过程
你是否有这样子的需求,只是想简单的写写文章,记录下自己的学习心得.成长经历等,都是些文字内容,不需要配置使用数据库.不想购买服务器自己搭建站点,只是想安安静静的用比较舒服的方式来写篇文章. 静态博客就 ...
- LeetCode——Nim Game
Description: You are playing the following Nim Game with your friend: There is a heap of stones on t ...
- smarty assign变量赋值
1.变量赋值的两种写法 <%assign var="name" value="cl"%> <%assign "name" ...
- ndk编译android的lame库
1.lame c库: https://github.com/intervigilium/liblame 下载后解压,进入目录,terminal里运行ndk-build即可 2.lame android ...
- 关于virgo-tomcat-server-3.6.0.RELEASE配置文件修改说明
Virgo项目Web服务器是EclipseRT项目的一部分,是一个完全模块化的Java运行时. Virgo自身就是设计为在标准OSGi框架实现(Equinox)之上的一个OSGi bundle集合. ...
- 【JAVA】猜数字
import java.util.*; public class GN { public static void main(String arg[]) { ;// 数字标记 ;// 位置标记 ;// ...