大家好,今天和大家一起学习一下数据结构,先了解一下线性与非线性~
在计算机科学中,数据结构是组织和存储数据的方式,它直接影响到算法的效率。根据数据元素之间的关系,数据结构可以分为两大类:线性数据结构和非线性数据结构。本文将详细介绍这两类数据结构,并通过具体示例来说明它们的特点及应用场景。
一、线性数据结构
线性数据结构中的元素按照顺序排列,每个元素都有一个直接前驱和一个直接后继(除了第一个和最后一个元素)。常见的线性数据结构包括数组、链表、栈和队列。
- 数组
-
- 特点:固定大小,相同类型的元素连续存放。
- 操作:随机访问、插入/删除(通常需要移动元素)。
- 应用:用于实现列表、向量等。
Python 示例:
numbers = [1, 2, 3, 4, 5]
print(numbers[2]) # 输出 3
numbers.append(6) # 添加新元素
print(numbers) # 输出 [1, 2, 3, 4, 5, 6]
- 链表
-
- 特点:动态大小,通过指针连接节点。
- 操作:高效地插入/删除,但访问特定元素可能需要遍历。
- 示例:
class Node:
def __init__(self, data):
self.data = data
self.next = None
创建链表
head = Node(1)
second = Node(2)
third = Node(3)
head.next = second
second.next = third
- 栈
-
- 特点:LIFO(Last In First Out)原则。
- 操作:push(入栈)、pop(出栈)、peek(查看顶部元素)。
- 示例:
stack = []
stack.append(1) # 入栈
stack.append(2)
print(stack.pop()) # 出栈并输出 2
- 队列
-
- 特点:FIFO(First In First Out)原则。
- 操作:enqueue(入队)、dequeue(出队)。
- 示例:
from collections import deque
queue = deque()
queue.append(1) # 入队
queue.append(2)
print(queue.popleft()) # 出队并输出 1
二、非线性数据结构
非线性数据结构中的元素之间没有固定的顺序,通常表现为树形或图状结构。主要包括树和图。
- 树
-
- 特点:分层结构,有一个根节点,子节点位于父节点之下。
- 类型:二叉树、二叉搜索树、AVL树、红黑树等。
- 示例:二叉搜索树
class TreeNode:
def __init__(self, key):
self.left = None
self.right = None
self.val = key
# 插入节点
def insert(root, key):
if root is None:
return TreeNode(key)
else:
if root.val < key:
root.right = insert(root.right, key)
else:
root.left = insert(root.left, key)
return root
# 构建二叉搜索树
r = TreeNode(50)
r = insert(r, 30)
r = insert(r, 20)
r = insert(r, 40)
r = insert(r, 70)
r = insert(r, 60)
r = insert(r, 80)
- 图
-
- 特点:由顶点和边组成,可以是有向的也可以是无向的。
- 表示方法:邻接矩阵、邻接列表。
- 示例:使用邻接列表表示有向图
graph = {
'A': ['B', 'C'],
'B': ['D'],
'C': ['E'],
'D': [],
'E': []
}
实战场景
- 浏览器历史记录(线性 - 栈)
-
- 当用户浏览网页时,浏览器使用栈来记录用户的访问历史。每次进入新页面,当前页面URL被压入栈顶;当点击“后退”按钮时,则从栈顶弹出最近访问过的页面。
- 社交网络好友推荐(非线性 - 图)
-
- 在社交网络中,用户之间的关系可以用图来表示,其中每个用户对应于图的一个顶点,如果两个用户互为好友,则在对应的两个顶点之间建立一条边。基于这种模型,可以通过分析用户之间的联系强度来推荐潜在的新朋友。
不同数据结构各有其优势和适用场景。选择合适的数据结构对于提高程序性能至关重要。如果有疑问欢迎评论区讨论~