数据结构笔记(王道408)

news2025/1/12 10:50:16

文章目录

  • 前言
  • 绪论
    • 数据结构基本概念
      • 基本概念
      • 数据结构三要素与ADT
    • 算法基本概念
      • 算法定义
      • 算法五个基本特性
      • 好算法的进阶特性
    • 算法复杂度
      • 时间复杂度
      • 空间复杂度
  • 线性表

前言

数据结构的笔记相比于其他3门,笔记的重要性要低很多,毕竟对于选择408的同学来说,大二时候应该有足够的时间学习,所以基础是比较好的,再加上csdn上一大堆数据结构和算法的帖子,我再重复造轮子也没啥意思了。

所以我这篇文章不打算写的很细节,就是单纯地把思路提纯出来,并附上自己的理解,再搭配思维导图就行了,而不去记录过于细节的知识。

绪论

在这里插入图片描述

408的4门课,构建了计算机的根基。

在这里插入图片描述

计算机处理信息的原理如下:

  1. 现实-计算机。从现实到计算机,需要经过硬件+软件的转化,其中就需要数据结构表示现实事物。
  2. 内部处理。内部处理的过程中,需要高效,因此诞生了各种算法。
  3. 计算机-显示到现实。是步骤1的逆过程。

数据结构基本概念

在这里插入图片描述

基本概念

现实世界有信息,通过数据来承载信息,而数据可以被计算机所处理。

数据的形式可以是数值和非数值,但是底层只能是0和1,这是计算机的数学原理和基础构造决定的。

在这里插入图片描述

  1. 数据项
    • 在C语言中,int,float这些东西,都是最基本的数据单位,就是所谓的数据项
    • 数据项这个概念很矛盾,一边说不可分,但是另一边,有一些特殊的组合项是仍然可分的,比如如果用一个结构体当数据项,那么这个数据项就是组合项。
    • 我们姑且忽略组合项这种东西,就强行把数据项定义为不可分的基本单位就好。
  2. 数据元素
    • 在C语言中就是一个结构体实例,代表着一个具体的个体,比如张三。
  3. 数据对象
    • 同一类(相同性质)数据元素的集合
    • 在C语言中,就是同一个结构体原型实例化后的所有结构体实例的集合
  4. 数据
    • 数据对象的集合,代表了计算机中所有的数据

在这里插入图片描述

概念讲完了,然后就是数据结构的定义了。

数据结构描述了一个数据对象内部,不同的数据元素组合的方式。

数据结构是普遍适用的,因为不关心数据元素内部的数据项,所以凡是数据元素,都可以用数据结构去组织,因此不同的数据对象内部,完全可以适用同一个数据结构去组织。

数据结构三要素与ADT

在这里插入图片描述
数据结构:

  1. 定义:使用者视角
    • 逻辑结构定义。是什么
    • 数据运算定义。可以干什么
  2. 实现:开发者视角,需要考虑储存结构,这会影响到空间效率和时间效率。
    • 顺序,链式。
    • 索引储存。索引表通过key-value方式记录数据地址,给定一个key,可以马上得到地址,进而马上得到储存在内存中的值。优点是速度快,缺点是浪费一个索引表的空间,浪费内存。
      在这里插入图片描述
    • 散列储存。散列储存和索引一样快,但是却不需要借助索引表。散列储存本质上是通过一个映射函数代替索引表,这个函数就是Hash函数,输入一个key,直接输出地址,和索引表效果相同,但是并不占用内存。优点同索引,缺点在于,散列函数并不能100%利用内存空间,和索引储存半斤八两,都会浪费内存。

我们再把视角抬高,你会发现数据结构其实是一种ADT(抽象数据类型)。

数据类型=值的范围+可进行的操作,进而可以细分为原子类型(int,float)和结构类型(struct)
数据结构定义=逻辑结构+可进行的操作,和数据类型本质是一样的,所以把数据结构成为抽象数据类型,说白了,ADT描述了数据结构的逻辑部分,隐藏了实现部分,可以拿来即用。

定义好数据类型或者ADT后,使用者就可以使用,无论是哪种,使用者都可以拿来即用。

在这里插入图片描述

算法基本概念

在这里插入图片描述

算法定义

数据结构是原料,算法是处理步骤。

具体来说,数据结构负责将现实问题装入计算机,而算法就是一系列求解问题的步骤,将计算机中的问题求解出来。

算法五个基本特性

