网友爆料:朋友被裁给了20 万的补偿,结果前领导找到他,让跟他一起创业,每周干3天,保底挣3w~
今天又碰到个有趣的事情,得跟大家分享一下。
最近我一个朋友被裁了,34岁,刚进公司没多久,不过人家公司还算厚道,给了20万的补偿。
不过,接下来发生的事情却有点让人懵了——他的前领导找到他,说要带他一起创业,每周工作3天,保底工资3万,甚至承诺有更多的收入机会。
但是,问题来了。创业的风险大,尤其是我们这些老程序员一看就知道,做项目、搞团队什么的,光靠理想是不够的。
前领导的这种话,听起来是很美好,但万一创业失败,背后可没有20万的补偿等着呢。所以朋友有点犹豫了,觉得可能不太靠谱,问我该怎么选。
我觉得这事要慎重考虑。虽然3万的保底看起来很诱人,但是你要清楚,这种事情很难保证持续性,特别是在创业阶段。
我的建议是:先拿到裁员的补偿,再去好好考虑创业的事情。你如果没有稳定的收入来源,万一创业失败,钱没了,连基本的生活都成问题。所以,先稳住自己的饭碗,等机会再说。【备注:文末可领最新资料】
算法题:二叉搜索树中的插入操作
今天我们聊聊二叉搜索树(BST)中的插入操作。对于很多程序员来说,这个操作可能已经很熟悉了,但要细讲一下,其实还是有不少坑可以掉进去的。所以今天我们就把这个操作从头到尾捋一遍,讲清楚如何正确地实现它,避免踩雷。
首先,我们简单回顾一下什么是二叉搜索树(BST)。你可以理解为一个特殊的二叉树,在这棵树中,任意节点的左子树的值都小于该节点的值,而右子树的值都大于该节点的值。比如:
10
/ \
5 15
/ \ \
3 7 20
从上面的例子你可以看出,10是根节点,左边是比它小的节点,右边是比它大的节点。插入新节点时,要根据值的大小决定是往左子树插,还是往右子树插。
好了,说到插入操作,问题就来了。很多初学者在做这类题目时,容易犯的一个错误就是忘了递归的“终止条件”——也就是说,当我们插入一个新节点时,应该什么时候停止递归,在哪里放置这个新节点,才是正确的。
接下来,我来给你们展示一个常见的二叉搜索树插入操作的实现。
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = rightdef insertIntoBST(root, val):
# 如果当前节点为空,直接创建新节点
if not root:
return TreeNode(val)
# 如果插入的值小于当前节点的值,去左子树插入
if val < root.val:
root.left = insertIntoBST(root.left, val)
# 如果插入的值大于当前节点的值,去右子树插入
else:
root.right = insertIntoBST(root.right, val)
# 返回根节点(递归时修改的是子树的根节点)
return root
这是标准的递归实现。我们从根节点开始判断,值小于根节点就递归插入左子树,值大于根节点就递归插入右子树,直到找到空位插入新的节点。
至于递归的终止条件,其实就是当root为空时,我们就应该返回一个新的节点,这也是新节点插入的“标志”。你可以看到,递归函数的返回值是“树”的根节点,插入操作实际上修改了树结构,但我们始终保证树的根节点不变。
当然,这只是最简单的实现。要是考虑一些更复杂的情况,比如非递归实现,或者在实际项目中插入节点的性能优化,可能还会有一些调整。
例如,如果树的高度比较大,递归可能会消耗较多的栈空间,这时候我们可以考虑迭代的方式进行插入,避免递归带来的性能瓶颈:
def insertIntoBSTIterative(root, val):
new_node = TreeNode(val)
if not root:
return new_node current = root
while True:
if val < current.val:
if current.left is None:
current.left = new_node
break
current = current.left
else:
if current.right is None:
current.right = new_node
break
current = current.right
return root
在这个实现中,我们通过while循环来模拟递归过程,每次都比较新值和当前节点的大小,直到找到一个空子树位置插入新节点。
说到这里,其实大部分的BST插入操作已经讲清楚了。对了,不知道你有没有想过,BST插入操作的时间复杂度是什么?如果树很平衡,那么每次插入都只需要O(log n)的时间;但如果树变得非常不平衡,退化成了链表,最坏情况下可能会达到O(n)。这也是为什么在实际应用中,有些人会选择平衡二叉搜索树(比如AVL树或者红黑树),因为它们能保证插入操作的时间复杂度始终是O(log n)。
不过,回到插入操作上,BST的这种结构很自然地适应了快速查找的需求。你插入的时候,直接按照大小顺序定位位置,节省了大量的查找时间。试想,如果我们使用一个数组来存储所有元素,每次插入都要找到合适的位置并移动数据,那效率得多低呀!
就拿我自己做项目的经验来说,每次处理海量数据时,如果没有这样的树结构做支撑,效率简直是灾难级的。所以,BST在很多场景中其实是非常有用的,尤其是在需要频繁插入、删除、查找的情况下。
总的来说,插入操作看似简单,实际上有不少细节需要关注,不同的实现方式也能带来不同的性能优化。你可能会觉得这操作没啥复杂的,但别小看了这些基础,日后遇到更复杂的数据结构时,熟练掌握这些基本的操作会让你更加得心应手。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。