前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【灵魂 |数据结构与算法】 数据结构必备经法(开山篇),一起修炼算法经法!

【灵魂 |数据结构与算法】 数据结构必备经法(开山篇),一起修炼算法经法!

作者头像
计算机魔术师
发布于 2023-12-05 07:55:51
发布于 2023-12-05 07:55:51
1940
举报
文章被收录于专栏:计算机魔术师计算机魔术师

🤵‍♂️ 个人主页: @AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱‍🏍 🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)

该文章收录专栏 [✨— 《深入解析机器学习:从原理到应用的全面指南》 —✨

数据结构必备经法

目标

学习数据结构与算法的理由

  1. 大厂面试

比如 BAT、Google、Facebook,面试的时候都喜欢考算法、让人现场写代码。公司只能考察他们的基础知识是否牢固。社招就更不用说了,越是厉害的公司,越是注重考察数据结构与算法这类基础知识。相比短期能力,他们更看中你的长期潜力。

  1. 业务开发性能优化

对于大部分业务开发来说,我们平时可能更多的是利用已经封装好的现成的接口、类库来堆砌、翻译业务逻辑,很少需要自己实现数据结构和算法。但是,不需要自己实现,并不代表什么都不需要了解。

如果不知道这些类库背后的原理,不懂得时间、空间复杂度分析,如何能用好、用对它们?存储某个业务数据的时候,你如何知道应该用 ArrayList,还是 Linked List 呢?调用了某个函数之后,你又该如何评估代码的性能和资源的消耗呢?

作为业务开发,我们会用到各种框架、中间件和底层系统,比如 Spring、RPC 框架、消息中间件、Redis 等等。在这些基础框架中,一般都揉和了很多基础数据结构和算法的设计思想。比如,我们常用的 Key-Value 数据库 Redis 中,里面的有序集合是用什么数据结构来实现的呢?为什么要用跳表来实现呢?为什么不用二叉树呢?

如果你能弄明白这些底层原理,你就能更好地使用它们。即便出现问题,也很容易就能定位。因此,掌握数据结构和算法,不管对于阅读框架源码,还是理解其背后的设计思想,都是非常有用的。

而在面对新的问题或者业务场景中,也能够设计更好的方案来解决问题

在平时的工作中,数据结构和算法的应用到处可见。我来举一个你非常熟悉的例子:如何实时地统计业务接口的 99% 响应时间? 你可能最先想到,每次查询时,从小到大排序所有的响应时间,如果总共有 1200 个数据,那第 1188 个数据就是 99% 的响应时间。很显然,每次用这个方法查询的话都要排序,效率是非常低的。但是,如果你知道“堆”这个数据结构,用两个堆可以非常高效地解决这个问题。

  1. 提升代码水平(个人能力!)

达到开源水平的代码能力,高手之间的竞争其实就在细节。这些细节包括:你用的算法是不是够优化,数据存取的效率是不是够高,内存是不是够节省等等。这些累积起来,决定了一个框架是不是优秀。

何为编程能力强?代码的可读性好、健壮、还是扩展性好等等,其中性能好坏起码是其中一个非常重要的评判标准。而对代码的时间复杂度、空间复杂度分析才能写出高性能的代码

如果你在一家成熟的公司,或者 BAT 这样的大公司,面对的是千万级甚至亿级的用户,开发的是 TB、PB 级别数据的处理系统。性能几乎是开发过程中时刻都要考虑的问题。一个简单的 ArrayList、Linked List 的选择问题,就可能会产生成千上万倍的性能差别。这个时候,数据结构和算法的意义就完全凸显出来了。之前你可能需要费很大劲儿来优化的代码,需要花很多心思来设计的架构,用了数据结构和算法之后,很容易就可以解决了。

掌握了数据结构与算法,你看待问题的深度,解决问题的角度就会完全不一样。因为这样的你,就像是站在巨人的肩膀上,拿着生存利器行走世界。数据结构与算法,会为你的编程之路,甚至人生之路打开一扇通往新世界的大门。

核心数据结构与算法

核心学习数据结构与算法

10 个数据结构:数组、链表、栈、队列(线性表)、散列表、二叉树、堆、跳表、图、Trie树

10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法

对于每一种数据结构或算法学习它的**“来历”“自身的特点”“适合解决的问题”以及“实际的应用场景”**,千万不要被动地记忆,要多辩证地思考,多问为什么。如果你一直这么坚持做,你会发现,等你学完之后,写代码的时候就会不由自主地考虑到很多性能方面的事情,时间复杂度、空间复杂度非常高的垃圾代码出现的次数就会越来越少。你的编程内功就真正得到了修炼。

时间复杂度&空间复杂度分析

事后统计分析: 把代码跑一遍,通过统计、监控,就能得到算法执行的时间和占用的内存大小。(局限性大)

大O复杂度表示法:体现整体算法随着规模增大的趋势表现,也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度。

  1. 只关注循环最多的一段 代码
  2. 加法原则:取量级最大的复杂度
  3. 乘法原则:取量级结果最大的

分为两类,多项式量级非多项式量级。其中,非多项式量级只有两个:O(2^n) 和 O(n!)。 当数据规模 n 越来越大时,非多项式量级算法的执行时间会急剧增加,求解问题的执行时间会无限增长。所以,非多项式时间复杂度的算法其实是非常低效的算法。

空间复杂度分析:时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系。类比一下,空间复杂度全称就是渐进空间复杂度(asymptotic spacecomplexity),表示算法的存储空间与数据规模之间的增长关系。

查看循环最多的变量生成的一段代码

常见的复杂度并不多,从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n )。几乎都是这些