算法其实就是一个可以执行下去(有穷,可行)的函数(输入,确定,输出)

  1. 有穷性。
    • 步骤有穷,时间有穷
    • 程序≠算法,程序可能无穷(死循环)
  2. 确定性。
    • 说白了算法就是一个函数,x确定y就确定
    • 描述不能有歧义,比如最小,如果有两个一样小的,那就要修改成第一个最小的
  3. 可行性。
    • 算法=基本运算有限次组合。其实和有穷性差不多
  4. 输入。
    • 可以为0个
  5. 输出
    • 至少一个,不然没啥用

算法只要求这些,不强求正确,只要是确定的就行。

好算法的进阶特性

  1. 正确。
    • 实用算法的基本要求,算法不一定要求对,但是拿来用一定得对
  2. 可读。
    • 伪代码或者代码+注释
  3. 健壮性。
    • 容错率
  4. 高效率和低储存量需求
    • 时间复杂度低和空间复杂度低

算法复杂度

算法复杂度=时间复杂度+空间复杂度

事后统计(×):评估算法不应该用实际执行时间,因为影响因素太多了,而且有些算法不能事后统计
事前估计(√)

时间复杂度

在这里插入图片描述
T:时间复杂度
n:问题规模

使用渐进记法,只考虑最高阶部分,且系数忽略, T ( n ) = O ( n 3 ) T(n)=O(n^3) T(n)=O(n3)
这个记法代表当n趋于无穷时,T和n是同阶无穷大量,比值为k,这个k是被我们忽略为1的
具体的高阶比较,下图给出直观理解,n的n次方>阶>指>幂>对>常

在这里插入图片描述

具体分析的时候,关键在于要写出基本操作执行次数x的表达式,用n表达x,或者是写出n和x的关系后化简,然后运用复杂度运算规则得到最后的渐进复杂度:

下面这个例子,这个大循环就是要分析的目标,内层循环总共执行n方次,而外层循环是n次,虽然可以一眼看出来是n方,但是还是要写出来表达式后再化简。

在这里插入图片描述
面对复杂问题,应该写出x,变形,化简,得到目标的阶数。

在这里插入图片描述
有的时候,x与具体情况有关,那么就有三种计算方法:

  1. 最好。参考意义不大
  2. 最坏。常用
  3. 平均。常用,这个平均需要写出概率分布,计算期望

在这里插入图片描述

空间复杂度

在这里插入图片描述

S:空间复杂度

S是空间开销与n的关系

内存开销来源:

  1. 变量定义/malloc
  2. 函数调用

递归调用的空间复杂度就有点像循环时候的时间复杂度,有时候也会算一个式子。

在这里插入图片描述

线性表

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

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

相关文章

Python学习笔记之运算符的使用

Python学习笔记之运算符的使用 整型:二进制0b100十进制4、八进制0o100十进制64、十进制100、十六进制0x100十进制256浮点型:123.456,1.23456e2字符串型:‘Hello’,“Hello”布尔型:True、False复数型&…

C++算法 —— 动态规划(8)01背包问题

文章目录 1、动规思路简介2、模版题:01背包第一问第二问优化 3、分割等和子集4、目标和5、最后一块石头的重量Ⅱ 背包问题需要读者先明白动态规划是什么,理解动规的思路,并不能给刚接触动规的人学习。所以最好是看了之前的动规博客&#xff0…

【数据结构】排序(2)—冒泡排序 快速排序

