数据结构前提知识

news2025/1/13 17:41:00

数据结构

数据结构 = 个体的存储+个体关系的存储

算法=对存储数据的操作

程序=数据结构+算法

衡量算法的标准

  1. 时间复杂度:注意不是程序执行的时间,因为一个程序执行的时间取决于软硬件环境,不同的机器,执行的速度不一样,配置好的电脑自然而然速度块,所以时间复杂度是指的程序中的渐进时间复杂度,是指程序中基本语句(执行次数最多的语句)的幂级数(高数的求极限抓大头的思路e_e)

  1. 空间复杂度:算法执行过程中大概占用的辅助空间

  1. 难易程度:主要是应用方面看重

  1. 健壮性(鲁棒性):对于一些非法和意想不到的输入不能直接挂掉,肯定要有对应的措施反应非法输入

数据结构的特点

数据结构是一个程序的关键点,但感觉学了似乎啥也干不了e_e

内存中什么叫做栈?什么叫做堆?

并不是内存中专门分配一块区域叫栈,一块区域叫堆,其实只是分配内存的算法不一样,如果是以出栈压栈的方式为栈内存,如果是以堆排序的方式则为堆内存

程序=数据的存储+数据的操作+可以被程序执行的语言

预备知识

指针:指针是C语言的灵魂所在

地址:地址是内存单元的编号,从0开始的非负整数,范围取决于你的机器是多少位的机器,如果是32位的,则是0~0xFFFF_FFFF(4G-1)

指针:指针就是地址,地址就是指针

指针变量存放的是内存单元地址的变量,存的是一个地址

指针的本质是一个操作受限的非负整数

变量并不一定连续分配,随机分配内存

内存:内存是多字节组成的线性一维存储空间

内存的基本划分单位是字节

每个字节含有8位,每一位是二进制的0或者1

内存和编号是一一对应的,可以理解为内存地址就是一个门牌号,内存就是这个房间软件在运行前需要向操作系统申请存储空间。在软件运行期间,该软件所占空间不再分配给其他软件。当软件运行完毕后,操作系统将回收该内存空间(操作系统并不清空该内存空间中遗留下来的数据)。其实你用指针还能得到原来的数据,它释放只是回收了控制权

Note:

  1. 指针变量也是变量,只是一种特殊的变量类型,普通变量前面不能加*,常量和表达式前面不可以加&(&为取地址,*取值)

  1. 局部变量只能在本函数内部使用

如何通过被调函数修改主调函数中普通变量的值

  1. 实参为相关变量的地址

  1. 形参为以该变量类型的指针变量

  1. 在被调函数中通过 *形参变量名 的形式就可以修改实参的值,因为归根究底改变了实参地址里面的值,毫无疑问,实参会变化

  1. 传参有三种方式,C里面有传值和传地址(通过指针),C++有一种额外的引用传参(就是通过&参数)这里&参数和实参共用一个内存地址

  1. 所有的指针变量都是一个四字节的变量,因为地址是32位的四个字节

结构体

结构体:为什么会有结构体,为了表示一些复杂的数据,而普通的基本数据类型已经无法满足要求,就出现了构造数据类型,结构体是用户根据实际需要自己定义的复合数据类型, 自己定义的数据类型

如何使用结构体:

两种方式:

struct Student st = {1000,"zhangsan",21}; 通过结构体变量名来实现

struct Student *pst = &st; 通过指向结构体变量的指针来实现(强烈推荐)

跨函数使用内存

因为平常用到的内存是静态分配的,一些调用函数执行完之后,该函数的局部变量和内存就被释放了,其他函数无法访问,这里使用C语言的malloc动态内存分配函数,就可以在其他函数里使用到本函数通过malloc分配的内存

这里有一个和C++创建对象一样的思想:

A a = new A();  //A是一个类
A *pa = (A*)malloc(sizeof(A)); 

个人总结

这里学到了以前没有体会到的概念:

数据名就是一个指针常量,它是指向数组的第一个元素的地址

函数名其实也是一个指针常量,它指向函数的地址,函数指针就是这个思想

int a[10] = {1,2,3,4,5,6,7,8,9,10}
int *p = a
int *q =&a  //虽然这里可以看到,&a和a其实都是指的数组的第一个元素,打印出来结果都是第一个元素的地址
//但是二者的偏移是不同的, p =(char *) a+1 

尽管a 和&a的值是一样的,都是数组的首地址,但是类型不一样:

a作为地址是 int *类型的,

&a地址是int (*)[3]类型的,即一个数组指针,加1之后,是加整个数组的长度,即12。

图中的

int *q = &a + 1 等同于 int (*q)[5] = &a + 1

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

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

相关文章

【Unity】P2 基础操作

Unity基础操作移动、旋转与缩放移动方法一:xyz移动方法二:平面移动方法三:直接调整xyz的position三值进行调整旋转方法一:选择旋转按键并旋转方法二:按住CTRL再进行旋转操作,每次15度方法三:通过…

工作中单例模式用法及其使用场景?

前言 最近工作中有这么一个需求,我们系统出单后,需要同步数据到合作方,合作方对数据接收并解析反馈结果文件给我们,根据结果文件状态判断合作方系统是否解析成功,对于失败的单子,需要邮件通知相关负责人。…

微服务实战02-EurekaServer注册中心

EurekaServer ,它扮演的角色是注册中心,用于注册各种微服务,以便于其他微服务找到和访问。 1、Eureka是什么 Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以…

AUTOSAR为啥要开发新的社区商业模式?

总目录链接>> AutoSAR入门和实战系列总目录 文章目录1 自适应平台架构中的集群更新1.1 ara::diag 服务(诊断)更新1.2 信号到服务映射和自动驾驶接口让我们讨论一下信号到服务映射服务:Automated Driving Interface:2 车载应用商店概念本文介绍Re…