其中还有四种复杂度分析方法 最好情况时间复杂度(best case timecomplexity)、最坏情况时间复杂度(worst case time complexity)、平均情况时间复杂度(average case time complexity)、均摊时间复杂度(amortized time complexity)。 平均则是引入概率论,均摊则是平摊思想

  1. 数组和字符串:
    • 数组操作(插入、删除、查找等)

    前缀和算法 :

    1. 寻找数组的中心索引 (左边之和等于右边)(前缀和)

    排序:

    1. 搜索插入位置(查找相同值或插值) (二分查找)
    2. 合并区间 (排序 + 二维数组)

    十大排序

    • 字符串操作(反转、查找、匹配等)
    • 双指针技巧(快慢指针、滑动窗口等)
  2. 链表:
    • 单链表和双链表的基本操作
    • 快慢指针技巧在链表中的应用
    • 链表反转、环检测等问题
  3. 栈和队列:
    • 栈和队列的基本操作(入栈、出栈、入队、出队等)
    • 用栈解决的问题(括号匹配、逆波兰表达式等)
    • 用队列解决的问题(广度优先搜索等)
  4. 哈希表:
    • 哈希表的原理和实现
    • 哈希函数的设计和冲突解决方法
    • 哈希表在查找和去重等问题中的应用
  5. 树与图:
    • 二叉树的遍历(前序、中序、后序)
    • 二叉搜索树的性质和操作
    • 堆和优先队列的基本概念和应用
    • 图的表示方法和遍历算法(深度优先搜索、广度优先搜索)
  6. 排序和搜索:
    • 常见排序算法(冒泡排序、插入排序、快速排序等)
    • 高级排序算法(归并排序、堆排序等)
    • 二分查找和其他搜索算法的实现和应用
  7. 动态规划:
    • 动态规划的基本概念和解题思路
    • 斐波那契数列和背包问题等经典动态规划案例
    • 动态规划的优化技巧和常见变种
  8. 贪心算法:
    • 贪心算法的基本思想和适用条件
    • 贪心算法的经典案例(任务调度、区间覆盖等)
    • 贪心算法与动态规划的比较和区别
  9. 图算法:
    • 最短路径算法(Dijkstra算法、Bellman-Ford算法等)
    • 最小生成树算法(Prim算法、Kruskal算法等)
    • 拓扑排序和关键路径等问题
  10. 高级数据结构:
    • 并查集的原理和应用
    • 字典树和前缀树的基本操作和应用
    • 线段树和树状数组的实现和应用
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据结构和算法
10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
分母为零
2019/12/04
5770
前端应该如何准备数据结构和算法?
据我了解,前端程序员有相当一部分不是科班出身,以至于对“数据结构”和“算法”的基础概念都不是很清晰,这直接导致很多人在看到有关这部分的内容就会望而却步。
ConardLi
2019/08/21
1K0
前端应该如何准备数据结构和算法?
02 复杂度分析_pythoner学习数据结构与算法系列
设计算法时,时间复杂度要比空间复杂度更容易出问题,所以一般情况一下我们只对时间复杂度进行研究。一般面试或者工作的时候没有特别说明的话,复杂度就是指时间复杂度。
诡途
2020/10/16
5500
02 复杂度分析_pythoner学习数据结构与算法系列
数据结构与算法笔记
数据结构与算法,是大学中计算机相关专业里的一门必修的基础课,当时学习的时候并不能列其中的知识点,毕业之后随着对计算机专业知识的了解加深,才意识到其重要性,今天我就来研究一番。
希里安
2023/10/30
2130
数据结构与算法笔记
聊聊数据结构和算法
其实笔者也是一样的,因为算法这个东西,平常真的实操的并不多,但是它又是面试必须问的知识点。因为它是程序员的基础知识。
35岁程序员那些事
2022/09/23
4160
数据结构与算法之美读书笔记
栈是一种操作受限的数据结构,只支持入栈和出栈操作。后进先出是它最大的特点。(特定的数据结构是对特定场景的抽象)
_春华秋实
2023/08/28
2950
算法笔记汇总精简版下载_算法与数据结构笔记
10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树; 10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态 规划、字符串匹配算法。
全栈程序员站长
2022/09/20
9450
为啥学习数据结构和算法
基础知识就像是一座大楼的地基,它决定了我们的技术高度。而要想快速做出点事情,前提条件一定是基础能力过硬,“内功”要到位。
acc8226
2022/05/17
1710
Java面试考点4之数据结构
复杂度是衡量算法好坏的标准之一,我们需要掌握计算算法时间复杂度和空间复杂度的方法。计算时间复杂度的方法一般是找到执行次数最多的语句,然后计算语句执行次数的数量级,最后用大写 O 来表示结果。
马拉松程序员
2022/04/26
4580
Java面试考点4之数据结构
技术面试要了解的算法和数据结构知识
目录 在线练习 在线编程面试 数据结构 算法 贪心算法 位运算 复杂度分析 视频教程 面试宝典 计算机科学资讯 文件结构 在线练习 LeetCode Virtual Judge CareerCup HackerRank CodeFights Kattis HackerEarth Codility Code Forces Code Chef Sphere Online Judge – SPOJ 在线编程面试 Gainlo Refdash 数据结构 链表 链表
Albert陈凯
2018/04/04
1.3K0
技术面试要了解的算法和数据结构知识
常用的算法和数据结构 面试_数据结构与算法面试题80道
定义:最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。
全栈程序员站长
2022/09/23
7990
常用的算法和数据结构 面试_数据结构与算法面试题80道
【地铁上的面试题】--基础部分--数据结构与算法--动态规划和贪心算法
动态规划是一种解决多阶段决策问题的算法思想,它通过将问题划分为若干个子问题,并保存子问题的解来求解原问题的方法。动态规划的特点包括以下几个方面:
喵叔
2023/07/09
4480
01数据结构与算法总览_pythoner学习数据结构与算法系列
可以简单理解为: 当一个一维的链表的分叉有两个的时候, 它就变成了一个二维的数据结构,相当于树结构
诡途
2020/10/16
4100
01数据结构与算法总览_pythoner学习数据结构与算法系列
常见的算法分类方式
算法分类是一个广泛的主题,因为存在许多不同类型的算法,它们各自服务于不同的目的和领域。然而,以下是一些常见的算法分类方式:
jack.yang
2025/04/05
870
程序员必须掌握的算法有哪些?谈谈这这几年学过的算法
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。
帅地
2019/10/23
3.6K0
数据结构考研面试被问的问题_考研程序设计与数据结构
1. 顺序存储结构 ——把数据元素存放在地址连续的存储单元中,其数据间的逻辑关系和物理关系是一致的。
全栈程序员站长
2022/11/04
6820
数据结构考研面试被问的问题_考研程序设计与数据结构
数据结构与算法学习笔记
本文是王争老师的《算法与数据结构之美》的学习笔记,详细内容请看王争的专栏 。有不懂的地方指出来,我做修改。
全栈程序员站长
2022/07/23
7230
数据结构与算法学习笔记
重学前端(四)-数据结构与算法
最近在撸vue 和react的源码,虽然晦涩难懂,但是却发现新大陆,发现了数据结构和算法在前端的重要性,比如在react中,发现react的fiber树,对应的实际上是一个叫链表的数据结构,我们es6中新出的Map的数据结构其实就是对应字典的数据结构而Set对应的就是集合的数据结构,他是一个无序且唯一的数据结构。而在vue 中也是大量的用到栈和队列的数据结构,于是,遍寻资料,学习一番,记录如下,如有错误,请大佬指点!
用户7413032
2020/12/07
5760
数据结构与算法之基本概念
数据结构与算法是程序员内功体现的重要标准之一,且数据结构也应用在各个方面,业界更有程序=数据结构+算法这个等式存在。各个中间件开发者,架构师他们都在努力的优化中间件、项目结构以及算法提高运行效率和降低内存占用,在这里数据结构起到相当重要的作用。此外数据结构也蕴含一些面向对象的思想,故学好掌握数据结构对逻辑思维处理抽象能力有很大提升。
bigsai
2021/01/05
3590
一位算法工程师的自我修养
数据结构与算法 基本算法思想 动态规划 贪心算法 回溯算法 分治算法 枚举算法 算法基础 时间复杂度 空间复杂度 最大复杂度 平均复杂度 基础数据结构 数组 动态数组 树状数组 矩阵 栈与队列 栈 队列 阻塞队列 并发队列 双端队列 优先队列 堆 多级反馈队列 线性表 顺序表 链表 单链表 双向链表 循环链表 双向循环链表 跳跃表 并查集 哈希表(散列表) 散列函数 碰撞解决办法: 开放地址法 链地址法 再次哈希法 建立公共溢出区 布隆过滤器 位图 动态扩容 树 二叉树: 各种遍历,递归与非递归 二
攻城狮Chova
2022/01/22
4770
推荐阅读
相关推荐
数据结构和算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档