在各行各业都疯狂内卷的当下,我们需要不断的扎实基础和学习新东西,来保证自己的竞争力。数据结构与算法可以说是所有编程语言的基础,学好它不仅让我们可以写出更健壮、更高效、更稳定的代码,还可以在面试时,有更优异的表现。
数据结构与算法的学习并非枯燥无味,它有着独特的魅力。
数据结构与算法的魅力
如题:如何判断一个数是否是2的N次方
用一般的逻辑来写,就是用循环除以2,到最后看是否余1,代码如下,我们计算出时间复杂度为O(n)
while(n>1){
if(n%2==0){
n = n/2;
}else{
System.out.println("不是2的N次方");
break;
}
}
if(n==1){
System.out.println("是2的N次方");
}
但是了解数据结构与算法,我们其实可以有更优解。分析一下,2的N次方也就是我们要判断的数n有什么特点?
转化为二进制,如下:
再对比n-1的数据二进制:
发现n与n-1二进制刚好互补,从而想到可以使用按位与"&"运算:
10&01=00
100&011=000
1000&0111=0000
...
即:n&(n-1)==0的数即为2的N次方数!
这样一改变,一段while循环,时间复杂度是O(n)的代码,神奇的优化成了一行事件复杂度是O(1)的代码!
这就是数据结构与算法的魅力!可以让你写出性能更高,更牛逼的代码
算法的相关概念
五大特征
有穷性:有限的步骤之内正常结束,不能形成无限循环
确定性:算法中的每一个步骤都必须有确定的含义
可行性:算法的每一步必须都是可行的
有输入:有多个或0个输入
有输出:至少有1个或多个输出
设计原则
正确性:应能正确的解决某个问题,得到正确的答案或预期的结果
可读性:便于他人阅读和理解,其所要解决的问题和想要达到的目的
健壮性:当输入的数据非法时,算法应当恰当地做出反应或进行相应处理,而不是莫名其妙的输出结果。并且处理出错的方法不应是中断程序的执行,而应是返回一个表示错误或错误性质的值,以便于在更高的抽象层次上进行处理。
高效率与低存储
时间复杂度:运行一个程序所花费的时间,用O()表示
按效率从高到低:O(1) > O(logn) > O(n) > nO(logn) > O(n^2) > O(n^x)