学习数据结构和算法的完整路线图🐱🏍👨💻👩💻
您要做的第一个步骤是选择一种编程语言, Java 或C ++ (或者由您自己决定要学习哪种语言)。
🎯 现在,开始学习语言
比如...
📌 基本语法
📌 数据类型
📌 运算符、变量、函数
📌 条件语句、循环
📌 以及最重要的 OOP(面向对象编程)
如果您选择 Java,或者选择C++ 中的STL(标准模板库),请了解Collection 框架。 (或者,您现在可以跳过这一步)。
现在,我可以假设你对你选择的语言已经比较熟悉了。
如果我说每种语言都有自己独特的特性/操作,使它们与其他语言有所不同,对吧?
所以,我的观点是,以这样一种方式学习语言,这样你以后就不会受苦。
假设我在这里以 Java 语言为例。
那么,你应该了解 Java……
- 它是 OOP 还是过程语言?
- 如果是 OOP,那么它是否是完全 OOP?
- 为什么java不支持指针?
- 为什么java是一种独立于平台的语言?
- 它的一些特点!
当你开始学习任何语言时,我都会鼓励你提出这类问题并尝试探索更多。
🎯 现在,你已经学习了这门语言,熟悉了语法和 OPP 概念。现在是时候深入研究 DSA(数据结构和算法)了。
您可能熟悉或不熟悉这个术语DSA,因此,我只是在这里向您简要介绍一下,或者,您也可以在 google baba 中搜索:😀
让我解释一下
数据结构和算法在解决问题(工业问题、现实场景问题等)中起着至关重要的作用。
基本上,DSA 在软件领域非常重要,甚至在现实世界中也是如此。在日常生活中,你可能注意到了,也可能没有注意到,甚至我们对此一无所知……
就像……
例 1:
在你的手机通讯录里,你肯定按名字搜索过一些联系人吧?
说到这里,你有没有想过你的手机显示结果的速度有多快?大概几秒甚至更短,对吧!
为什么搜索速度如此之快,即使我们有超过 200 或 500 个联系人,它也能几秒钟内返回结果,
怎么做到的?
您可能会想,它使用哪种算法或使用哪种数据结构……???
因此,在了解数据结构之前,您应该了解时间和空间复杂度,因为您可以分析您的算法的速度和效率(这是一个非常重要的概念)!
它到底是什么?为什么它如此重要?
所以,渐近符号就派上用场了……在这里,你将学习如何通过降低算法的时间和空间复杂度来提高算法的效率或优化程度。
基本上,这个概念非常非常重要,或者说它是你DSA的基石。
通过这个概念,你将学习到……
两种类型的复杂性:
- 时间
- 空间
符号:
- 大 O 符号(Ο)——大 O 符号专门描述最坏的情况。
- Omega 符号(Ω)——Omega(Ω)符号具体描述了最佳情况。
- Theta 符号 (θ) – 该符号表示算法的平均复杂度。
然后了解
- O(1)
- O(log N)
- O(N log N)
- 在)
- O(N^2)
- O(2^N)
- 在!)
示例:2
假设你在手机上打开了多个网站,比如 1、2、3、4,然后你点击返回,你看到的就意味着网站出现的顺序……
就是这样,对吧!
4 3 2 1(后进先出)就是 Stack 的概念(你将在 DS 中学习)。
例如:3
在日常生活中,大多数人都会使用谷歌地图吧!
你有没有想过,谷歌能多么轻松地找到你指定的位置,并在几秒钟内返回一些结果?
(这里基本上涉及到了图表的概念)
还涉及很多背后的算法和逻辑。
现在您应该知道 DSA 有多么重要了吧!!
所以,不用担心,我们开始吧。学习基本的数据结构。
首先了解一下
数据结构的类型,
它分为线性和非线性两种。
线性DS
- 大批
- 细绳
- 链表
- 堆
- 队列
- 哈希表等等……
非线性
- 树
- 图形
- 堆等…
你可以从这里开始学习这些。
逐个选择那些 DS 并开始学习。
现在,你可以探索或学习 Collection 框架或 STL。
🎯 同时,选择HackerRank、HackerEarth、Leetcode或Codechef平台中的任意一个来解决问题,并测试你对这些主题的理解。我建议你只完成 DSA 中的一个主题,然后尝试解决一些问题(逐个主题地解决)。这样,你将获得更高效的成果来掌握概念!
现在学习一些基础算法……
排序算法
- 冒泡排序
- 选择排序
- 插入排序
- 合并排序
- 快速排序
- 计数排序等...
搜索算法
- 线性搜索 O(N)
- 二分查找 O(log N)
递归 :
(非常清楚地掌握概念)
它是一种函数反复调用自身直到发生基本情况的技术。
回溯:
它本身是一个递归,但这里有一些附加条件,使其更有效率。
回溯是一种算法技术,用于递归地解决问题,通过尝试逐步构建解决方案,一次构建一个解决方案,删除那些在任何时间点(这里的时间是指到达搜索树的任何级别所经过的时间)无法满足问题约束的解决方案。
一些标准问题
- 数独解答问题
- 迷宫中的老鼠
- 组合和、组合和 II、组合和 III
- N皇后问题
贪婪方法:
贪婪算法是一种算法范式,它逐步构建解决方案,始终选择下一个能够带来最明显和最直接效益的部分。因此,选择局部最优也能得到全局解的问题最适合贪婪算法。
例如,考虑分数背包问题。👩🏫
点击此处查看
动态规划:
DP = 递归 + 一些内存
它有两种方法:
- 记忆法(自上而下👇)
- 制表(自下而上☝)
位操作/位掩码:
- 和 (&)
- 或 (|)
- 异或 (^)
- 不是(~)
- 左移 (<<)
- 右移(>>)
一些高级主题:
- 线段树
- 特里斯
- 后缀树,
- 后缀数组,
- 高级图论
现在,是时候尽可能多地解决问题了:)
(熟能生巧)
坚持练习,一开始你会遇到一些难以解决的问题,甚至会通过看到答案来理解其中的逻辑。这些情况很常见,每个人都会遇到。坚持练习,不要放弃。
(只要练习,你就会成为大师😊)
如果您想测试自己或对 CP(竞技编程)感兴趣,请参加比赛,尝试一下。
否则,只要你自己练习而不需要参加比赛,你就足以参加面试了!
一些提示:
- 在解决问题时,如果您最多花费 1 个小时都无法想出解决方案,我建议您将这个问题留下,因为那段时间不需要再花更多时间了!
- 改天或过几天再试试这个问题。如果还是卡住,可以参考一些评论或提示。
- 有一点非常重要,那就是假设你成功解决了一些问题😀。恭喜你,但我还是建议你去讨论一下,看看其他人的解决方案。这样你会更有见地,也能了解不同的方法。
- 假设你遇到无法解决问题的情况,甚至看不到解决方案,你无法思考解决方案中使用的逻辑。所以,不要惊慌,也不要沮丧。只需模拟一下解决方案,这真的很有用(就我个人而言,它帮助很大😊)。
- 如果你仍然觉得这个概念不太清楚,那就试着通过练习把你对这个概念的理解写在纸上!(另外,你也可以参考视频讲座)。
一些免费资源
- 算法第一部分
- 算法第二部分
- Durga 软件 YouTube 频道
- Pepcoding Youtube 频道
- Aditya Verma YouTube频道
- Techdose YouTube 频道
- 科技你前进
- 拉奇·贾恩
- 极客的极客
- 原因代码
- 与哈利一起编码
- 阿普尼·卡克沙
- 简易学习
- 尼索学院
希望对你有帮助😊