概述
infoq的arts打卡学习,贯彻左耳朵耗子的学习理念,活到老学到老,每天都精进一点,日拱一卒无有悔,功不唐捐终如海
一、Algorithm 一道算法题
最近工作使用算法场景较少,基本上是基于数据统计对系统进行优化,因此结合工作的算法暂时没有,最近在学习go,就用go来写一些经典算法吧,再配上单元测试,加深对go的理解
二分查找法go的实现,接收两个参数:有序数组arr和待查找的值target。通过循环迭代的方式,在每次迭代中更新查找范围的起点和终点,直到找到待查找的值或者确认查找范围为空。若找到待查找的值,则返回它在数组中的索引位置;若未找到,则返回-1。
// 二分查找法
func BinarySearch(arr []int, target int) int {
start := 0
end := len(arr) - 1
for start <= end {
mid := (start + end) / 2
if arr[mid] == target {
return mid
}
if arr[mid] > target {
end = mid - 1
} else {
start = mid + 1
}
}
return -1
}
单元测试
func TestBinarySearch(t *testing.T) {
Convey("二分查找法", t, func() {
// 找到的情况
arr := []int{1,3,4,5,7,9,10}
res := BinarySearch(arr, 10)
So(res, ShouldEqual, 6)
// 找不到的情况
res = BinarySearch(arr, 11)
So(res, ShouldEqual, -1)
// 数组不是有序数组
arr = []int{1,3,4,20,7,9,10}
res = BinarySearch(arr, 10)
So(res, ShouldEqual, -1)
})
}
二、Review 读一篇英文文章
英语每日一读, 微信公众号 - 「夏说英文晨读」或「友邻优课app」,最近时事,每天一遍,跟读录音review,感觉挺好
三、Technique/Tips 分享一个小技术
在高并发场景下,使用提前计算代替实时计算,带来非常大的性能提升
场景: 寻址系统 - 在一堆服务器中为设备选出最优(连接数最少、负载最低)一台,让设备与服务器保持长连接。
现状:初始时,只有几台服务器,每一个请求来的时候都会实时计算几台服务器的得分,然后取最优。随着时间的推移,服务器数量增加至几百台,几千台,每一次实时计算都会取数据,存在大量io操作,消耗非常多资源
优化:每10秒钟计算一次服务器的负载得分,并将其写入排行榜中,在寻址取出时,则取前三然后在3个中取最优,这样只需要3次网络io就取得了最优解,大大地减少了服务器资源的占用
四、Share 分享一个观点
家庭沟通有时候是情绪沟通。最近因小孩入学的事,与老婆在观点上有碰撞冲突,与其说她在问我意见,不如说是走一个过场,让我遵循她的意愿。然而我没有读懂这层意思。
小儿子准备3岁,要去读幼儿园了,幼儿园有小、中、大班,今年新增了托班,托班比小班人数少5个,学费贵500一个学期,课程差不多。我的想法是让他读小班,而爱人呢却想让他读托班。理由是托班人数少,老师更重视能得到更好的教育,有启智课程更好开发大脑发育。我则说选小班:小班学费低,里面的小孩都是普通家庭小孩,没有那么娇气;启智课程是个噱头,没有什么实质性的教学;小班的小孩年龄相对偏大些,相比托班更优秀;看起来托班更好,实则是幸存者偏差,未必没有虚荣心在其中作怪。
观点分歧一度陷入僵局,气氛充满单方面的火药味,我一直用平静的语气,然而内心却一直感受着他生气的情绪,无法平静心里焦灼,我想如果我们能坐下来,理性地做个竞品分析,结果可能就一目了然了。搞得大家都不开心,我感觉内心也愧疚,感觉应该让步但是好像让步了就是小孩的损失。
最后还是她想通了:托班升到中班之后就要被拆散,到时候又得换老师了,对小孩不好。于是选择了小班。其实换一个角度思考,想要说服一个人,得要站在他所关注的重点出发,才能更好的让对方认可接受