当前位置: 首页 > news >正文

【Python 语法】Python 数据结构

  • 线性结构(Linear Structures)
    • 1. 顺序存储
      • 列表(List)
      • 元组(Tuple)
      • 字符串(String)
    • 2. 线性存储
      • 栈(Stack)
      • 队列(Queue)
      • 双端队列(Deque,Double-Ended Queue)
      • 优先队列(Priority Queue)/ 最小堆
  • 非线性结构(Non-Linear Structures)
    • 1. 哈希表
      • 字典(Dictionary)
      • 集合(Set)
    • 2. 树结构
      • 二叉树(Binary Tree)
      • 平衡二叉树(AVL 树 / 红黑树)
      • Trie(字典树 / 前缀树)
    • 3. 图(Graph)
      • networkx 图论库
      • 并查集(Union-Find)
  • 特殊结构
      • 跳表(Skip List)
      • Bloom Filter(布隆过滤器)
      • LRU 缓存(Least Recently Used Cache)
  • 总结:如何选择数据结构?

Python 的数据结构可以根据 存储方式、访问方式、适用场景 等进行分类。

线性结构(Linear Structures)

1. 顺序存储

数据结构说明适用场景
列表(List)Python 内置 动态数组,支持 索引访问适用于 动态数组、查找、排序
元组(Tuple)不可变 的列表,性能优于 List适用于 只读数据、键值映射
字符串(String)Python 视为 不可变的字符数组适用于 文本处理

列表(List)

  • 可变(Mutable):可以修改、添加或删除元素。
  • 有序(Ordered):元素按插入顺序存储,可通过索引访问。
  • 支持重复元素:允许存储相同的值。
  • 动态大小:可以随时增减元素。
方法说明
append(x)在列表 末尾添加元素 x
extend(iterable)用可迭代对象 iterable 扩展列表
insert(i, x)在索引 i 处插入元素 x
remove(x)删除列表中 第一个值为 x 的元素
pop([i])删除并返回索引 i 处的元素,默认 删除最后一个
clear()清空 列表
index(x, [start, end])返回 元素 x 在列表中的索引,可指定范围
count(x)统计 元素 x 在列表中出现的次数
sort(key=None, reverse=False)对列表进行 排序,可指定 key 和是否降序
reverse()反转 列表
copy()返回列表的 浅拷贝
my_list = [3, 1, 4, 1, 5, 9, 2] # 创建一个列表# 1. append() - 在列表末尾添加元素
my_list.append(6) # [3, 1, 4, 1, 5, 9, 2, 6]# 2. extend() - 用可迭代对象扩展列表
my_list.extend([7, 8, 9]) # [3, 1, 4, 1, 5, 9, 2, 6, 7, 8, 9]# 3. insert() - 在指定索引处插入元素
my_list.insert(2, 42) # [3, 1, 42, 4, 1, 5, 9, 2, 6, 7, 8, 9]# 4. remove() - 删除指定值(删除第一个匹配的值)
my_list.remove(1) # [3, 42, 4, 1, 5, 9, 2, 6, 7, 8, 9]# 5. pop() - 删除并返回指定索引的元素(默认最后一个)
popped_element = my_list.pop() # 9 [3, 42, 4, 1, 5, 9, 2, 6, 7, 8]# 6. index() - 返回元素第一次出现的索引
index_of_5 = my_list.index(5) # 4# 7. count() - 统计元素出现次数
count_of_1 = my_list.count(1) # 1# 8. sort() - 对列表进行排序
my_list.sort() # [1, 2, 3, 4, 5, 6, 7, 8, 9, 42]# 9. reverse() - 反转列表
my_list.reverse() # [42, 9, 8, 7, 6, 5, 4, 3, 2, 1]# 10. copy() - 复制列表
copy_list = my_list.copy() # [42, 9, 8, 7, 6, 5, 4, 3, 2, 1]# 11. clear() - 清空列表
my_list.clear() # []

元组(Tuple)

  • 不可变(Immutable):创建后不能修改元素值。
  • 有序:可以通过索引访问。
  • 支持重复元素
  • 占用更少内存,比列表更快。
方法说明
count(x)统计 元素 x 在元组中出现的次数
index(x, [start, end])返回 元素 x 在元组中第一次出现的索引,可指定范围
my_tuple = (3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5) # 创建一个元组# 1. count() - 统计元素出现次数
count_of_5 = my_tuple.count(5)  # 3# 2. index() - 返回元素第一次出现的索引
index_of_9 = my_tuple.index(9)  # 5# 3. index()(指定范围) - 在索引 3 到 8 之间查找元素 5
index_of_5_in_range = my_tuple.index(5, 3, 9)  # 6

相比于 List,元组的不可变性使其缺少修改数据的方法,例如 append()remove()insert() 等操作。如果 需要修改数据,可以转换成 List,修改后再转换回 Tuple

  • 虽然 元组的方法只有 count()index()
  • 但仍可以使用 +*、切片、内置函数 等方式进行操作。
  1. + 连接(拼接)
tuple1 = (1, 2, 3)
tuple2 = (4, 5, 6)
new_tuple = tuple1 + tuple2  # (1, 2, 3, 4, 5, 6)
  1. * 复制
tuple1 = (1, 2, 3)
tuple2 = tuple1 * 2  # (1, 2, 3, 1, 2, 3)

字符串(String)

  • 不可变(Immutable):一旦创建,字符串的内容不可修改。
  • 有序(Ordered):字符串中的字符按顺序排列,可以通过索引访问。
  • 支持重复字符:允许出现相同的字符。
  • 固定大小:字符串的长度一旦确定,就不能再修改。
方法说明
upper()将字符串中的 所有字母 转换为 大写
lower()将字符串中的 所有字母 转换为 小写
capitalize()将字符串的 第一个字符 转换为 大写,其余字符转换为 小写
title()将字符串中的 每个单词的首字母 转换为 大写
strip()移除字符串 两端的空白字符(包括空格、换行符等)
replace(old, new)将字符串中的 old 字符替换为 new 字符
split(separator)使用 指定的分隔符 将字符串分割成一个 列表,默认为按空白字符分割
join(iterable)可迭代对象(如列表)中的元素连接成一个字符串
find(sub)返回子字符串 sub 在字符串中 首次出现的位置,若未找到返回 -1
count(sub)返回子字符串 sub 在字符串中出现的 次数
index(sub)返回子字符串 sub 在字符串中 首次出现的位置,若未找到则抛出异常
startswith(prefix)判断字符串是否以指定的 prefix 开头
endswith(suffix)判断字符串是否以指定的 suffix 结尾
isalpha()判断字符串是否只包含 字母
isdigit()判断字符串是否只包含 数字
isalnum()判断字符串是否只包含 字母和数字
my_string = " Hello, Python!  "  # 创建一个字符串# 1. upper() - 将所有字母转换为大写
upper_str = my_string.upper()  # " HELLO, PYTHON!  "# 2. lower() - 将所有字母转换为小写
lower_str = my_string.lower()  # " hello, python!  "# 3. capitalize() - 将第一个字符转换为大写,剩余字符为小写
capitalized_str = my_string.capitalize()  # " hello, python!  "# 4. title() - 将每个单词的首字母转换为大写
title_str = my_string.title()  # " Hello, Python!  "# 5. strip() - 移除两端的空白字符
stripped_str = my_string.strip()  # "Hello, Python!"# 6. replace() - 替换字符串中的子字符串
replaced_str = my_string.replace("Python", "World")  # " Hello, World!  "# 7. split() - 按空白字符拆分字符串
split_list = my_string.split()  # ['Hello,', 'Python!']# 8. join() - 将列表元素连接为字符串
joined_str = "-".join(split_list)  # "Hello,-Python!"# 9. find() - 查找子字符串的位置
index_of_python = my_string.find("Python")  # 8# 10. count() - 统计子字符串出现的次数
count_python = my_string.count("Python")  # 1# 11. index() - 查找子字符串的位置,未找到则抛出异常
index_of_world = my_string.index("World")  # 会抛出 ValueError: substring not found# 12. startswith() - 判断字符串是否以 "Hello" 开头
starts_with_hello = my_string.startswith("Hello")  # True# 13. endswith() - 判断字符串是否以 "!" 结尾
ends_with_exclamation = my_string.endswith("!")  # False# 14. isalpha() - 判断字符串是否只包含字母
is_alpha = "abc".isalpha()  # True
is_alpha_num = "abc123".isalpha()  # False# 15. isdigit() - 判断字符串是否只包含数字
is_digit = "12345".isdigit()  # True# 16. isalnum() - 判断字符串是否只包含字母和数字
is_alnum = "abc123".isalnum()  # True

