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

2023-11-14

目录

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)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • [Pytorch系列-29]:神经网络基础 - 全连接浅层神经网络实现10分类手写数字识别

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 120607797 目录 前言 深度学习
  • Redis部署——主从备份(一)

    1 简单方式 利用Docker完成Redis主从备份 1 先搭建reids master实例 docker run d name redis master p 6379 6379 redis 4 0 9 2 在搭建redis slave实例
  • 代码随想录算法训练营day10

    Leetcode232 用栈实现队列 链接 232 用栈实现队列 力扣 LeetCode 首先大家要知道 队列的模式是先进先出 如下图所示 来自代码随想录 如图所示 这是就是我们题目要求的用两个栈实现队列 我们可以用第一个栈来储存当前队列出
  • Vue Element UI 之富文本图片上传服务器 + 图片地址插入富文本

    vue版本 vue cli3 插件 vue quill editor 插件增强模块 quill image extend module quill image extend module功能 提供图片上传到服j务器的功能 复制插入 显示上传
  • [xenclient 使用小结] [xen] vhdpartx的作用。

    对于硬盘映像vhd的操作 主要是用vhd utils 但是在 usr sbin 目录下 还发现一个 vhdpartx 的工具 看名字似乎和分区有关 但是又没说明 试着运行下 结果也没有任何的输出 貌似也没有任何的影响 网上也找不到任何的描述
  • Spring和mybatis整合

    一 Spring整合MyBatis 1 导入pom依赖 1 1 添加spring相关依赖 5 0 2 RELEASE spring core spring beans spring context spring orm spring tx
  • 管好【SD-WEBUI】中大量的模型:名称+预览图+备注+分组管理

    文章目录 零 前言 一 模型管理 1 1 模型名称 文件名 1 2 模型缩略图 1 3 模型备注文字 1 4 模型分组 子目录 1 5 模型详细信息 二 第二部分 三 第三部分 零 前言 本篇主要讲怎么管理大量的模型 比如模型不要大幅改名
  • 使用Struts2的JSON插件来实现JSON数据传递

    想要实现此功能第一步需要Struts2的核心架包 第二步需要struts2 json plugin 2 3 30架包 在lib文件夹下可以找到 还是借用上次的笔记 来继续写 这个时候我们就不需要用到Servlet了 要使用到Action 配
  • 自学python入门要买什么书?

    文章目录 1 Python编程 从入门到实践 2 Python编程快速上手 让繁琐工作自动化 3 Python基础教程 第3版 4 Python核心编程 第3版 5 Python 3网络爬虫开发实战 6 Python神经网络编程 自学pyt
  • g++编译详解

    g 编译详解 资料准备 为了方便演示和讲解 在这里提前准备好几个简单的文件 test cpp test h main cpp 文件内容如下 main cpp include test h int main int argc char arg
  • 华为OD机试 - 组装新的数组(Java)

    题目描述 给你一个整数M和数组N N中的元素为连续整数 要求根据N中的元素组装成新的数组R 组装规则 R中元素总和加起来等于M R中的元素可以从N中重复选取 R中的元素最多只能有1个不在N中 且比N中的数字都要小 不能为负数 输入描述 第一
  • php常用插件

    初衷 以下总结了一些开发中发现以及用到的比较好用的扩展 会不断地进行更新 如果有好的扩展推荐 也可以留言我会及时补充上 方便自己和大家使用 更新说明 2019年11月11日更新 添加 php 文件加密扩展 2019年10月28日更新 添加
  • 联邦EMNIST数据集 (FEMNIST)

    文章目录 Introduction NIST Special Database 19 Modified NIST MNIST Extended MNIST EMNIST Federated Extended MNIST FEMNIST fe
  • 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。

    消息 6522 级别 16 状态 2 第 2 行 在执行用户定义例程或聚合 AESDecrypt 期间出现 NET Framework 错误 System FormatException 输入的不是有效的 Base 64 字符串 因为它包含
  • 多方安全计算-隐私信息检索(PIR)

    隐私信息检索 Private Information Retrieval PIR 技术是由Chor B等提出解决保护用户查询隐私的方案 主要目的是 保证查询用户在向服务器上的数据库提交查询请求 在用户查询隐私信息不被泄漏的条件下完成查询 即
  • Java之缓冲流、转换流、节点流、包装流

    文章目录 一 BufferedRead 带有缓冲的字符输入流 1 节点流和包装流 2 readline 读一行字符 二 转换流 InputStreamReader与OutputStreamWriter 三 BufferedWrite 带有缓
  • 编译原理实验二:Bison

    编译原理实验二 Bison 实验要求 1 了解Bision基础知识 如何将文法产生式转换为Bison语句 2 阅读 src common SyntaxTree c 对应头文件 include SyntaxTree h 理解分析树生成的过程
  • 你对C++头文件了解多少?——盘点C++的常用头文件

    相信大家在编写C C 程序时 最必不可少的部分之一就是头文件了 然而 由于不同的函数所对应的头文件各不相同 就导致一部分人 尤其是我 写代码的时候常常遇到忘记所需头文件的窘境 为了解决这个问题 今天我特意搜集了C 中常用的头文件及其包含的库
  • FICO F.27 Customer statement 打印

    需求 定制化打印 替换标准的F 27打印 类似于采购订单的打印 但是略有不同 查阅资料之后步骤如下 T code F 27 is SAP standard program to produce customer vendor corresp
  • 数据结构简述,时间、空间复杂度,学习网站推荐

    目录 IT 学习路线 相关坚韧大厚书 相关有趣 耐看书或视频 数据结构与算法学习网站推荐 刷题 时间 空间复杂度 数据结构简述 基本概念 数据结构与算法简述和CS综述整理 本文非基础的教程 本文会列出大量学习和参考网站 老惯例 一个文章是一