无敌,击败全网99%的算法学习路线!

目录

一、算法

1、时间复杂度

2、空间复杂度

二、算法学习路线

1、算法学习大纲

2、算法学习视频

3、算法学习书籍

4、算法刷题平台

5、算法代码笔记

6、视频 + pdf 资料


不管是在校招还是社招中,考察算法能力、手写代码能力,这个永远是排在第一位的,必须重视起来,要早早开始学习算法、并且去刷算法。

一、算法

算法:又被叫为算子,是实现一个问题的方法。

算法五大特点:确定性、正确性、有效性、有穷性、有输出;

衡量算法优劣性方法:时间复杂度 + 空间复杂度;

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、牛客网看看,各路大神,各种解决思路,你一定会有进步的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值