数据结构与算法(入门)
数据结构与算法入门
面试经典
判断一个数是否是2的N次方。
解题思路
首先解题先看例子 【比如2 4 8 16 是的】【 6 10 不是的】
应该非常容易 就看这个数是不是可以拆成N个2相乘
最简单的求解 【 n % 2 == 0】
if (num != 1) {
do {
if (num % 2 == 0) {
num = num / 2;
} else {
return false;
}
}
while (num != 1);
}
return true;
优化 首先找更深层的规律 如
1 转 二进制 是 1
2 转 二进制 是 10
4 转 二进制 是 100
8 转 二进制 是 1000
规律 3&4 = 0 7&8 = 0
即 【n & n-1 == 0】
if (num != 1) {
return (num & (num - 1)) == 0;
}
return true;
为什么要学习算法
- 面试会问
- 不要一辈子做curd工程师
- 架构师必学
- 提升自我能力
理论部分
【数据结构】 一个能组在一起的集合对象 如 数组 链表 队列等
【算法】 就是 提供解决问题的思路 如 递归 分至 迭代等
算法特性
五个特征
【有穷性】算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成
【确定性】算法中的每一步都有确定的含义,不会出现二义性
【可行性】算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成
【有输入】 算法具有0个或多个输入
【有输出】算法至少有1个或多个输出
设计原则
【正确性】【可读性】【健壮性】通俗的来讲就是代码很少有bug,而且系统比较稳定
算法效率衡量
**实现算法程序的执行时间可以反应出算法的效率,即算法的优劣。 **
单纯依靠运行的时间来比较算法的优劣并不一定是客观准确的!(就像硬件和操作系统等客观原因会影响)
这时候就可以使用两个度进行衡量
时间复杂度与“大O记法”
【时间复杂度】: 运行一个程序所花费的时间
O() 也叫做大O表示法
通常有 O(1),O(n),O(nlogn),O(n^2),O(n+1),O(logn),O(n!) 分别为常数、对数、平方
最坏时间复杂度
分析算法时 首先要看几种可能
- 算法完成工作最少需要多少基本操作,即【最优时间复杂度】
- 算法完成工作最多需要多少基本操作,即【最坏时间复杂度】
- 算法完成工作平均需要多少基本操作,即【平均时间复杂度】
最优 体现的是最乐观最理想 的情况,所以价值不大
最坏 提供的是一种保证 即最差操作中也能完成操作
平均 属于全面评价 但同时无法保证任何环境都能运行
所以主要关注 【最坏时间复杂度】即可 就是保证无论什么情况都能运行(不出问题)
时间复杂度总结
学了时间复杂度,那我们的目的就是要把代码写到最优,效率最高
O(1)>O(logn)>O(n)>O(nlogn)>O(n2)>O(nx)
优化的目标就是要往O(1)的方向接近。
如何优化
1.找有循环的地方
2.找有网络请求的地方(RPC 远程调用 分布式 数据库请求)
把代码写到最优解
总结
简单的清楚一些基础概念 八股文章
本文来自博客园,作者:火力彬,转载请注明原文链接:https://www.cnblogs.com/ttbb123/p/16131400.html