大厂员工:OD不丢人!大学室友去了华子正编,我半年后去了华子OD,唯一羡慕的是他不加班!
今天看到一个挺有意思的华子员工爆料,忍不住想笑。说他大学室友去了华子的正编,而他自己则去了华子的OD(外包部门)。
俩人经常在WeLink上聊天,唯一的区别就是室友“不加班”,而他自己则天天熬夜加班。这种对比,作为程序员的我,真的有点心酸又有点好笑。
说到OD和正编的区别,外人总是觉得OD好像比正编差点,待遇低,项目也没那么“高级”,但其实,我们自己做过的人心里清楚,OD并不一定差。
虽然外界看法可能偏差,但OD最大的优势是工作节奏相对轻松。没有那么多的紧急需求,也没有每天面对无休止的加班。你有更多时间去充电、学习新技术,甚至有时间好好休息,享受生活。
正编的确让人眼馋,薪水高、职位光鲜,但背后却是无休止的压力和加班。
每次看到正编同事深夜还在会议室里忙着开会、写文档,心里不禁感叹:是不是“正编”的工作就只能这样?而OD的自由时间,无疑让我更加向往。
其实,最终还是要看每个人的需求。【备注:文末可领最新资料】
算法题:冗余连接
今天咱们来聊聊一个算法题:冗余连接。
题目的大概意思是,你给了你一个图,其中有多个节点和边,题目要你找到其中的冗余连接,也就是那些边如果删掉,图依然保持连通——没错,就是找出那个不必要的“多余”的边。你可以理解为,在一个连通图里,多加了一条边会不会使得图中的某些部分变成了“环”?
让我们从一个简单的例子来开始。
假设有这么一组边:
[ [1, 2], [1, 3], [2, 3] ]
也就是说,节点 1 和 2 有边相连,节点 1 和 3 有边相连,节点 2 和 3 也有边相连。看一下,你能发现啥问题吗?没错,**[2, 3]** 这条边显然是冗余的,因为如果去掉它,图依然是连通的。
那么,如何从算法的角度来解这道题呢?
首先,我们得明确一个基本的图论知识:图是无向的。如果我们从图的角度来看的话,冗余连接就是指一个边的加入,使得图中形成了环。也就是说,当你尝试加一条边时,发现这条边已经把两个已经连通的节点连起来了,那这条边就是冗余的。
算法思路: 我们可以用“并查集”算法来处理这个问题。并查集(Union-Find)是一个非常经典的图算法,用来处理图中节点的连通性问题。它的核心思想就是,通过一系列的查找和合并操作,来判断两个节点是否已经在同一个集合中。我们可以通过这个方法来检查是否存在冗余的边。
下面是实现这道题的 Python 代码:
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
return True
return False
def findRedundantConnection(edges):
n = len(edges)
uf = UnionFind(n + 1) # 因为节点是从1开始的,大小为n+1
for edge in edges:
u, v = edge
# 如果u和v已经在同一个集合中,那么这条边就是冗余边
if not uf.union(u, v):
return edge
return []
解释一下代码:
UnionFind类初始化了一个大小为n + 1的父节点数组,每个节点的父节点最初是自己。find方法是查找操作,用来找到节点的根节点,并进行路径压缩(即将节点直接连接到根节点,减少后续查找的时间复杂度)。union方法是合并操作,它尝试将两个节点连接在一起。如果它们已经在同一个集合里(即已经连通),则返回False,表示这条边是冗余的。
我们遍历所有的边,如果某条边的两个节点已经连通了,那么说明这条边就是冗余的,不需要加入。如果能够成功合并,说明当前这条边是必要的。
时间复杂度:
find和union操作的时间复杂度近似为 O(α(n)),其中 α 是逆阿克曼函数,它的增长速度非常慢,因此可以认为是常数级别的。因此,总的时间复杂度是 O(E * α(V)),其中 E 是边的数量,V 是节点的数量。
你看,这个解法其实挺高效的,并查集的魔力就在于,它能够在常数时间内完成连通性判断,避免了用深度优先搜索(DFS)或者广度优先搜索(BFS)遍历整个图的低效操作。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。