• 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
  • 相关阅读:
    做一个项目什么最重要(代码部分最多占40%)
    二叉树遍历:已知前序和中序,求后序
    [每日一题] OCP1z0-047 :2013-08-24 FLASHBACK—TABLE/PRIMARY KEY(FOREIGN KEY?)......98
    商业价值:苹果iTV,再一次改变世界?
    Nginx负载均衡简易方法
    Qt之设置窗口背景
    python mongodb ubuntu
    生物-生理-衰老:百科
    C#基础:线程之异步回调(委托)
    C#:同步调用、异步调用、异步回调
  • 原文地址:https://www.cnblogs.com/kumata/p/9098137.html
Copyright © 2020-2023  润新知