程序员必须掌握的核心算法有哪些?

由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。

一、算法最最基础

1、时间复杂度

2、空间复杂度

一般最先接触的就是时间复杂度和空间复杂度的学习了,这两个概念以及如何计算,是必须学的,也是必须最先学的,主要有最大复杂度、平均复杂度等,直接通过博客搜索学习即可。

文章推荐:

算法分析神器—时间复杂度

二、基础数据结构

1、线性表

  • 列表(必学)
  • 链表(必学)
  • 跳跃表(知道原理,应用,最后自己实现一遍)
  • 并查集(建议结合刷题学习)

不用说,链表、列表必须,不过重点是链表。

三分钟基础数据结构:如何轻松手写链表?

以后有面试官问你「跳跃表」,你就把这篇文章扔给他

2、栈与队列

  • 栈(必学)
  • 队列(必学)
  • 优先队列、堆(必学)
  • 多级反馈队列(原理与应用)

特别是优先队列,再刷题的时候,还是经常用到的,队列与栈,是最基本的数据结构,必学。可以通过博客来学习。相关文章:

三分钟基础知识:什么是栈?

二叉堆是什么鬼?

【算法与数据结构】堆排序是什么鬼?

3、哈希表(必学)

  • 碰撞解决方法:开放定址法、链地址法、再次哈希法、建立公共溢出区(必学)
  • 布隆过滤器(原理与应用)

哈希表相关的,推荐通过博客来学习,推荐文章:

Hash冲突之开放地址法

4、树

  • 二叉树:各种遍历(递归与非递归)(必学)
  • 哈夫曼树与编码(原理与应用)
  • AVL树(必学)
  • B 树与 B+ 树(原理与应用)
  • 前缀树(原理与应用)
  • 红黑树(原理与应用)
  • 线段树(原理与应用)

树相关是知识还是挺多的,建议看书,可以看《算法第四版》。相关文章:

高频面试题:什么是B树?为啥文件索引要用B树而不用二叉查找树?

【漫画】以后在有面试官问你AVL树,你就把这篇文章扔给他。

腾讯面试题:有了二叉查找树、平衡树为啥还需要红黑树?

【面试被虐】游戏中的敏感词过滤是如何实现的?

5、数组

  • 树状数组
  • 矩阵(必学)

树状数组其实我也没学过,,,,

三、各种常见算法

1、十大排序算法

  • 简单排序:插入排序、选择排序、冒泡排序(必学)
  • 分治排序:快速排序、归并排序(必学,快速排序还要关注中轴的选取方式)
  • 分配排序:桶排序、基数排序
  • 树状排序:堆排序(必学)
  • 其他:计数排序(必学)、希尔排序

对于十大算法的学习,假如你不大懂的话,那么我还是挺推荐你去看书的,因为看了书,你可能不仅仅知道这个算法怎么写,还能知道他是怎么来的。推荐书籍是《算法第四版》,这本书讲的很详细,而且配了很多图演示,还是挺好懂的。

推荐文章:

必学十大经典排序算法,看这篇就够了(附完整代码/动图/优质文章)(修订版)

2、图论算法

  • 图的表示:邻接矩阵和邻接表
  • 遍历算法:深度搜索和广度搜索(必学)
  • 最短路径算法:Floyd,Dijkstra(必学)
  • 最小生成树算法:Prim,Kruskal(必学)
  • 实际常用算法:关键路径、拓扑排序(原理与应用)
  • 二分图匹配:配对、匈牙利算法(原理与应用)
  • 拓展:中心性算法、社区发现算法(原理与应用)

图还是比较难的,不过我觉得图涉及到的挺多算法都是挺实用的,例如最短路径的计算等,图相关的,我这里还是建议看书的,可以看《算法第四版》。

漫画:什么是 “图”?(修订版)

漫画:深度优先遍历 和 广度优先遍历

漫画:图的 “最短路径” 问题

漫画:Dijkstra 算法的优化

漫画:图的 “多源” 最短路径

3、搜索与回溯算法

  • 贪心算法(必学)
  • 启发式搜索算法:A*寻路算法(了解)
  • 地图着色算法、N 皇后问题、最优加工顺序
  • 旅行商问题

这方便的只是都是一些算法相关的,我觉得如果可以,都学一下。像贪心算法的思想,就必须学的了。建议通过刷题来学习,leetcode 直接专题刷。

4、动态规划

  • 树形DP:01背包问题
  • 线性DP:最长公共子序列、最长公共子串
  • 区间DP:矩阵最大值(和以及积)
  • 数位DP:数字游戏
  • 状态压缩DP:旅行商

