在各行各业都疯狂内卷的当下,我们需要不断的扎实基础和学习新东西,来保证自己的竞争力。数据结构与算法可以说是所有编程语言的基础,学好它不仅让我们可以写出更健壮、更高效、更稳定的代码,还可以在面试时,有更优异的表现。

数据结构与算法的学习并非枯燥无味,它有着独特的魅力。

数据结构与算法的魅力

如题:如何判断一个数是否是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)

空间复杂度:运行程序所需要的内存,用OOM表示
03-05 19:56