目录
不管是在校招还是社招中,考察算法能力、手写代码能力,这个永远是排在第一位的,必须重视起来,要早早开始学习算法、并且去刷算法。
一、算法
算法:又被叫为算子,是实现一个问题的方法。
算法五大特点:确定性、正确性、有效性、有穷性、有输出;
衡量算法优劣性方法:时间复杂度 + 空间复杂度;
1、时间复杂度
是问题规模与完成该问题所需要的基础操作步骤数量的函数关系(不是指运行多少时间,一般指的是最差情况下的时间复杂度)
例:数组 array 长度为 count,在其中查找值为 key 元素的下标。
1#define NOT_FOUND -1
2
3int findKey(int *array, int count, int key) {
4 int index = 0;
5
6 while(index < count && array[index] != key) {
7 index++;
8 }
9
10 return index >= count ? NOT_FOUND : index;
11}
核心分析:
上面这个例子查找算法的基础操作是:array[index] != key。
总比较次数:1 + 2 + 3 + ... + n = (1+n)/2
总查找次数:n
那么,每一次查找所比较的次数是:
((1 + n) * n / 2) / n = (1 + n) / 2
n 表示数据规模,那么这个查询算法的时间复杂度是 O((1 + n) / 2);当 n 趋于无穷大时,那么:O((1 + n) / 2) <==> O(n),等价关系,即该查找算法时间复杂度为 O(n)。
一定要明确时间复杂度的计算方式,以及自己会评估算法的时间复杂度,是算法基础功,这个知识点在面试中必问,一定要掌握(常见面试问题:二分查找)。
2、空间复杂度
任务规模与实现该任务所需要的辅助存储空间大小之间的函数关系;
例:数组 array 长度为 count,实现该数组的逆序。
1void reverseArray(int *array, int count) {
2 int i;
3 int *tmp;
4
5 tmp = (int *)malloc(sizeof(int), count);
6 for (i = count-1; i >= 0; i--) {
7 tmp[i-count+1] = array[i];
8 }
9 for (i = 0; i < count; i++) {
10 array[i] = tmp[i];
11 }
12
13 free(tmp);
14}
核心分析:
上面这个例子逆转数组的基础操作是:
tmp = (int *)malloc(sizeof(int), count);
申请了跟原先数组一样大的辅助空间,即空间复杂度为:O(n);串行遍历了数组 2 次,这个时间复杂度为:O(2n);
二、算法学习路线
1、算法学习大纲
2、算法学习视频
3、算法学习书籍
4、算法刷题平台
5、算法代码笔记
-
个人github整理此pdf:
-
https://github.com/puge-up/computer-basics
-
6、视频 + pdf 资料
学习路线、视频、书籍、代码笔记,我都已经推荐过了,对于小白的话,建议先看看视频,理解理解,多听听别人思路,看看是怎么解题的,初步阶段,一定要选择简单的、自己能很快理解的去学习,由浅入深,慢慢的给自己信心。
算法的学习,别人帮不了你多少,主要还是的靠自己悟,靠自己花时间去理解,师傅领进门,修行在个人,算法讨论,思路分享,去leetcode、牛客网看看,各路大神,各种解决思路,你一定会有进步的。