我觉得动态规划是最难的一个算法思想了,记得当初第一次接触动态规划的时候,是看01背包问题的,看了好久都不大懂,懵懵懂懂,后面懂了基本思想,可是做题下不了手,但是看的懂答案。一气之下,再leetcdoe专题连续刷了几十道,才掌握了动态规划的套路,也有了自己的一套模板。不过说实话,动态规划,是考的真他妈多,学习算法、刷题,一定要掌握。这里建议先了解动态规划是什么,之后 leetcode 专题刷,反正就一般上面这几种题型。后面有时间,我也写一下我学到的套路,有点类似于我之前写的递归那样,算是一种经验。也就是我做题时的模板,不过感觉得写七八个小时,,,,,有时间就写。之前写的递归文章:为什么你学不会递归?告别递归,谈谈我的一些经验

5、字符匹配算法

  • 正则表达式
  • 模式匹配:KMP、Boyer-Moore

我写过两篇字符串匹配的文章,感觉还不错,看了这两篇文章,我觉得你就差不多懂 kmp 和 Boyer-Moore 了。

字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?

更多算法的学习,欢迎关注我的公众号『苦逼的码农

6、流相关算法

  • 最大流:最短增广路、Dinic 算法
  • 最大流最小割:最大收益问题、方格取数问题
  • 最小费用最大流:最小费用路、消遣

这方面的一些算法,我也只了解过一些,感兴趣的可以学习下。

总结

对于上面设计到的算法,我都提供了感觉还不错的文章,建议大家收藏,然后可以利用零碎的时间进行阅读,有些人可能会觉得上面的算法太多,说实话,我觉得不多,特别是对于在校生的,上面涉及到的算法可以不用很懂,但至少得了解。至于书籍的话,如果你连基本数据结构都还不懂的,建议看《数据结构与算法》相关书籍,例如《大话数据结构》、《数据结构与算法分析》。如果你有一定的基础,例如知道链表,栈,队列,那么可以看《算法第四版》,不过这本书是用 Java 实现的,不过我觉得你只要学过 C,那么可以看的懂。

这些算法的学习,虽然你觉得学了没有什么用,但还是那些话,它对你的影响是潜意识的,它可以给你打下很深厚的基础内功,如果你想走的更远,那么我推荐学习,标注必学的,那么我觉得,你是真的需要抽时间来学习下,标注原理与应用的,代表你可以不知道怎么用代码实现,但是必得知道它的实现原理以及应用,更多算法的学习,可以持续关注我的微信公众号勒。

如果你觉得这篇内容对你挺有启发,为了让更多的人看到这篇文章:不妨

1、点赞,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)

2、关注我和专栏,让我们成为长期关系

3、关注公众号「苦逼的码农」,主要写算法、计算机基础之类的文章,里面已有150多篇原创文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UI设计工具比较:Sketch、Adobe XD、墨刀、Mockplus、Axure RP

UI设计工具,分为2个派系。 其中,最大、最主流的派系,是Sketch、Adobe XD、墨刀这个派系。 这个派系的软件,操作方式、思路都非常接近,连常用快捷键都一样,会一个就等于都会了。 在一个无限大的画布上&…

光学字符识别 Tesseract-OCR 的下载、安装和基本用法

OCR:即Optical Character Recognition,光学字符识别,是指检查纸或者图片上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程; Tesseract-OCR:一款由…

界面原型设计工具Balsamiq、墨刀、Axure、Mockplus

Balsamiq的体验 这个基于Adobe AIR Runtime的工具实在是有让人眼前一亮的感觉,手绘风格的元件样式粗犷淋漓,能创建接近于纸上手绘的原型文件。其提供了丰富的手绘风格的web常用元件,包括常用的html控件、以及一些组合控件,如多媒体…

PWN-COMPETITION-HGAME2022-Week3

PWN-COMPETITION-HGAME2022-Week3changeable_noteelder_notesized_notechangeable_note edit_note中的gets函数存在堆溢出漏洞 本题没有leak函数,考虑利用_IO_2_1_stdout泄露libc 参考:好好说话之IO_FILE利用(1):利用…

利用官方支持为基于GitHub Pages的Hexo博客启用HTTPS

2022-01-25 更新:博客新地址:https://www.itbob.cn/,文章距上次编辑时间较远,部分内容可能已经过时! HTTP(超文本传输协议),是一个基于请求与响应,无状态的,应…

标注功能介绍

Mockplus3.5.0.1版本中,新增了标注功能。多种标注模式,智能生成,随时查看。原型设计效率更高。 Mockplus的标注功能有以下四种模式: 1、无选中标注 在未选中任何组件时,按住Ctrl键,鼠标经过某个组件&#…

REVERSE-COMPETITION-HGAME2022-Week3

REVERSE-COMPETITION-HGAME2022-Week3Answers Windowscreakme3hardenedfishmanAnswer’s Windows 含有GUI的程序,ida打开,ShiftF12打开字符串窗口,发现"right"和"wrong" 对"right"查找交叉引用,来…