2. 线性存储

数据结构说明适用场景
栈(Stack)后进先出(LIFO),用 list.append() & list.pop() 实现撤销操作、括号匹配、深度优先搜索(DFS)
队列(Queue)先进先出(FIFO),用 collections.deque 实现任务调度、消息队列
双端队列(Deque)两端可进可出,用 collections.deque 实现滑动窗口、缓存管理
优先队列(Priority Queue)元素按优先级排列,用 heapq 实现调度系统、最短路径算法(Dijkstra)

栈(Stack)

  • 后进先出(LIFO, Last In First Out)
  • 只能在一端进行插入和删除(称为栈顶
  • 操作类似于“堆叠的盘子”,后放的盘子要先取出
方法说明
stack.append(x)入栈(Push):将元素 x 压入栈顶
stack.pop()出栈(Pop):移除并返回栈顶元素
stack[-1]查看栈顶元素(Peek)
len(stack)查看栈的大小
not stack判断栈是否为空
stack = []  # 创建一个空栈# 1. 入栈
stack.append(1)
stack.append(2)
stack.append(3)
print("Stack after push:", stack)  # [1, 2, 3]# 2. 查看栈顶元素(不删除)
top = stack[-1]
print("Top element:", top)  # 3# 3. 出栈
popped = stack.pop()
print("Popped element:", popped)  # 3
print("Stack after pop:", stack)  # [1, 2]# 4. 判断是否为空
print("Is stack empty?", not stack)  # False# 5. 栈的大小
print("Stack size:", len(stack))  # 2

高效栈用 deque 实现

from collections import dequestack = deque()stack.append(1)  # 入栈
stack.append(2)
stack.append(3)
print(stack.pop())  # 出栈,返回 3
print(stack)  # deque([1, 2])

队列(Queue)

  • 先进先出(FIFO, First In First Out)
  • 从队尾入队,从队首出队
  • 操作类似于“排队买票”,先来的人先买票离开
方法说明
queue.append(x)入队(Enqueue):将元素 x 插入队尾
queue.pop(0)出队(Dequeue):移除并返回队首元素
queue[0]查看队首元素(Peek)
len(queue)查看队列大小
not queue判断队列是否为空
queue = []  # 创建一个空队列# 1. 入队
queue.append("A")
queue.append("B")
queue.append("C")
print("Queue after enqueue:", queue)  # ['A', 'B', 'C']# 2. 查看队首元素(不删除)
front = queue[0]
print("Front element:", front)  # 'A'# 3. 出队
dequeued = queue.pop(0)
print("Dequeued element:", dequeued)  # 'A'
print("Queue after dequeue:", queue)  # ['B', 'C']# 4. 判断是否为空
print("Is queue empty?", not queue)  # False# 5. 队列大小
print("Queue size:", len(queue))  # 2

高效队列用 deque 实现

queue = deque()queue.append("A")  # 入队
queue.append("B")
queue.append("C")
print(queue.popleft())  # 出队,返回 'A'
print(queue)  # deque(['B', 'C'])

双端队列(Deque,Double-Ended Queue)

  • 两端插入和删除都是 O ( 1 ) O(1) O(1) 的时间复杂度(比 list.pop(0) 快)
  • 适用于队列和栈的双重需求
方法说明
deque.append(x)右端入队(等同于 list.append(x)
deque.appendleft(x)左端入队
deque.pop()右端出队
deque.popleft()左端出队
deque.extend(iterable)批量右端入队
deque.extendleft(iterable)批量左端入队(注意:会逆序插入)
deque.rotate(n)循环右移 nn 为负数则左移)
deque.reverse()原地反转队列
deque.clear()清空队列
from collections import deque# 创建一个双端队列
dq = deque([1, 2, 3])# 1. 右端入队
dq.append(4) # deque([1, 2, 3, 4])# 2. 左端入队
dq.appendleft(0) # deque([0, 1, 2, 3, 4])# 3. 右端出队
dq.pop() # deque([0, 1, 2, 3])# 4. 左端出队
dq.popleft() # deque([1, 2, 3])# 5. 扩展队列(右侧)
dq.extend([4, 5]) # deque([1, 2, 3, 4, 5]) # 6. 扩展队列(左侧,逆序插入)
dq.extendleft([-1, -2]) # deque([-2, -1, 1, 2, 3, 4, 5])# 7. 旋转(循环右移2位)
dq.rotate(2) # deque([4, 5, -2, -1, 1, 2, 3])# 8. 旋转(循环左移1位)
dq.rotate(-1) # deque([5, -2, -1, 1, 2, 3, 4])# 9. 反转队列
dq.reverse() # deque([4, 3, 2, 1, -1, -2, 5])# 10. 清空队列
dq.clear() # deque([])

优先队列(Priority Queue)/ 最小堆

优先队列是一种 按照优先级顺序存储元素 的数据结构,Python 提供 heapq 模块来实现 最小堆(Min-Heap),默认情况下 最小值优先出队

  • 元素按照优先级排序,默认最小值优先
  • 插入和删除的时间复杂度为 O ( l o g n ) O(log\ n) O(log n)
  • 适用于任务调度、路径搜索(Dijkstra 算法)等
方法说明
heapq.heappush(heap, x)入队x 加入 heap 并保持最小堆)
heapq.heappop(heap)出队(移除并返回最小元素)
heapq.heappushpop(heap, x)先入队,再出队最小值(比 push+pop 快)
heapq.heapify(iterable)将列表转换为最小堆
heapq.nlargest(n, heap)获取前 n 个最大元素(不会改变堆)
heapq.nsmallest(n, heap)获取前 n 个最小元素(不会改变堆)
import heapq# 创建一个空的优先队列(最小堆)
pq = []# 1. 入队
heapq.heappush(pq, 3)
heapq.heappush(pq, 1)
heapq.heappush(pq, 4)
heapq.heappush(pq, 2)
print("After heappush:", pq)  # [1, 2, 4, 3] (最小值在前)# 2. 出队(返回最小值)
min_item = heapq.heappop(pq)
print("heappop():", min_item)  # 1
print("After heappop:", pq)  # [2, 3, 4]# 3. 批量建堆
nums = [9, 5, 7, 2, 6]
heapq.heapify(nums)  # 直接转换成最小堆
print("heapify():", nums)  # [2, 5, 7, 9, 6] (2 最小)# 4. 先入队再出队最小值(比 heappush+heappop 效率高)
result = heapq.heappushpop(pq, 0)
print("heappushpop(0):", result)  # 0
print("After heappushpop:", pq)  # [2, 3, 4]# 5. 获取前 n 个最大/最小元素
largest = heapq.nlargest(2, pq)
smallest = heapq.nsmallest(2, pq)
print("nlargest(2):", largest)  # [4, 3]
print("nsmallest(2):", smallest)  # [2, 3]

