数据结构简述,时间、空间复杂度,学习网站推荐

目录

[IT 学习路线](#IT 学习路线)

相关坚韧大厚书

相关有趣/耐看书或视频

数据结构与算法学习网站推荐

刷题

时间、空间复杂度

数据结构简述

基本概念


数据结构与算法简述和CS综述整理。本文非基础的教程,本文会列出大量学习和参考网站。老惯例,一个文章是一个集大成(本文借助了语音输入(PC 版 讯飞输入法)由此加速码字,但仍保持简洁的文风)。

数据结构 + 算法 = 程序。数据结构:现实问题的符合计算机存储的建模;算法:解决现实问题的步骤(符合有穷性,确定性,可行性等)。


IT 学习路线

  1. C语言基础(看书、B站等均可) →

  2. C语言三剑客:《C和指针》、《C陷阱与缺陷》和《C专家编程》,经典永流传 →

  3. 数据结构与算法(线性表/树/图/哈希 + 排序/搜索/规划等等等 按需学) →

  4. 计算机专业学科看。《计算机组成原理》/《计算机体系结构》;《计算机操作系统》/《现代操作系统》/《深入理解计算机系统》;可选《编译原理》、《深入分析GCC》;网络协议如《计算机网络》、《TCP-IP详解卷一/卷二/卷三》等 →

  5. 可选 《CPU自制入门》 →

  6. 走向:嵌入式 Linux 方向、FPGA / 芯片设计 / 验证方向、具体某算法方向(如 CV、ML、DL)等等。

更多可详细参考 rd2coding/Road2Coding: 编程之路 (github.com) 的总结,比较全面了。

相关坚韧大厚书

没给出链接的 网搜名字即可。

  • 哪本《数据结构与算法》最好? - 知乎 (zhihu.com) 该回答列举了一些不错的数据结构与算法方面的书籍。

  • 《算法导论》(经典)是计算机学科的算法入门书。

  • 《计算机体系结构》(经典),《计算机操作系统》/《现代操作系统》/《深入理解计算机系统》。

  • 《编码的奥秘》,相关介绍/推荐 想练习《编码的奥秘》里面的知识,有什么软件有帮助? - 知乎 (zhihu.com)。《编译原理》(经典),《深入分析GCC》。

  • 网络协议如《计算机网络》、《TCP-IP详解卷一/卷二/卷三》,想深入了解 HTTP 协议,有哪些值得推荐的书籍? - 知乎 (zhihu.com)

  • 嵌入式应用相关:《GNU Make》,《Debugging with GDB》,《Linux 高级程序开发》,《POSIX 多线程程序设计》,《嵌入式Linux基础教程》,《嵌入式Linxu应用开发完全手册》,《嵌入式Linxu应用程序开发详解》。

  • 嵌入式底层相关:内核相关:《深入理解Linux内核》,《Linux内核源代码情景分析》,《Linux内核设计与实现》;驱动相关:《Linux设备驱动程序》,《Linux设备驱动开发详解》,《Linux驱动开发入门与实践》。

相关有趣/耐看书或视频


数据结构与算法学习网站推荐

刷题


时间、空间复杂度

时间复杂度表示一个算法内执行语句的数量在最坏的情况下随着循环次数 n 的增加而增长的数量级。一个算法内语句的使用次数(频度)表示为 f(n),n 为算法内循环语句的循环数,n 的变化直接改变 整个算法的语句使用次数;时间复杂度 O(g(n)) 的定义为,对于一个算法,当且仅当存在正整数 c 和 n0,使得 f(n) ≤ cg(n) 对于所有 n ≥ n0 成立,则该算法的渐进时间复杂度为 f(n) = O(g(n)),g(n) 为 n 的函数。

各个时间复杂度的语句频度的增长速度比较:O(log_2(n)) < O(n) < O(n*log_2(n)) < O(n^2) < O(n^3) < O(2^n) < O(n!),前三个很好,最后两个不可接受,剩余的强差人意。

程序的执行时间不仅依赖于问题规模,还可能随着数据的状态不同而变化,即其时间复杂度会变化,一般评价算法时候取最坏的情况的时间复杂度。

空间复杂度大同小异。

数据结构简述

一个软件项目,数据结构设计的好,后面进行功能实现时候的调用、修改和查询会特别方便,可以达到事半功倍的效果。

基本概念

数据结构几大类

  • 线性表:

    • 顺序(数组),

    • 链式(链表(单链表、双向链表、循环链表(单向、双向),静态链表(借助数组实现))),

    • 特殊(栈(FILO)、队列/堆(FIFO))。

  • 树:二叉树、红黑树等。

  • 图:无向图、有向图等。

  • 索引/散列:Maps、Hash Table。

按照关系划分

  • 按照逻辑关系(元素的连接关系):

    集合,线性(数组、栈、队列/堆、链表等),树状(一对多),图状(多对多)。

  • 按照存储关系:

    • 顺序存储:如数组,要提前申请空间(静态分配(编译时进行)或动态分配(malloc & free))。优点:物理位置连续而紧凑,可 随机 / 直接 存取;缺点:会产生内存碎片,增、删改动时前后要跟着变(需要移动大量元素)。

    • 链式存储:如链表、树、图,要提前申请空间(动态分配(malloc & free))。优点:链式、离散、节点化,空间可动态分配,改动方便(改节点的指向);缺点:空间占用大,查找不便(需要遍历整个链表)。

    • 索引存储:"索引-数据"(Key-Value,也叫 Maps) 的结构形式。Java、C++ 中为"map,Python 中为 dictionary。

    • 散列存储:如哈希表(Hash Table)等。

数据运算

  • 每个基本数据结构要实现的基本操作:增(插入)、删(删除)、改(更新)、查(检索),判(判空,判满)、排(排序)、复(复位)。

  • 更复杂的操作可用以上基本操作实现。

操作的时间复杂度

具体概念在 "C & MCU编写规范和其他" 一文的 "时间、空间复杂度" 一节有提到。(数据结构)十分钟搞定时间复杂度(算法的时间复杂度) - 简书 (jianshu.com)一套图 搞懂"时间复杂度"_ 12 26 25 的博客-CSDN博客 _时间复杂度

  • 查找:顺序存储结构 O(1),单链表 O(n)。

  • 插入和删除:顺序存储结构 O(n),单链表 O(1)。

相关推荐
Hello_Embed2 小时前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件
咸甜适中3 小时前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust
Grassto3 小时前
RAG 从入门到放弃?丐版 demo 实战笔记(go+python)
笔记
Magnetic_h4 小时前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
风中的微尘4 小时前
39.网络流入门
开发语言·网络·c++·算法
研梦非凡4 小时前
ICCV 2025|从粗到细:用于高效3D高斯溅射的可学习离散小波变换
人工智能·深度学习·学习·3d
西红柿维生素5 小时前
JVM相关总结
java·jvm·算法
limengshi1383925 小时前
机器学习面试:请介绍几种常用的学习率衰减方式
人工智能·学习·机器学习
知识分享小能手6 小时前
React学习教程,从入门到精通,React 组件核心语法知识点详解(类组件体系)(19)
前端·javascript·vue.js·学习·react.js·react·anti-design-vue
周周记笔记7 小时前
学习笔记:第一个Python程序
笔记·学习