Python3 爬虫学习笔记 C01 【基本库 urllib 的使用】

Python3 爬虫学习笔记第一章 —— 【基本库 urllib 的使用】文章目录【1.1】 urllib 简介 【1.2】 urllib.request 发送请求【1.2.1】 urllib.request.urlopen() 【1.2.1.1】 基本使用方法【1.2.1.2】 添加参数● data 参数● timeout 参数【1.2.2】 urllib.request.Request()【…

NuGet的简单使用

什么是NuGet? NuGet(读作New Get)是用于微软.NET开发平台的软件包管理器,是一个Visual Studio的扩展。在使用Visual Studio开发基于.NET Framework的应用时,NuGet能够令你在项目中添加、移除和更新引用的工作变得更加…

PWN-COMPETITION-HGAME2022-Week4

PWN-COMPETITION-HGAME2022-Week4vectorvector c写的pwn,实现了vector,没有edit功能,新增了move功能 add或move时,如果输入的下标大于vector的size,vector会进行resize扩容 旧vector占用的chunk自动被free掉进入相应的…

Python3 爬虫学习笔记 C02 【基本库 requests 的使用】

Python3 爬虫学习笔记第二章 —— 【基本库 requests 的使用】文章目录【2.1】 requests 简介【2.2】 requests 基本用法 【2.3】 requests 构建 GET 请求 【2.3.1】 基本用法【2.3.2】 二进制数据抓取 【2.3.3】 添加 headers【2.4】 requests 构建 POST 请求 【2.5】 request…

REVERSE-COMPETITION-HGAME2022-Week4

REVERSE-COMPETITION-HGAME2022-Week4( WOW )serverezvmhardasm( WOW ) 32位exe,ida打开 观察伪代码逻辑,上面的红框中,输入经过加密,密文放入Buf2中,然后Buf2和已知的密文res比较 比较完,打印"win&q…

VB编程语言简史

Visual Basic从1991年诞生以来,现在已经13年了。BASIC是微软的起家产品,微软当然不忘了这位功臣。随着每一次微软技术的浪潮,Visual Basic都会随之获得新生。可以预见,将来无论微软又发明了什么技术或平台,Visual Basi…

Python3 爬虫学习笔记 C03 【Ajax 数据爬取】

Python3 爬虫学习笔记第三章 —— 【Ajax 数据爬取】文章目录【3.1】Ajax 简介 【3.2】解析真实地址提取【3.1】Ajax 简介 Ajax — Asynchronous Javascript And XML(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。可…

详解Bootstrap glyphicons-halflings-regular.woff2 Not found

看了好几个关于Bootstrap glyphicons-halflings-regular.woff2 Not found,的博主写的,他们都没有具体的细节。 首先,出现这个问题的原因是,没有将具体的包引用完整 直接看我遇到的问题吧,我要使用这个包,…

Python3 爬虫学习笔记 C04 【自动化测试工具 Selenium】

Python3 爬虫学习笔记第四章 —— 【自动化测试工具 Selenium】文章目录【4.1】下载驱动 【4.2】声明浏览器对象 【4.3】访问页面 【4.4】启动参数 【4.5】查找节点 【4.5.1】查找单个节点 【4.5.2】查找多个节点【4.6】节点交互 【4.7】动作链 【4.8】执行 JavaScript 【4.9】…

REVERSE-COMPETITION-HWS-5TH-2022

REVERSE-COMPETITION-HWS-5TH-2022re1re2re3re1 64位exe,ida打开,来到main函数 输入的长度应为32,输入经过TEA加密,密文与已知的cipher进行比较 进入TEA函数,发现是魔改TEA,需一次性传入8个unsigned int&…

Selenium 显式等待条件及其含义

等待条件含义title_is标题是某内容title_contains标题包含某内容presence_of_element_located节点加载出,传入定位元组,如 (By.ID, ‘p’)visibility_of_element_located节点可见,传入定位元组visibility_of可见,传入节点对象pres…

终于找到了:NuGet 修改包路径

NuGet 是 .NET 平台下的一个免费、开源的包管理开发工具。 修改全局包管理目录 通过 NuGet 安装包时,NuGet 先将包下载至一个统一的目录,默认路径是:C:Users用户名.nugetpackages 下载的包多了以后,会导致 C 盘空间被大量占用。…

REVERSE-COMPETITION-DSCTF-2022

REVERSE-COMPETITION-DSCTF-2022catchmeFFunctionnothingbad_applefantastic_cpucatchme 安卓逆向,java层传递输入,调用native层的check方法 ida打开.so文件,没有直接找到check方法,JNI_OnLoad也看不出什么 Findcrypt查到AES的S盒…