数据结构

181 阅读3分钟

1.0 数组:在连续的内存空间中储存一组相同类型的元素

链表:空间位置不连续

image.png

image.png

image.png

创建:  list = []

添加:  list.append(a)       O(1)在末尾添加
       list.insert0aO(n)在中间的位置添加
访问:  list[0]              O(1)通过索引直接计算出内存空间,不需要遍历,所以是O(1)

更新:  list[0] = 1          O(1)

删除:  list.remove(a)       O(n)需要遍历出这个元素 a
       list.pop(0)          O(n)重前找到0索引对应的元素,然后还要把后面的元素往前挪动一个单位,相当                             于遍历一遍,所以是O(n)
       list.pop()          O(1)  只用删除最后一个元素,所以不用遍历
遍历:  for i in list:       O(n)
       for i, j in range(0, len(list)):
       for i , j in enumerate(list):

查找:  list.index(a)        O(n)  其中a是元素,返回索引,所以要遍历 

排序:  list.sort()          O(nlog(n))
       list.sort(reverse=True)

长度:  len(list)            O(n)

练习 image.png

class Test_1:
    def test(self, num):
        count = 0
        result = 0
        for i in num:
            if i == 1:
                count += 1
            else:
                result = max(result, count)
                count = 0
        return max(result, count)
test = Test_1
result = test.test(num = [1,1,1,0,0,0,0,1,1])
print(result)

2.0 链表:不连续的空间位置,但是用指针联系起来,数组是连续的内存空间

      单端链表:只能用一个方向的指针
      双端链表:可以两个方向的指针
 链表主要是 读少写多

image.png

image.png

创建链表:list = deque()        其实就是队列
添加元素: list.append(a)        O(1)
         list.insert(0, a)     O(n)

访问元素: list[0]              O(n)
搜索元素: list.index(a)        O(n)  找到元素a的索引,并且返回
更新元素: list[a] = b          O(n)  找到索引,并且赋值
删除元素: list.remove(a)      O(n)
          del list[0]         删除指定索引的元素
链表长度: len(list)          O(1)   每次会有一个变量记录传进链表的元素,最后会返回这个变量的值

3.0 队列: 排队,先到先得,一端进一端出

    单端队列:一口进,一口出,
    双端队列:左右两个口都能进,左右两个口都能出
    搜索,访问只能重头到尾,插入是顺序的,末尾端插入的,删除只能删除第一个元素

image.png

image.png

创建队列: list = deque()
添加:    list.append(a)        O(1)
获取:    list[0]               O(1)    获取即将要出队的元素 
删除:    list.popleft()      O(1)    删除即将要离队的元素, 还会返还给你删除的元素             
判断队列为空:  len(list) == 0     O(1)   
队列长度:   len()   O(1) 
遍历队列:     while len(list) != 0O(n)
                list_2 = list.popleft()
                print(list_2)

4.0 栈: 先进后出,例子水杯,浏览器的后退功能,求导法则

image.png

image.png

   创建:  stack = []
   添加:  stack.append(a)                 O(1)
   查看栈顶,即将出栈的:    stack[-1]       O(1)
   删除栈顶,即将出栈的:    stack.pop()     O(1)     会保存删除的元素,没有遍历,所以是O(1) 
   栈的长度:              len(stack)     O(1)
   栈是否为空:            len(stack)== 0   O(1)
   遍历栈,边删除栈顶元素,边遍历 :   while len(stack)> 0:    O(1)
                                       result = stack.pop()
                                       print(result)
   
   

5.0 哈希表: 散列表,键值对,通过 key 得到 value

哈希碰撞:2个不同的key通过同一个哈希函数得到相同的内存地址

image.png

image.png

创建:  mapping = {}  也可以用数组创建哈希表,通过索引来作为key
添加:  mapping[0] = 'a'     O(1)
删除:  mapping[0] = ''      O(1)
       mapping.pop(0)
       del mapping[0]
修改:  mapping[0] = 'b'     O(1) 
获取:  mapping[0]           O(1)
检查key是否存在:  0 in mapping     O(1)  返回的是TRUE还是FALSE
哈希长度:        len(mappig)      O(1)   返回是否为0
哈希是否有元素:   len(mapping) == 0   O(1)

6.0 集合数据结构:无顺序,不重复,

            元素的顺序不代表插入的顺序。和数组不同
            

image.png

image.png

创建: list = set()
添加: list.add(a)     O(1)  没有索引,无顺序,无重合
查询: a in list:      O(1)  在数T  没在是F
删除: list.remove(a)  O(1)  
长度: len(list)       O(1)  有个变量在计算,所以不用遍历

7.0 树的主句结构: 描述的是父子关系,

image.png image.png image.png image.png

8.0 堆:是一种二叉树的结构,完全二叉树数是堆,

image.png image.png image.png

创建
添加:
获取:
删除:
长度:
堆的遍历: