📜  各种数据结构的常用操作(1)

📅  最后修改于: 2023-12-03 15:37:09.762000             🧑  作者: Mango

各种数据结构的常用操作

在计算机科学中,数据结构是指数据在计算机中存储、组织和管理的方式。不同的数据结构适用于不同的场合和要求,因此熟练运用各种数据结构的常用操作是程序员的一项重要技能。

本文将介绍一些常见数据结构的基本操作及其复杂度。

数组

数组是一种线性数据结构,用于存储一组具有相同类型的数据。数组的特点是随机访问快,插入和删除慢。

声明数组

使用以下语法声明一个名为 arr,长度为 n 的整数数组:

arr = [0] * n
访问数组元素

下标从 0 开始,访问第 i 个元素的时间复杂度为 O(1):

print(arr[i])
遍历数组

遍历数组的时间复杂度为 O(n):

for i in range(n):
    print(arr[i])
插入和删除元素

在数组的末尾插入元素的时间复杂度为 O(1):

arr.append(x)

删除指定位置的元素的时间复杂度为 O(n):

del arr[i]
链表

链表是一种线性数据结构,用于存储一组具有相同类型的数据。链表的特点是插入和删除快,随机访问慢。

声明链表

使用以下语法声明一个名为 head 的单向链表:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
        
head = ListNode()
访问链表元素

访问链表元素的时间复杂度为 O(n):

p = head.next
while p:
    print(p.val)
    p = p.next
遍历链表

遍历链表的时间复杂度为 O(n):

p = head.next
while p:
    # Do something
    p = p.next
插入和删除元素

在链表的头部插入元素的时间复杂度为 O(1):

new_node = ListNode(val)
new_node.next = head.next
head.next = new_node

删除指定节点的时间复杂度为 O(n):

prev, curr = None, head.next
while curr:
    if curr.val == x:
        prev.next = curr.next
        break
    prev, curr = curr, curr.next

栈是一种后进先出(LIFO)的数据结构,用于存储一组具有相同类型的数据。

声明栈

使用以下语法声明一个名为 stack 的栈:

stack = []
入栈和出栈

入栈元素的时间复杂度为 O(1):

stack.append(x)

出栈元素的时间复杂度为 O(1):

x = stack.pop()
查看栈顶元素

查看栈顶元素的时间复杂度为 O(1):

x = stack[-1]
队列

队列是一种先进先出(FIFO)的数据结构,用于存储一组具有相同类型的数据。

声明队列

使用以下语法声明一个名为 queue 的队列:

queue = collections.deque()
入队和出队

入队元素的时间复杂度为 O(1):

queue.append(x)

出队元素的时间复杂度为 O(1):

x = queue.popleft()
查看队首元素

查看队首元素的时间复杂度为 O(1):

x = queue[0]

堆是一种特殊的树形数据结构,用于维护一个集合中最值等特殊要求。

声明堆

使用以下语法声明一个名为 heap 的最小堆:

heap = []
插入元素

插入元素的时间复杂度为 O(log n):

heappush(heap, x)
弹出堆顶元素

弹出堆顶元素的时间复杂度为 O(log n):

x = heappop(heap)
查看堆顶元素

查看堆顶元素的时间复杂度为 O(1):

x = heap[0]