本文来源公众号“算法进阶”,仅用于学术分享,侵权删,干货满满。
原文链接:一文归纳常用数据结构与算法
一、 前言
程序员,也就是"通过编码操作数据容器构建起数字世界的总工程师",从这角度看,数据结构及算法是构建虚拟世界的一系列基础的元件及方法。
平时工程中,虽然都有大量现成“轮子”可以用,但学习数据结构和算法的重要性也是毋庸置疑的:
-
可以提升逻辑思维能力:数据结构和算法蕴含着经典的抽象化问题、解决问题的思路,有利于锻炼逻辑思维。
-
可以提高编码质量:利于建立时间复杂度、空间复杂度意识,写出高质量的代码,能够设计基础架构,提升编程技能。
-
面试必备:大厂很注重考察数据结构与算法这类基础知识。相比短期能力,他们更看中你的长期潜力。特别是对于校招的项目经验不足的童鞋。
我们学习数据结构和算法,可以了解它特性、适用的场景以及它能解决的问题。结合面试及工作需要,以下总结了最常用的、最基础数据结构与算法思想:
-
数据结构:数组、链表、栈、队列、散列表、二叉树、Trie 树、堆、跳表、图
-
算法思想:递归、贪心算法、分治算法、回溯算法、动态规划
二、 基础概念
2.1 复杂度分析
关于数据结构与算法,首先要掌握一个核心概念:复杂度分析。
数据结构和算法解决的是如何更省、更快地存储和处理数据的问题,因此我们就需要一个考量数据结构与算法时间、空间复杂度的方法--大 O 复杂度表示法。常见的复杂度量级从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n2 ):
大 O 时间复杂度全称渐进时间复杂度(asymptotic time complexity),实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模(n)增长的变化趋势。同样的,空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示代码执行的存储空间与数据规模(n)之间的增长关系。
-
常见数据结构操作的复杂度:
-
常见排序算法执行的复杂度:
2.2 常用的数据结构与算法概览
通过下图,首先可以对数据结构和算法有个全面的认识。
三 数据结构
主要有线性表、树、图等,数据结构的操作主要有:增删改查以及随机访问
3.1 线性表与基础操作
数据结构的核心操作主要包括增删改查及随机访问,其典型代表包括线性表(如数组、链表)、树、图等。
数组
数组是最基础、最简单的数据结构,其特点在于:
-
存储方式:使用一块连续内存空间存储相同类型的数据。
-
优势:支持随机访问,时间复杂度为 (O(1))。
-
劣势:插入和删除操作需要移动大量元素,平均时间复杂度为 (O(n))。
链表
链表通过指针将零散的内存块串联,形成动态数据结构:
-
存储方式:每个节点存储数据及指向下一节点的指针。
-
优势:插入和删除操作高效,时间复杂度为 (O(1))(若已定位节点)。
-
劣势:不支持随机访问,查询时间复杂度为 (O(n))。
数组 vs 链表:
-
数组适合随机访问频繁的场景(如静态数据查询)。
-
链表适合插入、删除频繁的场景(如动态数据操作)。
实际开发中需根据性能需求综合选择。
栈
栈是一种操作受限的线性表,遵循后进先出(LI