【RabbitMQ笔记09】消息队列RabbitMQ之常见方法的使用

这篇文章,主要介绍消息队列RabbitMQ之常见方法的使用。 目录 一、消息队列常见方法 1.1、连接工厂ConnectionFactory 1.2、连接Connection 1.3、通道Channel 1.4、交换机相关方法 (1)exchangeDeclare()声明交换机 1.5、队列相关方法 …

算法训练营 day58 动态规划 判断子序列 不同的子序列

算法训练营 day58 动态规划 判断子序列 不同的子序列 判断子序列 392. 判断子序列 - 力扣(LeetCode) 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而…

03、SVN 建立版本库

SVN 建立版本库1 版本库2 版本库的建立步骤2.1 创建版本库的根目录2.2 创建子目录2.3 通过命令创建版本库2.4 生成目的介绍1 版本库 Subversion 是将文件数据信息保存到版本库中进行管理的Subversion 允许用户对版本库目录进行定制 2 版本库的建立步骤 2.1 创建版本库的根目…

引用数据类型和基本数据类型

1.基本数据类型: byte:字节类型,Java中最小的数据类型,1个字节,取值范围-128~127,默认值0 char:字符型,用于存储单个字符,2个字节,取值范围0~65535&#xf…

Redis使用,AOF、RDB

前言 如果有人问你:"你会把 Redis 用在什么业务场景下?" 我想你大概率会说:"我会把它当作缓存使用,因为它把后端数据库中的数据存储在内存中,然后直接从内存中读取数据,响应速度会非常快。…

“速通“ 老生常谈的HashMap [实现原理源码解读]

👳我亲爱的各位大佬们好😘😘😘 ♨️本篇文章记录的为 HashMap 实现原理&&源码解读 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉&#x1f…

RocketMQ动态增加NameServer

前言 通过HTTP服务来设置NameServer地址,是唯一支持动态增加NameServer的方式,无需重启其它组件 网上搜了下没看到有兄弟们演示这块,所以刚才自己试了试,做个笔记 本文有详细的演示过程 都知道NameServer有4种配置方式&#xff0…

simulink入门指南

系列文章目录 文章目录系列文章目录常用操作技巧项目练习 - 动态系统二阶系统建模比例积分控制燕子俯冲系统建模滤波位操作总结常用操作技巧 画面缩放 空格键 鼠标左键: 拖拽空格键: fit屏幕 信号操作 双击signal可添加标签, 鼠标右键拖拽可给信号添加分支同一分支上的sig…

【并发基础】线程,进程,协程的详细解释

目录 一、什么是进程和线程 1.1 进程是什么呢? 1.2 线程又是什么呢? 1.3 线程和进程之间的关系 操作系统、进程、线程之间的关系图: 进程与线程的模型图: 下面来思考这样一个问题:为什么程序计数器、虚拟机栈和本地方法…

QNX7.1 交叉编译开源库

1.下载QNX7.1 SDK并解压 ITL:~/work/tiqnx710$ ls -l 总用量 16 drwxrwxr-x 4 xxx4096 1月 28 13:38 host -rwxrwxr-x 1 xxx 972 1月 28 13:38 qnxsdp-env.bat -rwxrwxr-x 1 xxx 1676 1月 28 13:38 qnxsdp-env.sh drwxrwxr-x 3 xxx 4096 1月 28 13:38 target xxxITL:~/work/ti…

NetApp SnapCenter 备份管理 ——借助应用程序一致的数据备份管理,简化混合云操作

NetApp SnapCenter 简单、可扩展、赋权:跨 Data Fabric 的企业级数据保护和克隆管理 主要优势 • 利用与应用程序集成的工作流和预定义策略简化备份、恢复和克隆管理。 • 借助基于存储的数据管理功能提高性能和可用性,并缩短测试和开发用时。 • 提供基…

干货 | 浅谈机器人强化学习--从仿真到真机迁移

“对于机器人的运动控制,强化学习是广受关注的方法。本期技术干货,我们邀请到了小米工程师——刘天林,为大家介绍机器人(以足式机器人为主)强化学习中的sim-to-real问题及一些主流方法。”一、前言设计并制造可以灵活运…

【靶机】vulnhub靶机cybox1

Vulnhub靶机Cybox下载地址 Cybox: 1.1 ~ VulnHub 信息搜集 首先进行靶机ip的发现。 sudo arp-scan -l 接着使用nmap扫描开放的端口,这里使用扫描全部端口和详细信息太慢了,分开检测 命令:nmap -p 21,25,80,110,143,443 -sV -A 192.168.174…

CentOS救援模式(Rescue Mode)及紧急模式(Emergency Mode)

当CentOS操作系统崩溃,无法正常启动时,可以通过救援模式或者紧急模式进行系统登录。启动CentOS, 当出现下面界面时,按e进入编辑界面。在编辑界面里,加入参数:systemd.unitrescue.target ,然后Ctrl-X启动进入…

Linux服务器上传文件到阿里云oss对象存储的两种方法ossutil、curl

ossutil支持在Windows、Linux、macOS等系统中运行,您可以根据实际环境下载和安装合适的版本。安装过程中,需要使用解压工具(unzip、7z)解压软件包,请提前安装其中的一个解压工具。yum -y install unzipLinux系统一键安…

正点原子第一期

ZYNQ是一个fpga用来硬件编程,外加一个软件编程 FPGA是可通过编程来修改其逻辑功能的数字集成电路 第三篇语法篇 第七章 verilog HDL语法 Verilog的简介 可编程逻辑电路:允许用户自行修改内部连接的集成电路,其内部的电路结构可以通过编程数…