目录 一. 冒泡排序 基本思想 代码实现 时间和空间复杂度 稳定性 二. 快速排序 基本思想 代码实现 hoare法 挖坑法 前后指针法 时间和空间复杂度 稳定性 一. 冒泡排序 基本思想 冒泡排序是一种交换排序。两两比较数组元素,如果是逆序(即排列顺序与排序后…

递归与分治算法(1)--经典递归、分治问题

目录 一、递归问题 1、斐波那契数列 2、汉诺塔问题 3、全排列问题 4、整数划分问题 二、递归式求解 1、代入法 2、递归树法 3、主定理法 三、 分治问题 1、二分搜索 2、大整数乘法 一、递归问题 1、斐波那契数列 斐波那契数列不用过多介绍,斐波那契提出…

行高的继承和消除内外边距

行高的继承性 <style>div {font: 12px/1.5 Microsoft yahei;} ​p {font-size: 14px;}</style> <body><div><p>苏丹红事件</p></div> <body> 12px这里没有行高没有写单位&#xff0c;子类继承父类的1.5倍&#xff0c;就是14*…

AndroidStudio精品插件集

官网 项目地址&#xff1a;Github博客地址&#xff1a;Studio 精品插件推荐 使用需知 所有插件在 Android Studio 2022.3.1.18&#xff08;长颈鹿&#xff09;上测试均没有问题&#xff0c;推荐使用此版本Android Studio 2022.3.1.18&#xff08;长颈鹿&#xff09;正式版下…

Django之十二:模板的继承+用户列表

模板的继承 新建layout.html&#xff1a; {% load static %} <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><link rel"stylesheet" href"{% static plugins…

经典网络架构-ResNet

# 引言 深度残差网络的提出是深度学习领域的里程碑事件&#xff0c;它使得网络可以做大做深&#xff0c;现在主流的网络中都有残差结构 # 问题 - ##深度网络的退化 深度网络有一个普遍的问题&#xff1a;随着网络层数的增加&#xff0c;准确率是先增后减的&#xff0c;准确率增…

十四天学会C++之第二天(函数和库)

1. 函数的定义和调用 在C中&#xff0c;函数是组织和结构化代码的关键工具之一。它们允许您将一段代码封装成一个可重复使用的模块&#xff0c;这有助于提高代码的可读性和维护性。 为什么使用函数&#xff1f; 函数在编程中的作用不可小觑。它们有以下几个重要用途&#xf…

【数据结构---排序】很详细的哦

本篇文章介绍数据结构中的几种排序哦~ 文章目录 前言一、排序是什么&#xff1f;二、排序的分类 1.直接插入排序2.希尔排序3.选择排序4.冒泡排序5.快速排序6.归并排序总结 前言 排序在我们的生活当中无处不在&#xff0c;当然&#xff0c;它在计算机程序当中也是一种很重要的操…

【C语言】青蛙跳台阶 —— 详解

一、问题描述 跳台阶_牛客题霸_牛客网 (nowcoder.com) LCR 127. 跳跃训练 - 力扣&#xff08;LeetCode&#xff09; 二、解题思路 1、当 n 1 时&#xff0c;一共只有一级台阶&#xff0c;那么显然青蛙这时就只有一种跳法 2、当 n 2 时&#xff0c;一共有两级台阶&#xff…

你写过的最蠢的代码是?——前端篇

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

LLVM 插桩 LLVM IR PHI指令

今天在进行 LLVM 插桩时&#xff0c;遇到一个神奇的报错 PHI nodes not grouped at top of basic block!%12 phi i32 [ %.pre, %if.then15 ], [ %argc, %maybe_close_fd_mask.exit ], !dbg !381 label %if.end19 PHI nodes not grouped at top of basic block!%18 phi i32 […

线程的状态与转换,组织与控制

进程和线程分析极其相似。见个人博客&#xff1a;进程的状态与转换以及组织方式 1.线程的状态与转换 2.线程的组织与控制 1.线程控制块&#xff08;TCB&#xff09; 2.线程表

运行中的代码,看不太懂的地方,可以实时查看运行值,以做进一步的判断

运行中的代码&#xff0c;看不太懂的地方&#xff0c;可以实时查看运行值&#xff0c;以做进一步的判断 运行中的代码&#xff0c;看不太懂的地方&#xff0c;可以实时查看运行值&#xff0c;以做进一步的判断 运行中的代码&#xff0c;看不太懂的地方&#xff0c;可以实时查看…

OpenCV 14(角点特征Harris和Shi-Tomasi)

一、角点 角点是图像很重要的特征,对图像图形的理解和分析有很重要的作用。角点在三维场景重建运动估计&#xff0c;目标跟踪、目标识别、图像配准与匹配等计算机视觉领域起着非常重要的作用。在现实世界中&#xff0c;角点对应于物体的拐角&#xff0c;道路的十字路口、丁字路…

机器学习 不均衡数据采样方法:imblearn 库的使用

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

【Hello Linux】多路转接之 epoll

本篇博客介绍&#xff1a; 多路转接之epoll 多路转接之epoll 初识epollepoll相关系统调用epoll的工作原理epoll服务器编写成员变量构造函数 循环函数HandlerEvent函数epoll的优缺点 我们学习epoll分为四部分 快速理解部分概念 快速的看一下部分接口讲解epoll的工作原理手写epo…

找不到msvcr120.dll怎么办?电脑缺失msvcr120.dll的修复方法

msvcr120.dll 是 Microsoft Visual C Redistributable Package 中的一个动态链接库文件&#xff0c;它包含了 C 运行时库的一些功能。这个文件通常与 Visual C 2010 编译器一起使用&#xff0c;用于支持一些大型游戏和应用程序的运行。msvcr120.dll 文件的主要作用是提供 C 语言…

远程代码执行渗透测试—Server2128

远程代码执行渗透测试 任务环境说明&#xff1a; √ 服务器场景&#xff1a;Server2128&#xff08;开放链接&#xff09; √服务器场景操作系统&#xff1a;Windows √服务器用户名&#xff1a;Administrator密码&#xff1a;pssw0rd 1.找出靶机桌面上文件夹1中的文件RCEBac…