两种复杂度都是一种估算,
估算的方式就是根据代码的逻辑,分析出对于复杂度的公式。
在时间复杂度上,主要记录的是带有变量的循环。
比如for (i = 0; i < n; i ++) {...}可理解为O(n)
而 x = n + 1; y = x + 1; z = x + y;虽然是三条语句,但是没有循环操作,所以理解为O(1)
在空间复杂度上,主要记录的是带有变量的空间申请。
比如int[n] x;可以理解为O(n)
而 int x; int y; int z;虽然是三个变量,但是没有变化的申请操作,所以理解为O(1)
大O符号是用于描述函数渐近行为的数学符号。既可以表示无穷大渐近也可以表示
无穷小渐近。看你是用在算法还是描述数学函数估计中的误差项
再来看看我们的插入排序:
当数组是逆序的时候,时间复杂度是O(n*n) 当数组几乎是有序的时候,时间复杂度是O(n)另外插入排序的overhead特别小,可以理解为常数等于1
在实际应用中,常数也是一个很重要的因素。有的算法复杂度低,但是常数较高;再加上数据的特点,有时候反而比不上复杂度更高但是常数低的算法。
在理解插入排序算法的过程中,应该要明白一个算法思想:
把问题分解为子问题 找到问题的初始状态 从问题的初始状态,通过子问题,一步步得到最终的解实际应用中,要灵活的选择算法,有几个重点要考虑的:
复杂度:包括时间复杂度,空间复杂度,常数等 实现复杂度:算法实现起来很难,不易于测试和维护的话,也是很大的问题 适用性:在特定的业务场景下,是否有更合适的算法?总的来说,要具体情况具体分析,在满足业务的同时要简洁的解决问题。
go 生成区间随机数
// 函 数:生成随机数
// 概 要:
// 参 数:
// min: 最小值
// max: 最大值
// 返回值:
// int64: 生成的随机数
func RandInt64(min, max int64) int64 {
if min >= max || min == 0 || max == 0 {
return max
}
return rand.Int63n(max-min) + min
}
参考文章: 【BAT后台入门】第二课:数组与排序
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对易采站长站的支持。









