【学习笔记】数据结构和常用算法 - Day6

本文介绍了并查集算法及其优化,包括QuickFind和QuickUnion-权重,强调了贪心算法的核心思想,并探讨了记忆化搜索在减少重复计算中的应用。此外,还概述了动态规划的特点和解决步骤,以及字典树在关键字匹配中的效率问题。这些是信息技术领域中重要的基础算法和数据结构。
摘要由CSDN通过智能技术生成

算法 - 并查集 Union Find

主要思想

在这里插入图片描述
Union:合并2个元素为1个根节点 Union(x,y)
Find:找到某个元素的根节点 Find(x)

算法模板

class UnionFind:
	# 初始化
	def __init__(self):
		self.root = [-1]*(row*col):
		for i in range(row*col):
			self.root[i] = i
	
	def find(self,x):
		if x == self.root[x]:
			return self.root[x]
		else:
			self.find(self.root[x])
			return

	def union(self,x,y):
		rootX = self.find(x)
		rootY = self.find(y)
		if rootX != rootY:
			self.root[rootX] = rootY

算法优化

Quick Find

class UnionFind:
	def __init__(self):
		self.root = [-1]*(row*col):
		for i in range(row*col):
			self.root[i] = i
	
	def find(self,x):
		if x == self.root[x]:
			return self.root[x]
		else:
			self.root[x] = self.find(self.root[x])
			return self.root[x]

	def union(self,x,y):
		rootX = self.find(x)
		rootY = self.find(y)
		if rootX != rootY:
			self.root[rootX] = rootY

Quick Union - 权重

思想:防止树太高

原理:比较两个树的高度,把矮的树连接到高的树上,使新树的高度最小

在这里插入图片描述

class UnionFind:
	def __init__(self):
		self.root = [-1]*n:
		self.rank = [0]*n
		for i in range(n):
			self.root[i] = i
	
	def find(self,x):
		if self.root[x] != x:
			self.root[x] = self.find(self.root[x])
		return self.root[x]

	def union(self,x,y):
		rootX = self.find(x)
		rootY = self.find(y)
		if rootX != rootY:
			if self.rank[rootX] > self.rank[rootY]:
				root[rootY] = rootX
			elif self.rank[rootX] < self.rank[rootY]:
				root[rootX] = rootY
			else:
				root[rootY] = rootX
				self.rank[rootX] += 1

算法 - 贪心算法 Greedy

核心思想

每一步的选择都是当前看起来的最优解,换言之,只是局部最优解,而不是整体最优解。
在这里插入图片描述

算法 - 记忆化搜索(备忘录)Memorization

目的

减少重复计算

应用

斐波那契数列:该数列的特点是 F(n) = F(n-1) + F(n-2),需要用到递归。可用一个数组,初始值全是 -1,当某个 F(n) 的值已被计算过,就将该值存至 list [n]。后面再次用到 F(n) 时,若 list [n] 不是 -1,就直接调用该值,不需要再重复计算了。

算法 - 动态规划

特点

题型千变万化,思路千变万化

三个要素

初始状态,状态转移方程式,终止状态

步骤

由初始状态,通过状态转移方程式,计算出所有中间状态,从而计算出终止状态

应用

1.计数:有多少种方式 / 方法
机器人从左上角到右下角有多少个路径

2.求最值:最大值 / 最小值
每个格子上都有一个数字,机器人从左到右路径的最大数字和

3.求存在性:是否存在某个可能
每个格子上都有一个指向,是否存在机器人从左到右的路径

数据结构 - 字典树 / 前缀树 Trie

应用

百度的关键字自动匹配

时间复杂度

# 写一个自动匹配的程序:普通方法,不是Trie
数组:[goog,googl,google,bai,baidu,gi]

g:goog,googl,google,gi
go:goog,googl,google

# 插入:O(N)
# 搜索:O(N)
# 检查前缀是否存在:O(N*M),N是数组的元素个数,M是每次匹配时的时间复杂度

在这里插入图片描述

要素

root 节点:root = Trie()
孩子节点:HashMap(key 是字符,value 是新的 Trie)
结束 Flag:boolean isEnd
对应的值:String val

知识点回顾

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值