数据结构
数据结构是计算机科学中存储、组织数据的一种方式,它使得数据的访问和修改更加高效。不同的数据结构适用于不同的应用场景和需求。下面是一些基本的数据结构类型:
1. 数组(Array):
- 一种线性数据结构,可以存储固定大小的同类型元素。
- 访问元素的时间复杂度为 O(1),但插入和删除操作的时间复杂度为 O(n),因为需要移动元素。
2. 链表(Linked List):
- 由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
- 插入和删除操作相对容易,时间复杂度为 O(1),但访问特定元素需要 O(n) 时间。
3. 栈(Stack):
- 一种后进先出(LIFO)的数据结构,只允许在一端进行插入和删除操作。
- 常用于实现函数调用、撤销操作等。
4. 队列(Queue):
- 一种先进先出(FIFO)的数据结构,允许在一端添加元素,在另一端删除元素。
- 常用于任务调度、缓冲处理等。
5. 树(Tree):
- 一种非线性数据结构,由节点组成,有一个根节点,每个节点可能有多个子节点。
- 二叉树是每个节点最多有两个子节点的树,用于二叉搜索树、堆等结构。
6. 图(Graph):
- 由一组顶点和连接这些顶点的边组成,用于表示复杂的关系。
- 可以是有向图或无向图,用于社交网络、地图导航等。
7. 散列表(Hash Table):
- 通过散列函数将键映射到存储桶中,用于快速查找、插入和删除。
- 适用于实现字典、集合等数据结构。
8. 堆(Heap):
- 特殊类型的树结构,通常用于实现优先队列。
- 最大堆和最小堆是常见的堆结构,分别用于快速获取最大或最小元素。
每种数据结构都有其特定的使用场景和优缺点。选择合适的数据结构对于编写高效、可维护的代码至关重要。在实际应用中,经常需要根据问题的需求和数据的特性来选择合适的数据结构。
数组
数组是一种基础且广泛使用的数据结构,它用于存储一系列相同类型的数据项。数组中的每个数据项称为一个元素,每个元素可以通过一个索引来访问,这个索引通常是数组中元素的位置编号。
主要特点
1. 连续内存空间:数组中的所有元素在内存中是连续存放的,这意味着它们彼此相邻。
2. 固定大小:一旦创建了数组,其大小就固定了,不能动态改变(虽然某些高级语言提供了动态数组或类似的数据结构)。
3. 索引访问:可以通过索引直接访问数组中的任何元素,访问时间复杂度为 O(1),非常快速。
优缺点
优点:
快速访问:由于元素在内存中是连续存储的,所以访问任何元素都非常快速。
固定大小:数组的大小在创建时确定,这使得内存管理相对简单。
缺点:
固定大小:数组大小一旦确定,就不能动态改变,这在某些情况下可能不够灵活。
内存浪费:如果数组中有很多未使用的空间,可能会造成内存浪费。
插入和删除成本高**:在数组中间插入或删除元素需要移动大量元素来保持连续性,因此操作成本较高。
常见操作
初始化:创建数组并分配内存空间。
访问元素:通过索引直接访问数组中的元素。
遍历:按顺序访问数组中的每个元素。
搜索:查找数组中是否存在特定元素,并返回其位置。
插入:在数组中添加新元素,通常需要移动现有元素。
删除:从数组中移除元素,并可能需要移动后续元素。
示例代码(Python):
# 创建# 创建一个整数数组
arr = [10, 20, 30, 40, 50]
# 访问数组中的第三个元素
print(arr[2]) # 输出: 30
# 遍历数组
for element in arr:
print(element)
# 插入元素(在Python中,列表提供了动态数组的功能)
arr.append(60) # 在数组末尾添加元素
# 删除元素
del arr[1] # 删除索引为1的元素
数组是许多更复杂数据结构的基础,例如动态数组、链表、栈、队列等,它们在不同程度上解决了数组的一些限制。
二分查找法·
def search(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
又称折半查找,是一种效率极高的查找方法。该方法要求顺序表中的元素是有序的,即表中元素按关键字有序,假设有序顺序表中的元素是递增有序的
移除元素
原地移除
暴力解法
class Solution:
def removeElement(self,nums:List[int],val:int)->int:
i,l = 0,len(nums)
while i < l:
if num[i] == val:
for j in range(i+1,l):
nums[j - 1]=nums[j]
l-=1
i-=1
return l
快慢指针法
class Solution:
def removeElement(self,nums:List[int],val:int)->int:
fast=0
slow=0
size=len(nums)
while fast<size:
if nums[fast]!=val:
nums[slow]=nums[fast]
slow+=1
fast+=1
return slow