非线性结构(Non-Linear Structures)

  • 数据 非顺序存储
  • 适用于 查找、关联映射、层级关系

1. 哈希表

数据结构说明适用场景
字典(Dict)键值对存储,O(1) 查询索引、缓存、数据存储
集合(Set)无序、不重复,O(1) 查询去重、集合运算

哈希表(Hash Table)/ 哈希映射(Hash Map)特点

  • 通过 键值对(key-value) 存储数据
  • 平均 O(1) 的查找、插入和删除
  • Python 的 dict 本质上是一个 哈希表
hash_map = {}  # 或 hash_map = dict()
hash_map["name"] = "Alice"
hash_map["age"] = 25
print(hash_map["name"])  # Alice
print(hash_map.get("age", "Not Found"))  # 25

字典(Dictionary)

  • 键值对存储(Key-Value):类似 JavaScript 的对象。
  • 无序(Python 3.6 之前),有序(Python 3.7+):Python 3.7+ 中,字典保持插入顺序。
  • 键唯一:不能有重复的键。
方法说明
dict.keys()返回 所有键dict_keys 视图
dict.values()返回 所有值dict_values 视图
dict.items()返回 键值对dict_items 视图
dict.get(key, default)返回 key 对应的值,若 key 不存在返回 default
dict.pop(key, default)删除 key 并返回对应的值,若 key 不存在返回 default
dict.popitem()随机删除并返回(Python 3.7+ 为删除最后插入的键值对
dict.update(other_dict)合并字典,若 key 已存在,则覆盖其值
dict.setdefault(key, default)获取 key 对应的值,若 key 不存在,则添加 default
dict.clear()清空 字典
dict.copy()返回字典的 浅拷贝

完整示例

my_dict = {"name": "Alice", "age": 25, "city": "New York"} # 创建一个字典# 1. keys() - 获取所有键
print("keys():", my_dict.keys())  # dict_keys(['name', 'age', 'city'])# 2. values() - 获取所有值
print("values():", my_dict.values())  # dict_values(['Alice', 25, 'New York'])# 3. items() - 获取所有键值对
print("items():", my_dict.items())  
# dict_items([('name', 'Alice'), ('age', 25), ('city', 'New York')])# 4. get() - 获取键的值(若不存在返回默认值)
print("get('age'):", my_dict.get("age"))  # 25
print("get('gender', 'Not Found'):", my_dict.get("gender", "Not Found"))  # 'Not Found'# 5. pop() - 删除指定键并返回其值
age = my_dict.pop("age")
print("pop('age'):", age, my_dict)  # 25 {'name': 'Alice', 'city': 'New York'}# 6. popitem() - 删除并返回最后插入的键值对(Python 3.7+)
last_item = my_dict.popitem() 
print("popitem():", last_item, my_dict)  # ('city', 'New York') {'name': 'Alice'}# 7. update() - 合并另一个字典
my_dict.update({"gender": "Female", "age": 26}) # {'name': 'Alice', 'gender': 'Female', 'age': 26}# 8. setdefault() - 获取 key 的值,若 key 不存在,则赋默认值
print("setdefault('city', 'Los Angeles'):", my_dict.setdefault("city", "Los Angeles")) # Los Angeles
print("After setdefault:", my_dict) # {'name': 'Alice', 'gender': 'Female', 'age': 26, 'city': 'Los Angeles'}# 9. copy() - 复制字典
copy_dict = my_dict.copy()  # {'name': 'Alice', 'gender': 'Female', 'age': 26, 'city': 'Los Angeles'}# 10. clear() - 清空字典
my_dict.clear() # {}

集合(Set)

  • 无序(Unordered):元素没有固定的顺序。
  • 不允许重复元素(Unique)。
  • 支持集合运算(交集、并集、差集等)。
方法说明
set.add(x)添加元素 x 到集合
set.remove(x)删除元素 x,如果 x 不存在,则抛出 KeyError
set.discard(x)删除元素 x,如果 x 不存在,不报错
set.pop()随机删除 并返回一个元素(由于无序性,不确定删除哪个)
set.clear()清空集合
set.copy()复制集合
set.update(iterable)用可迭代对象 扩展集合
set.union(other_set)并集(返回新集合)
set.intersection(other_set)交集(返回新集合)
set.difference(other_set)差集(返回新集合)
set.symmetric_difference(other_set)对称差集(返回新集合)
set.issubset(other_set)判断是否为 子集(返回 True/False
set.issuperset(other_set)判断是否为 超集(返回 True/False
set.isdisjoint(other_set)判断两个集合是否 无交集(返回 True/False

完整示例

# 创建集合
my_set = {1, 2, 3, 4, 5}
another_set = {3, 4, 5, 6, 7}print(my_set & another_set)  # 交集 {3, 4, 5}
print(my_set | another_set)  # 并集 {1, 2, 3, 4, 5, 6, 7}# 1. add() - 添加元素
my_set.add(6) # {1, 2, 3, 4, 5, 6}# 2. remove() - 删除元素(不存在会报错)
my_set.remove(6) # {1, 2, 3, 4, 5}# 3. discard() - 删除元素(不存在不会报错)
my_set.discard(10)  # 无影响 {1, 2, 3, 4, 5}# 4. pop() - 随机删除一个元素
popped_item = my_set.pop() # 可能删除 1, 2, 3, 4, 5 中的任意一个
print("pop():", popped_item, my_set) # 1 {2, 3, 4, 5}  (结果可能不同)# 5. clear() - 清空集合
my_set.clear() # set()# 6. copy() - 复制集合
copy_set = another_set.copy() # {3, 4, 5, 6, 7}# 7. update() - 用另一个集合扩展
my_set.update([1, 2, 3]) # {1, 2, 3}# 8. union() - 并集
union_set = my_set.union(another_set) # {1, 2, 3, 4, 5, 6, 7}# 9. intersection() - 交集
intersection_set = my_set.intersection(another_set) # {3}# 10. difference() - 差集(存在于 my_set 但不存在于 another_set)
difference_set = my_set.difference(another_set) # {1, 2}# 11. symmetric_difference() - 对称差集(只在其中一个集合中存在)
symmetric_diff_set = my_set.symmetric_difference(another_set) # {1, 2, 4, 5, 6, 7}# 12. issubset() - 判断是否为子集
print("issubset(another_set):", {3}.issubset(my_set))  # True# 13. issuperset() - 判断是否为超集
print("issuperset({3}):", my_set.issuperset({3}))  # True# 14. isdisjoint() - 判断是否无交集
print("isdisjoint({10, 11}):", my_set.isdisjoint({10, 11}))  # True

2. 树结构

数据结构说明适用场景
二叉树(Binary Tree)每个节点最多两个子节点表达式解析、层次遍历
二叉搜索树(BST)有序存储,O(log n) 查询排序、搜索
AVL 树 / 红黑树自平衡二叉搜索树,O(log n) 操作数据库索引、C++ map/set
Trie(字典树)字符串前缀存储,O(m) 查询搜索引擎、拼写检查

二叉树(Binary Tree)

二叉树 (Binary Tree),是一种 每个节点最多有两个子节点 的数据结构。二叉树并 没有对节点值的排列做任何特殊限制

二叉查找树 是二叉树的一种特例,它要求节点的值必须满足如下条件:

  • 对于任何节点 nodenode 的左子树中的所有节点值都比 node 的值小
  • 对于任何节点 nodenode 的右子树中的所有节点值都比 node 的值大

这种排列使得查找、插入和删除操作能以 O ( l o g n ) O(log\ n) O(log n) 的时间复杂度进行(在树平衡的情况下)。

平衡二叉树(AVL 树 / 红黑树)

  • 自平衡 的二叉搜索树,确保 O(log n) 查找、插入、删除
  • Python sortedcontainers 库可以用于 平衡树结构
  • Python 的 dictset 底层使用哈希表,但 C++ 的 map/set红黑树

sortedcontainers 是一个第三方库,提供了高效的排序容器,支持自动平衡。这个库实现了 平衡二叉树(如 AVL 树 / 红黑树) 的功能,允许 O(log n) 的插入、删除和查找操作。

方法说明
SortedList类似于列表,但元素始终保持排序。
add(value)SortedList 中添加一个元素,并保持排序。
remove(value)SortedList 中移除一个元素。
bisect_left(value)查找元素插入的位置,返回第一个大于等于 value 的索引位置。
bisect_right(value)查找元素插入的位置,返回第一个严格大于 value 的索引位置。
index(value)返回 value 元素的索引位置,如果不存在则抛出异常。
__getitem__(index)获取指定索引处的元素。
__delitem__(index)删除指定索引处的元素。
__contains__(value)判断元素是否在 SortedList 中。
pop(index)弹出指定索引处的元素,删除并返回该元素。
__iter__()迭代遍历 SortedList 中的元素。
__len__()返回 SortedList 中的元素个数。
from sortedcontainers import SortedList# 创建一个 SortedList 对象
sorted_list = SortedList()# 1. 向 SortedList 中添加元素
sorted_list.add(10)
sorted_list.add(5)
sorted_list.add(20)
sorted_list.add(15)print("SortedList after adding elements:")
print(sorted_list)  # SortedList([5, 10, 15, 20])# 2. 从 SortedList 中删除元素
sorted_list.remove(10)
print("SortedList after removing 10:")
print(sorted_list)  # SortedList([5, 15, 20])# 3. 查找元素的索引位置
print("Index of 15:", sorted_list.index(15))  # 1# 4. 查找元素的插入位置 (返回插入位置)
print("Bisect left for 12:", sorted_list.bisect_left(12))  # 1
print("Bisect right for 12:", sorted_list.bisect_right(12))  # 2# 5. 判断元素是否存在
print("Does SortedList contain 15?", 15 in sorted_list)  # True
print("Does SortedList contain 10?", 10 in sorted_list)  # False# 6. 获取指定索引的元素
print("Element at index 1:", sorted_list[1])  # 15# 7. 弹出指定索引处的元素
popped_element = sorted_list.pop(1)
print("Popped element:", popped_element)  # 15
print("SortedList after pop:")
print(sorted_list)  # SortedList([5, 20])# 8. 迭代遍历 SortedList
print("Iterating over SortedList:")
for item in sorted_list:print(item, end=" ")  # 5 20# 9. 获取元素的个数
print("\nNumber of elements in SortedList:", len(sorted_list))  # 2

Trie(字典树 / 前缀树)

  • 用于 高效的字符串查找(如自动补全、字典存储)
  • 查找时间复杂度为 O(m)(m 是字符串长度)
  • 适用于 搜索引擎、字典匹配、DNA 序列匹配
class TrieNode:def __init__(self):self.children = {}self.is_end = Falseclass Trie:def __init__(self):self.root = TrieNode()def insert(self, word):node = self.rootfor char in word:if char not in node.children:node.children[char] = TrieNode()node = node.children[char]node.is_end = Truedef search(self, word):node = self.rootfor char in word:if char not in node.children:return Falsenode = node.children[char]return node.is_endtrie = Trie()
trie.insert("hello")
print(trie.search("hello"))  # True
print(trie.search("hell"))   # False

3. 图(Graph)

  • 顶点(Nodes)边(Edges) 组成
  • 可以是 有向图 / 无向图,支持 加权 / 无权
  • 广泛用于社交网络、地图导航、网络路由等
数据结构说明适用场景
邻接表(Adjacency List)dict 存储邻接关系社交网络、地图路径
邻接矩阵(Adjacency Matrix)list[list] 存储连接关系稠密图、动态规划
并查集(Union-Find)快速合并 & 查找集合连通性检测、最小生成树(MST)

networkx 图论库

方法说明
Graph()创建一个空的无向图
add_node(node)向图中 添加一个节点
add_nodes_from(nodes)向图中 添加多个节点
add_edge(u, v, weight=w)向图中 添加一条边,(从节点 u 到节点 v),权重为 w (可选)
add_edges_from(ebunch, weight=w)向图中 添加多条边,所有边的权重为 w(可选)
remove_node(node)删除一个节点(删除节点及其相关边)
remove_edge(u, v)删除一条边
has_node(node)判断图中是否包含节点 node
has_edge(u, v)判断图中是否包含从 uv 的边
nodes()返回图中 所有节点
edges(data=True)返回图中 所有边data=True 包括权重(可选)
get_edge_data(u, v)获取从 uv边的属性,包括权重
set_edge_attributes(G, values, name='weight')设置图 G 中所有边的 权重(或其他属性)
degree(node)返回节点 node度数(连接到该节点的边的数目)
neighbors(n)返回节点 n所有邻居节点
adjacency()返回图的 邻接列表
shortest_path(source, target, weight='weight')返回从 sourcetarget最短路径(权重可选)
shortest_path_length(source, target, weight='weight')返回从 sourcetarget最短路径长度(权重可选)
diameter()返回图的 直径(最长最短路径的长度)
center()返回图的 中心节点(距离最远节点最短的节点)
closeness_centrality(node)返回节点 node接近中心性
betweenness_centrality(node)返回节点 node介数中心性
pagerank()返回图的 PageRank
is_connected()判断图是否 连通
draw()绘制图的 可视化(需要 Matplotlib)
draw_networkx_edge_labels()在绘图时 显示边的权重
subgraph(nodes)返回一个包含指定节点的 子图
set_edge_attributes(G, values, name='weight')设置边的属性(例如权重)
import networkx as nx
import matplotlib.pyplot as plt# 创建一个无向图
G = nx.Graph()# 1. 添加带权重的单条边
G.add_edge(1, 2, weight=4.2)# 2. 添加带权重的多条边
G.add_edges_from([(2, 3, {'weight': 2.5}), (3, 4, {'weight': 7.1})])# 3. 打印所有边及其属性(包括权重)
print("Edges with weights:", G.edges(data=True))  
# 输出: Edges with weights: [(1, 2, {'weight': 4.2}), (2, 3, {'weight': 2.5}), (3, 4, {'weight': 7.1})]# 4. 获取指定边的权重
edge_weight = G[1][2]['weight']
print("Weight of edge (1, 2):", edge_weight)  # 输出: Weight of edge (1, 2): 4.2# 5. 修改某条边的权重
G[1][2]['weight'] = 9.0
print("Updated weight of edge (1, 2):", G[1][2]['weight'])  # 输出: Updated weight of edge (1, 2): 9.0# 6. 获取某条边的所有属性
edge_data = G.get_edge_data(1, 2)
print("Edge data for (1, 2):", edge_data)  # 输出: Edge data for (1, 2): {'weight': 9.0}# 7. 获取所有带属性的边(包括权重)
print("All edges with data:", list(G.edges(data=True))) 
# 输出: All edges with data: [(1, 2, {'weight': 9.0}), (2, 3, {'weight': 2.5}), (3, 4, {'weight': 7.1})]# 8. 获取图的最短路径(带权重)
shortest_path = nx.shortest_path(G, source=1, target=4, weight='weight')
print("Shortest path from 1 to 4:", shortest_path)  # 输出: Shortest path from 1 to 4: [1, 2, 3, 4]# 9. 获取图的最短路径长度(带权重)
shortest_path_length = nx.shortest_path_length(G, source=1, target=4, weight='weight')
print("Shortest path length from 1 to 4:", shortest_path_length)  # 输出: Shortest path length from 1 to 4: 18.8# 10. 绘制带权重的图
pos = nx.spring_layout(G)
labels = nx.get_edge_attributes(G, 'weight')  # 获取边的权重
nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=2000, font_size=15)
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels)
plt.show()# 11. 获取图的直径
# 直径是图中最长的最短路径的长度
print("Diameter of the graph:", nx.diameter(G))  # 输出: Diameter of the graph: 2# 12. 获取图的中心节点
print("Center of the graph:", nx.center(G))  # 输出: Center of the graph: [2, 3]# 13. 获取节点的接近中心性
print("Closeness centrality of node 2:", nx.closeness_centrality(G, 2))  # 输出接近中心性# 14. 获取节点的介数中心性
print("Betweenness centrality of node 2:", nx.betweenness_centrality(G)[2])  # 输出节点 2 的介数中心性# 15. 获取 PageRank 值
print("PageRank values:", nx.pagerank(G))  # 输出节点的 PageRank 值# 16. 获取子图
subgraph = G.subgraph([1, 2, 3])
print("Subgraph nodes:", subgraph.nodes())  # 输出: Subgraph nodes: [1, 2, 3]

并查集(Union-Find)

  • 高效合并(Union)和查找(Find),用于动态连通性问题
  • 主要用于 图的连通性检测、最小生成树(Kruskal)、网络连接等
  • 路径压缩 + 按秩合并 可以优化到 O(α(n)) ≈ O(1)
class UnionFind:def __init__(self, n):self.parent = list(range(n))def find(self, x):if self.parent[x] != x:self.parent[x] = self.find(self.parent[x])  # 路径压缩return self.parent[x]def union(self, x, y):rootX = self.find(x)rootY = self.find(y)if rootX != rootY:self.parent[rootX] = rootY  # 合并集合uf = UnionFind(5)
uf.union(0, 1)
uf.union(1, 2)
print(uf.find(0) == uf.find(2))  # True(0 和 2 连接在一起)

特殊结构

数据结构说明适用场景
跳表(Skip List)O(log n) 查询,链表+多级索引有序集合(Redis)、区间查询
布隆过滤器(Bloom Filter)概率型结构,快速检测元素是否存在黑名单过滤、去重
LRU 缓存(Least Recently Used Cache)自动移除最久未使用的数据网页缓存、CPU缓存

跳表(Skip List)

  • 通过 多层链表结构 提供 O(log n) 搜索,类似于平衡二叉树
  • 建立 多层次的索引,允许在 每一层上进行跳跃式的查找
  • 用于 高效的区间查询、排序数据结构
  • Redis 的 有序集合(SortedSet) 采用 跳表实现
方法说明
insert(value)插入值为 value 的新节点。
search(value)查找值为 value 的节点,若存在返回节点,否则返回 None
delete(value)删除值为 value 的节点。
random_level()生成一个随机层级,用于决定新节点的高度。
print_list()打印跳表的层次结构。
import randomclass Node:  # 节点类 (Node):每个节点有多个指针(表示跳跃层级)def __init__(self, value, level):self.value = value  # 节点值self.forward = [None] * (level + 1)  # forward[i]是指向第i层的下一个节点class SkipList:  # 跳表类 (SkipList):包含插入、查找和删除等操作def __init__(self, max_level=16, p=0.5):self.max_level = max_level  # 最大层数self.p = p  # 节点升层概率self.header = Node(None, self.max_level)  # 跳表头节点self.level = 0  # 当前跳表的层数def random_level(self):level = 0while random.random() < self.p and level < self.max_level:level += 1return leveldef insert(self, value):update = [None] * (self.max_level + 1)  # 记录查找路径current = self.header# 从跳表的最高层开始查找for i in range(self.level, -1, -1):while current.forward[i] and current.forward[i].value < value:current = current.forward[i]update[i] = currentcurrent = current.forward[0]# 如果找到了相同的值,则不插入if current and current.value == value:return# 否则插入新节点new_level = self.random_level()if new_level > self.level:for i in range(self.level + 1, new_level + 1):update[i] = self.headerself.level = new_levelnew_node = Node(value, new_level)# 在各个层级插入新节点for i in range(new_level + 1):new_node.forward[i] = update[i].forward[i]update[i].forward[i] = new_nodedef search(self, value):current = self.header# 从最高层开始查找for i in range(self.level, -1, -1):while current.forward[i] and current.forward[i].value < value:current = current.forward[i]current = current.forward[0]return current if current and current.value == value else Nonedef delete(self, value):update = [None] * (self.max_level + 1)current = self.header# 查找节点并更新路径for i in range(self.level, -1, -1):while current.forward[i] and current.forward[i].value < value:current = current.forward[i]update[i] = currentcurrent = current.forward[0]# 如果节点存在,删除节点if current and current.value == value:for i in range(self.level + 1):if update[i].forward[i] != current:breakupdate[i].forward[i] = current.forward[i]# 如果最高层的节点没有节点,更新跳表的层数while self.level > 0 and not self.header.forward[self.level]:self.level -= 1def print_list(self):for i in range(self.level + 1):current = self.header.forward[i]print(f"Level {i}: ", end="")while current:print(current.value, end=" -> ")current = current.forward[i]print("None")# 测试跳表
skip_list = SkipList()# 插入元素
skip_list.insert(3)
skip_list.insert(6)
skip_list.insert(7)
skip_list.insert(9)
skip_list.insert(12)
skip_list.insert(19)
skip_list.insert(17)# 打印跳表
skip_list.print_list()# 查找元素
print(skip_list.search(6))  # <__main__.Node object at 0x7f856fc748b0>
print(skip_list.search(15))  # None# 删除元素
skip_list.delete(6)
skip_list.print_list()

Bloom Filter(布隆过滤器)

  • 高效存储和检测集合中的元素,但可能产生误判(可能会错误地认为某个元素存在)
  • 适用于 去重、黑名单检测
  • 不能 删除元素
  • 用于 Google Chrome 安全浏览、Redis 缓存去重
  • 每个元素通过多个哈希函数计算出多个哈希值,将这些哈希值对应的位数组位置标记为 True
  • 查询时,再次通过哈希函数计算出这些位置,若所有位置均为 True,则认为元素可能存在;若 有任一位置为 False,则元素肯定不存在
方法说明
add(item)将元素 item 添加到布隆过滤器中。
contains(item)检查元素 item 是否在布隆过滤器中,返回 TrueFalse
import hashlibclass BloomFilter:def __init__(self, size, num_hashes):self.size = size  # 位数组的大小self.num_hashes = num_hashes  # 哈希函数的数量self.bit_array = [False] * size  # 初始化位数组为Falsedef _hash(self, item, seed):""" 基于给定种子的哈希函数 """return int(hashlib.md5((str(seed) + item).encode()).hexdigest(), 16) % self.sizedef add(self, item):""" 添加元素到布隆过滤器 """for i in range(self.num_hashes):index = self._hash(item, i)self.bit_array[index] = Truedef contains(self, item):""" 检查元素是否在布隆过滤器中 """for i in range(self.num_hashes):index = self._hash(item, i)if not self.bit_array[index]:  # 如果有任何一个哈希位置为False,则元素不在集合中return Falsereturn True# 测试布隆过滤器
bloom = BloomFilter(size=1000, num_hashes=5)# 添加元素
bloom.add("apple")
bloom.add("banana")
bloom.add("cherry")# 查询元素
print(bloom.contains("apple"))  # True
print(bloom.contains("banana"))  # True
print(bloom.contains("orange"))  # False (可能为False, 但也可能是误判)

LRU 缓存(Least Recently Used Cache)

  • 最近最少使用,即 使用频率最低的元素最先被淘汰
  • Python functools.lru_cache 提供了现成实现
  • 适用于缓存系统,如 CPU 缓存、网页缓存

示例(使用 OrderedDict 实现 LRU 缓存):

from collections import OrderedDictclass LRUCache:def __init__(self, capacity):self.cache = OrderedDict()self.capacity = capacitydef get(self, key):if key not in self.cache:return -1self.cache.move_to_end(key)  # 最近使用的移到末尾return self.cache[key]def put(self, key, value):if key in self.cache:self.cache.move_to_end(key)self.cache[key] = valueif len(self.cache) > self.capacity:self.cache.popitem(last=False)  # 移除最久未使用的元素lru = LRUCache(2)
lru.put(1, "A")
lru.put(2, "B")
print(lru.get(1))  # "A"
lru.put(3, "C")  # 2 被移除
print(lru.get(2))  # -1(缓存淘汰)

总结:如何选择数据结构?

  • 需要快速查询? → 哈希表(dict)、集合(set)、Trie
  • 需要顺序存储? → list(动态数组)、tuple
  • 需要按顺序处理? → 栈(LIFO)、队列(FIFO)、优先队列
  • 需要排序查找? → 二叉搜索树(BST)、跳表
  • 需要高效合并? → 并查集
  • 需要图结构? → 邻接表、邻接矩阵
  • 需要去重检测? → 布隆过滤器
  • 需要缓存管理? → LRU 缓存
数据结构可变性有序性是否允许重复元素典型应用
列表(List)可变有序允许适合存储 序列 数据
元组(Tuple)不可变有序允许适合存储 固定 数据
字典(Dictionary)可变有序(3.7+)不能重复映射关系(Key-Value) 存储
集合(Set)可变无序不允许去重、集合 运算
栈(Stack)可变有序允许后进先出(LIFO)
队列(Queue)可变有序允许先进先出(FIFO)

相关文章:

【Python 语法】Python 数据结构

线性结构&#xff08;Linear Structures&#xff09;1. 顺序存储列表&#xff08;List&#xff09;元组&#xff08;Tuple&#xff09;字符串&#xff08;String&#xff09; 2. 线性存储栈&#xff08;Stack&#xff09;队列&#xff08;Queue&#xff09;双端队列&#xff08…...

Flutter - 布局Widget

Flutter的布局主要分为 单子组件 和 多子组件 两大类&#xff1a; Container、Padding、Align这些属于单子组件&#xff0c;而Row、Column、ListView这些则是多子组件。 单子组件 Align组件 Align 是一个用于控制子组件位置的单子布局组件。它通过指定对齐方式&#xff08…...

AD从原理图到PCB超详细教程

AD超详细教程 前言一、建立一个工程模板二、原理图1.设计原理图。2.使用AD自带库和网上开源原理图库3.画原理图库4.编译原理图三、PCB1.确定元器件尺寸大小2.绘制PCB Library①使用元器件向导绘制元件库②原理图与PCB的映射3.绘制PCB①更新PCB②调整元件位置③布线④漏线检查⑤…...

视频级虚拟试衣技术在淘宝的产品化实践

作为一种新的商品表现形态&#xff0c;内容几乎存在于手淘用户动线全流程&#xff0c;例如信息流种草内容、搜索消费决策内容、详情页种草内容等。通过低成本、高时效的AIGC内容生成能力&#xff0c;能够从供给端缓解内容生产成本高的问题&#xff0c;通过源源不断的低成本供给…...

Redis安装及其AnotherRedisDesktopManagera安装使用

一、Redis安装 1. 下载Redis安装包 通过网盘分享的文件&#xff1a;Redis 链接: https://pan.baidu.com/s/1elAT8mk3EIoYQQ3WoVVoNg?pwd7yrz 提取码: 7yrz 2. 解压Redis安装包 下载完成后&#xff0c;将Redis安装包解压到一个指定的目录&#xff0c;例如&#xff1a;C:\Re…...

2025系统架构师(一考就过):案例之四:架构复用、架构评估、特定架构(DSSA)、架构开发方法(ABSD)

二、软件架构复用 ◆软件产品线是指一组软件密集型系统&#xff0c;它们共享一个公共的、可管理的特性集&#xff0c;满足某个特定市场或任务的具体需要&#xff0c;是以规定的方式用公共的核心资产集成开发出来的。即围绕核心资产库进行管理复用、集成新的系统。 ◆软件架构…...

软件工程应试复习(考试折磨版)

针对学校软件工程考试&#xff0c;参考教材《软件工程导论&#xff08;第6版&#xff09;》1-8章 学习的艺术&#xff1a;不断地尝试&#xff0c;我一定会找到高效用的方法&#xff0c;让学习变成一门艺术&#xff0c;从应试备考中解救出我的时间同胞们。 好嘞&#xff01;既然…...

Kafka可视化工具EFAK(Kafka-eagle)安装部署

Kafka Eagle是什么&#xff1f; Kafka Eagle是一款用于监控和管理Apache Kafka的开源系统&#xff0c;它提供了完善的管理页面&#xff0c;例如Broker详情、性能指标趋势、Topic集合、消费者信息等。 源代码地址&#xff1a;https://github.com/smartloli/kafka-eagle 前置条件…...

本地部署SenseVoice(包括离线设备操作)

Anaconda3 Anaconda Installers and Packages SenseVoice 魔搭社区 FFmpeg FFmpeg 安装Anaconda3&#xff08;Windows&#xff09; 下载完成后&#xff0c;自定义路径后安装。在开始菜单中出现Anaconda Prompt说明安装成功。 安装Anaconda3&#xff08;Linux&#xff…...

sql server 复制从备份初始化数据

参考 &#xff1a; 从备份初始化订阅&#xff08;事务&#xff09; - SQL Server | Microsoft Learn sql server 复制默认是用快照初始化数据的&#xff0c;也支持从备份初始化数据&#xff0c;参考如上...

MySQL 复合索引

MySQL 复合索引详解 引言 在实际业务场景中&#xff0c;多条件组合查询是最常见的操作之一。例如&#xff0c;根据“用户ID 时间范围”查询订单&#xff0c;或根据“商品分类 价格区间”筛选商品。此时&#xff0c;单列索引可能无法满足性能需求&#xff0c;而**复合索引&am…...

蓝桥杯备赛(C/C++组)

README&#xff1a; 本笔记是自己的备考笔记&#xff0c;按照官网提纲进行复习&#xff01;适合有基础&#xff0c;复习用。 一、总考点 试题考查选手解决实际问题的能力&#xff0c;对于结果填空题&#xff0c;选手可以使用手算、软件、编程等方法解决&#xff0c;对于编程大…...

人类驾驶的人脑两种判断模式(反射和预判)-->自动驾驶两种AI模式

一种模式是直觉模式&#xff0c;判断是基于条件反射&#xff0c;视觉感知 触发到 直接条件反射&#xff08;从经历中沉淀形成的神经信息闭环&#xff09;&#xff0c;类似现在自动驾驶技术的传统AI模式。 另一种模式是物理时空图式推理模式&#xff0c;判断是基于预判预测&…...

C语言机试编程题

编写版本&#xff1a;vc2022 1.求最大/小值 #include<stdio.h> int main(){int a[50],n;int max, min;printf("请输入您要输入几个数");scanf_s("%d", &n);printf("请输入您要比较的%d个数\n",n);for (int i 0; i<n; i) {scanf_…...

SmartMediakit之音视频直播技术的极致体验与广泛应用

引言 在数字化时代&#xff0c;音视频直播技术已经深入到各个行业和领域&#xff0c;成为信息传递和交流的重要手段。视沃科技自2015年成立以来&#xff0c;一直致力于为传统行业提供极致体验的音视频直播技术解决方案&#xff0c;其旗下的大牛直播SDK凭借强大的功能和卓越的性…...

NVIDIA GEFORCE GTX1050显卡如何搭建AI人脸识别技术环境

NVIDIA GEFORCE GTX1050显卡如何搭建AI人脸识别技术环境!实际上,这个显卡虽然是入门级的,但是依然可以满足你的入门学习要求。 你的显卡是 NVIDIA GTX 1050,显存为 2GB,虽然它的性能不如高端显卡(如RTX 3060、3090等),但对于学习和研究 人脸识别技术,尤其是进行基础的…...

华为数通Datacom认证体系详解:从HCIA到HCIE的进阶路径

华为数通Datacom&#xff08;Data Communication&#xff09;课程是华为认证体系中的核心方向之一&#xff0c;聚焦企业网络通信与数据通信技术&#xff0c;适合从事网络规划、部署和运维的人员。 一、数通Datacom课程体系 华为数通Datacom认证分为 三个级别&#xff0c;逐级递…...

【运维】内网服务器借助通过某台可上外网的服务器实现公网访问

背景&#xff1a; 内网服务器无法连接公网,但是办公电脑可以连接内网服务器又可以连接公网。 安装软件 1、frp 2、ccproxy 配置 1、内网服务器 # 内网服务器启动frp服务配置文件参考vi frps.ini# frps.ini [common] bind_port 7000# 备注: bind_port端口可以随意配置。配置完…...

Spring之Bean的生命周期过程中调用的方法

1。这个部分除了6,9都在这了 package com.example.springbootdemo3.lifebeean;import org.springframework.beans.BeansException; import org.springframework.beans.factory.*; import org.springframework.beans.factory.annotation.Value; import org.springframework.con…...

Vue 中动态实现进度条

在 Vue 中动态实现进度条&#xff0c;基本上有两种常见的方法&#xff1a;直接通过 Vue 数据绑定控制样式&#xff0c;或者利用外部库来实现更复杂的功能。我们会深入探讨这两种方式&#xff0c;并且详细说明每种方法的实现步骤、优缺点以及使用场景。 1. 使用 Vue 数据绑定来…...

Qt互斥锁(QMutex)的使用、QMutexLocker的使用

Qt互斥锁【QMutex】的使用、QMutexLocker的使用 Chapter1 Qt互斥锁(QMutex)的使用、QMutexLocker的使用一、QMutexLocker和QMutex实现示例图二、QMutex和QMutexLocker的关系&#xff08;个人理解&#xff09;三、QMutex使用和QMutexLocker使用1.QMutex的使用2.QMutexLocker的使…...

Python开发 Flask框架面试题及参考答案

目录 Flask 的核心设计理念是什么?与 Django 相比有哪些显著差异? 解释 Flask 框架的核心理念及其作为 “微框架” 的优缺点 Flask 的依赖库有哪些?简述 Werkzeug 和 Jinja2 的作用 什么是 WSGI?Flask 如何基于 WSGI 实现服务端与应用的交互 解释 RESTful API 的设计原…...

DeepSeek模型昇腾部署优秀实践

2024年12月26日&#xff0c;DeepSeek-V3横空出世&#xff0c;以其卓越性能备受瞩目。该模型发布即支持昇腾&#xff0c;用户可在昇腾硬件和MindIE推理引擎上实现高效推理&#xff0c;但在实际操作中&#xff0c;部署流程与常见问题困扰着不少开发者。本文将为你详细阐述昇腾 De…...

【cv】vs2022配置opencv

release下配置包含目录和库目录 E:\sdk\sdk_cuda12.3\opencv490\include E:\sdk\sdk_cuda12.3\opencv490\include\opencv2 E:\sdk\sdk_cuda12.3\opencv490\lib release下配置包含链接器输入的依附依赖项 opencv_world490.lib release编译文件夹下需手动复制opencv_world49…...

RabbitMQ系列(五)基本概念之Queue

在 RabbitMQ 中&#xff0c;Queue&#xff08;队列&#xff09; 是存储消息的容器&#xff0c;也是消息传递的核心载体。以下是其核心特性与作用的全方位解析&#xff1a; 一、Queue 的定义与核心作用 消息存储容器 Queue 是 RabbitMQ 中实际存储消息的实体&#xff0c;生产者…...

从二维随机变量到多维随机变量

二维随机变量 设 X X X和 Y Y Y是定义在同一样本空间 Ω \varOmega Ω上的两个随机变量&#xff0c;称由它们组成的向量 ( X , Y ) (X, Y) (X,Y)为二维随机变量&#xff0c;亦称为二维随机向量&#xff0c;其中称 X X X和 Y Y Y是二维随机变量的分量。 采用多个随机变量去描述…...

IP-----动态路由OSPF

这只是IP的其中一块内容&#xff0c;IP还有更多内容可以查看IP专栏&#xff0c;前一章内容为GRE和MGRE &#xff0c;可通过以下路径查看IP-------GRE和MGRE-CSDN博客,欢迎指正 注意&#xff01;&#xff01;&#xff01;本部分内容较多所以分成了两部分在下一章 5.动态路由OS…...

RabbitMQ操作实战

1.RabbitMQ安装 RabbitMQ Windows 安装、配置、使用 - 小白教程-腾讯云开发者社区-腾讯云下载erlang&#xff1a;http://www.erlang.org/downloads/https://cloud.tencent.com/developer/article/2192340 Windows 10安装RabbitMQ及延时消息插件rabbitmq_delayed_message_exch…...

python-leetcode-不同路径

62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; class Solution:def uniquePaths(self, m: int, n: int) -> int:dp [1] * n # 仅保留一行for i in range(1, m):for j in range(1, n):dp[j] dp[j-1]return dp[-1]...

【react】快速上手基础教程

目录 一、React 简介 1.什么是 React 2.React 核心特性 二、环境搭建 1. 创建 React 项目 2.关键配置 三、核心概念 1. JSX 语法 表达式嵌入 样式处理 2. 组件 (Component) 3. 状态 (State) 与属性 (Props) 4. 事件处理 合成事件&#xff08;SyntheticEvent) 5. …...

【愚公系列】《Python网络爬虫从入门到精通》033-DataFrame的数据排序

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...

一周一个Unity小游戏2D反弹球游戏 - 移动的弹板(触屏版)

前言 上文中实现了用鼠标移动控制弹板的移动&#xff0c;本文将实现手指触屏时弹板跟随手指移动的功能&#xff0c;并通过使用Unity自带的Device Simulator Devices Package来验证和模拟触屏设备的使用场景。 安装Device Simulator Devices Package 打开Unity Package Manager&…...

深度学习-11.用于自然语言处理的循环神经网络

Deep Learning - Lecture 11 Recurrent Networks for Natural Language Processing 介绍文本表示用数字表示单词词嵌入(word embedding) 机械翻译编码器 - 解码器循环模型&#xff08;Encoder-decoder recurrent models&#xff09;双向循环网络 注意力机制&#xff08;方法&am…...

2025年软考报名费用是多少?全国费用汇总!

软考报名时间终于确定了&#xff01;想要参加2025年软考的同学们注意啦&#xff01;特别是那些一年只有一次考试机会的科目&#xff0c;千万不要错过哦&#xff01;这里为大家整理了各地的报名时间、科目、费用等信息&#xff0c;快来看看吧&#xff01; 一、2025年软考时间安…...

el-input实现金额输入

需求&#xff1a;想要实现一个输入金额的el-input&#xff0c;限制只能输入数字和一个小数点。失焦数字转千分位&#xff0c;聚焦转为数字&#xff0c;超过最大值&#xff0c;红字提示 效果图 失焦 聚焦 报错效果 // 组件limitDialog <template><el-dialog:visible.s…...

C++11相较于C++98的新特性介绍:列表初始化,右值引用与移动语义

一&#xff0c;列表初始化 1.1C98中传统的{} C98中一般数组和结构体可以使用{}进行初始化&#xff1a; struct Date {int _year;int _month;int _day; };int main() {int a[] { 1,2,3,4,5 };Date _date { 2025,2,27 };return 0; } 1.2C11中的{} C11以后想统一初始化方式&…...

ISIS(中间系统到中间系统)——基础

ISIS是一项通用的动态路由协议&#xff0c;其隶属于链路状态路由协议&#xff0c;最初运行与OSI七层的网络层&#xff0c;采用组播地址224.0.0.14和224.0.0.15两个组波段&#xff0c;由于其较高的拓展性与高速收敛&#xff0c;被大多数运营商网络所使用 起源 ISIS最初是由国际…...

如何使用useContext进行全局状态管理?

在 React 中&#xff0c;使用 useContext 进行全局状态管理是一种有效的方法&#xff0c;尤其在需要在多个组件之间共享状态时。useContext 允许你在组件树中传递数据&#xff0c;而无需通过每个组件的 props 逐层传递。以下是关于如何使用 useContext 进行全局状态管理的详细指…...

docker容器网络配置及常用操作

Linux内核实现名称空间的创建 ip netns&#xff08;网络名称空间&#xff09;命令 可以借助ip netns命令来完成对 Network Namespace 的各种操作。ip netns命令来自于iproute安装包&#xff0c;一般系统会默认安装&#xff0c;如果没有的话&#xff0c;请自行安装。 注意&am…...

GMII(Gigabit Media Independent Interface)详解

一、GMII的定义与作用 GMII&#xff08;千兆介质无关接口&#xff09;是用于千兆以太网&#xff08;1Gbps&#xff09;的标准化接口&#xff0c;连接 MAC层&#xff08;数据链路层&#xff09;与 PHY芯片&#xff08;物理层&#xff09;。其核心目标是支持高速数据传输&#x…...

Wireshark Lua 插件教程

本⽂主要介绍 Lua 脚本在 Wireshark 中的应⽤, Lua 脚本可以在 Wireshark 中完成如下功能: 从⽹络包中提取数据, 或者统计⼀些数据包(Dumper) 需要解析⼀种 Wireshark 不提供原⽣⽀持的协议(Dissector) ⽰例 协议解析 VREP 协议是 NOGD 框架对于 TRIP 协议的⼀种延伸和扩展…...

【多模态大模型】GLM-4-Voice端到端语音交互机器人VoiceAI

写在前面&#xff1a;开源选手中最能打的 GLM-4-Voice&#xff0c;由智谱 AI 和清华大学共同研发&#xff0c;并发表论文 “GLM-4-Voice: Towards Intelligent and Human-Like End-to-End Spoken Chatbot”&#xff0c;旨在打造智能且类人化的端到端语音聊天机器人。GLM-4-Voi…...

Unity 列表滚动到指定位置

使用场景 策划提出需求&#xff1a;当玩家打开领奖界面时&#xff0c;奖励列表需要自动滑动到可以领奖的奖励栏处或者正在进行的任务栏处。 思路 1、将Content设置好对齐方式和锚点 子物体的预制体和Content&#xff1a;pivot轴心点设置为(0,1),并且设置为左上角对齐。 2、主…...

使用Crawlee可破题js渲染采集数据

使用 Crawlee 实现自动化爬虫流程 1. Crawlee 简介 Crawlee 是一个强大的爬虫框架&#xff0c;用于快速构建和维护可靠的爬虫。它支持多种爬虫类型&#xff0c;包括基于 Cheerio 和 Playwright 的爬虫&#xff0c;能够高效处理静态和动态网页。 2. 项目目标 通过自动化脚本实…...

小红的字母游戏(A组)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 小红有一个长度为 nnn 的字符串 sss&#xff0c;仅包含小写字母&#xff0c;小红可以选出 kkk 个字符&#xff0c;组成一个新的字符串 ttt&#xff0c;对于 ttt 的每一个字符 tit_it…...

MFC线程

创建线程 HANDLE m_hThread; m_hThread CreateThread(NULL, 0, save_snapshot, (LPVOID)this, 0, &iThreadId);开启线程循环等待 DWORD WINAPI save_snapshot(LPVOID pVoid) {while (true){//持续循环等待事件到达。接收到事件信号后才进入if。if (::WaitForSingleObjec…...

目标检测YOLO实战应用案例100讲-面向无人机图像的小目标检测

目录 知识储备 YOLO v8无人机拍摄视角小目标检测 数据集结构 环境部署说明 安装依赖 模型训练权重和指标可视化展示 训练 YOLOv8 PyQt5 GUI 开发 主窗口代码 main_window.py 使用说明 无人机目标跟踪 一、目标跟踪的基本原理 二、常用的目标跟踪算法 基于YOLOv…...

【Java分布式】Nacos注册中心

Nacos注册中心 SpringCloudAlibaba 也推出了一个名为 Nacos 的注册中心&#xff0c;相比 Eureka 功能更加丰富&#xff0c;在国内受欢迎程度较高。 官网&#xff1a;https://nacos.io/zh-cn/ 集群 Nacos就将同一机房内的实例划分为一个集群&#xff0c;一个服务可以包含多个集…...

VSCode轻松调试运行.Net 8.0 Web API项目

1.背景 我一直都是用VS来开发.NetCore项目的&#xff0c;用的比较顺手&#xff0c;也习惯了。看其他技术文章有介绍VS Code更轻量&#xff0c;更方便。所以我专门花时间来使用VS Code&#xff0c;看看它是如何调试代码、如何运行.Net 8.0 WebAPI项目。这篇文章是一个记录的过程…...

PageHelper新发现

PageHelper 背景解决reasonablepageSizeZero 背景 今天发现了一个很有趣的现象&#xff0c;接手一个很老的项目springmvc项目、使用PageHelper分页实现常见的后端接口分页功能。但是发现当页码参数大于实际的页码数时、正常不应该返回数据&#xff0c;但是目前确一直返回数据不…...