📅  最后修改于: 2023-12-03 15:40:01.646000             🧑  作者: Mango
本文将介绍2套数据结构和算法,分别为 基本数据结构和算法 和 进阶数据结构和算法。
基本数据结构和算法包括以下内容:
数组是一种数据结构,用于存储具有相同类型的元素。数组按顺序存储,可以通过索引访问,以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
栈是一种具有特殊操作顺序的线性数据结构,后进先出(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
队列是一种具有特殊操作顺序的线性数据结构,先进先出(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
链表是一种数据结构,将元素组成一个链式结构。链表由节点组成,每个节点存储一个数据元素和一个指向下一个节点的引用。链表可以在任意位置插入或删除元素。
# 定义一个简单的链表结构
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
排序算法主要有冒泡排序、选择排序、插入排序、快速排序、归并排序。这些算法的时间复杂度从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)
进阶数据结构和算法包括以下内容:
哈希表是一种根据哈希函数快速查找的数据结构。哈希函数将键映射到指定位置,可以以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']
堆是一种具有特殊结构的树形数据结构,常用于实现优先队列。堆有两个特点:堆中的任意节点的值总是不大于(或不小于)其子节点的值;堆总是一棵完全二叉树。堆可以以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
字典树(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
图(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]}")
搜索算法主要有深度优先搜索(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)