📜  数据结构和算法 | 2套(1)

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

数据结构和算法介绍

本文将介绍2套数据结构和算法,分别为 基本数据结构和算法进阶数据结构和算法

基本数据结构和算法

基本数据结构和算法包括以下内容:

1. 数组

数组是一种数据结构,用于存储具有相同类型的元素。数组按顺序存储,可以通过索引访问,以O(1)的时间复杂度进行插入、删除、查找等操作。

# 定义一个整型数组并对其赋值
a = [1, 2, 3, 4, 5]

# 访问数组元素
print(a[0])  # 输出 1

# 插入元素
a.insert(3, 6)
print(a)  # 输出 [1, 2, 3, 6, 4, 5]

# 删除元素
a.remove(2)
print(a)  # 输出 [1, 3, 6, 4, 5]

# 查找元素
print(a.index(3))  # 输出 1
2. 栈

栈是一种具有特殊操作顺序的线性数据结构,后进先出(LIFO)。栈可以通过push操作将元素添加到顶部,通过pop操作从顶部删除元素,以O(1)的时间复杂度进行插入、删除等操作。

# 定义一个栈并对其操作
stack = []

# 入栈操作
stack.append(1)
stack.append(2)
stack.append(3)

# 出栈操作
print(stack.pop())  # 输出 3
print(stack.pop())  # 输出 2

# 打印栈顶元素
print(stack[-1])  # 输出 1
3. 队列

队列是一种具有特殊操作顺序的线性数据结构,先进先出(FIFO)。队列可以通过enqueue操作将元素添加到队尾,通过dequeue操作从队首删除元素,以O(1)的时间复杂度进行插入、删除等操作。

# 定义一个队列并对其操作
queue = []

# 入队操作
queue.append(1)
queue.append(2)
queue.append(3)

# 出队操作
print(queue.pop(0))  # 输出 1
print(queue.pop(0))  # 输出 2

# 打印队首元素
print(queue[0])  # 输出 3
4. 链表

链表是一种数据结构,将元素组成一个链式结构。链表由节点组成,每个节点存储一个数据元素和一个指向下一个节点的引用。链表可以在任意位置插入或删除元素。

# 定义一个简单的链表结构
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None


# 定义链表的头节点
head = ListNode(1)

# 在链表末尾添加元素
cur = head
while cur.next:
    cur = cur.next
cur.next = ListNode(2)

# 在链表中间插入元素
new_node = ListNode(3)
new_node.next = cur.next
cur.next = new_node

# 删除链表中的元素
cur.next = cur.next.next
5. 排序算法

排序算法主要有冒泡排序、选择排序、插入排序、快速排序、归并排序。这些算法的时间复杂度从O(n^2)到O(nlogn)不等,而空间复杂度则从O(1)到O(nlogn)不等。

# 快速排序算法
def quick_sort(array):
    if len(array) < 2:
        return array
    else:
        pivot = array[0]
        less = [i for i in array[1:] if i <= pivot]
        greater = [i for i in array[1:] if i > pivot]
        return quick_sort(less) + [pivot] + quick_sort(greater)
进阶数据结构和算法

进阶数据结构和算法包括以下内容:

1. 哈希表

哈希表是一种根据哈希函数快速查找的数据结构。哈希函数将键映射到指定位置,可以以O(1)的时间复杂度进行查找、插入、删除等操作。

# 创建一个哈希表
hash_table = {}

# 插入键值对
hash_table['key1'] = 'value1'
hash_table['key2'] = 'value2'
hash_table['key3'] = 'value3'

# 查找值
print(hash_table.get('key1'))  # 输出 value1

# 删除键值对
del hash_table['key2']
2. 堆

堆是一种具有特殊结构的树形数据结构,常用于实现优先队列。堆有两个特点:堆中的任意节点的值总是不大于(或不小于)其子节点的值;堆总是一棵完全二叉树。堆可以以O(logn)的时间复杂度进行插入、删除等操作。

# 创建一个最小堆
import heapq

heap = []
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 4)
heapq.heappush(heap, 2)

# 弹出堆顶元素
print(heapq.heappop(heap))  # 输出 1
print(heapq.heappop(heap))  # 输出 2

# 获取堆顶元素
print(heap[0])  # 输出 3
3. 字典树

字典树(Trie)是一种树形结构,用于存储字符串集合。Trie树可以在O(m)的时间复杂度进行字符串的查找、插入、删除等操作,其中m为字符串的长度。

# 定义一个TrieNode节点
class TrieNode:
    def __init__(self):
        self.children = {}
        self.is_end = False


# 定义一个Trie树
class Trie:
    def __init__(self):
        self.root = TrieNode()

    def insert(self, word):
        node = self.root
        for ch in word:
            if ch not in node.children:
                node.children[ch] = TrieNode()
            node = node.children[ch]
        node.is_end = True

    def search(self, word):
        node = self.root
        for ch in word:
            if ch not in node.children:
                return False
            node = node.children[ch]
        return node.is_end

    def startsWith(self, prefix):
        node = self.root
        for ch in prefix:
            if ch not in node.children:
                return False
            node = node.children[ch]
        return True
4. 图

图(Graph)是一种用于描述事物之间关系的抽象概念,通常用于解决复杂问题。图包括节点和边两个元素,具有无向图和有向图之分,可用于构建社交网络,计算机网络等领域。

# 定义一个图
graph = {
    'A': ['B', 'C'],
    'B': ['C', 'D'],
    'C': ['D'],
    'D': ['C'],
    'E': ['F'],
    'F': ['C']
}

# 打印图节点和边
for node in graph:
    print(f"{node} -> {graph[node]}")
5. 搜索算法

搜索算法主要有深度优先搜索(DFS)、广度优先搜索(BFS)、A*搜索等。这些算法通常用于搜索最短路径、推理问题等领域。

# 广度优先搜索算法
def bfs(graph, start, end):
    queue = [[start]]
    visited = set()

    while queue:
        path = queue.pop(0)
        node = path[-1]
        if node == end:
            return path
        elif node not in visited:
            for neighbor in graph[node]:
                new_path = list(path)
                new_path.append(neighbor)
                queue.append(new_path)
            visited.add(node)