数据结构前提知识

news/2024/3/29 1:55:19/文章来源:https://blog.csdn.net/qq_43460068/article/details/129271192

数据结构

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

算法=对存储数据的操作

程序=数据结构+算法

衡量算法的标准

  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.luyixian.cn/news_show_75724.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CVPR 2023 接收结果出炉!再创历史新高!录用2360篇!(附10篇最新论文)

点击下方卡片,关注“CVer”公众号AI/CV重磅干货,第一时间送达点击进入—>【计算机视觉】微信技术交流群2023 年 2 月 28 日凌晨,CVPR 2023 顶会论文接收结果出炉!这次没有先放出论文 ID List,而是直接 email 通知作…

最好的 QML 教程,让你的代码飞起来!

想必大家都知道,亮哥一直深耕于 CSDN,坚持了好很多年,目前为止,原创已经 500 多篇了,一路走来相当不易。当然了,中间有段时间比较忙,没怎么更新。就拿 QML 来说,最早的一篇文章还是 …

Linux内核崩溃 dump调试

内核-crash(崩溃),oops消息,dump oops (也称 panic),称程序运行崩溃,程序崩溃后会产生oops消息。 应用程序或内核线程的崩溃都会产生oops消息,通常发生oops时,系统不会发生死机&a…

中文预训练大模型—文心Ernie技术原理

文心Ernie技术原理 一、背景技术 Ernie是基于Bert模型进行改进,基本模型是Transformer,Bert完成的预训练任务是:完形填空(通过基本语言单元掩码);上下句预测。 Bert模型的缺陷是:只能捕获局部…

【Spark分布式内存计算框架——Spark Streaming】9. 获取偏移量 应用案例:百度搜索风云榜(上)

4.4 获取偏移量 当SparkStreaming集成Kafka时,无论是Old Consumer API中Direct方式还是New Consumer API方式获取的数据,每批次的数据封装在KafkaRDD中,其中包含每条数据的元数据信息。 文档:http://spark.apache.org/docs/2.4.…

Linux系统介绍及熟悉Linux基础操作

一、什么是Liunx Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯本纳第克特托瓦兹(Linus Benedict Torvalds)于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发&am…

【图像处理】数字图像处理基础(分辨率,像素,显示...)

Table of Contents1.数字图像处理基础1.1 图像表示1.1.1 图像成像模型1.1.2 数字图像的表示a.图像采样b.图像灰度的量化c.算比特数1.2 分辨率1.2.1 空间分辨率1.2.2 灰度分辨率1.3 像素间的关系1.3.1 像素邻域a.4邻域b.4对角邻域c.8邻域1.3.2 像素邻接1.3.3 像素连通1.3.4 像素…

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

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

【Leedcode】栈和队列必备的面试题(第二期)

【Leedcode】栈和队列必备的面试题(第二期) 文章目录【Leedcode】栈和队列必备的面试题(第二期)一、题目(用两个队列实现栈)二、思路图解1.定义两个队列2.初始化两个队列3.往两个队列中放入数据4.两个队列出…

对账平台设计

背景 随着公司业务的蓬勃发展,交易履约清结算业务的复杂性也在不断的增高,资金以及各种数据的一致性和准确性也变得越发重要。 以交易链路为例,存在着如下一些潜在的不一致场景: 订单支付成功了,但是订单状态却还是“…

JVM方法区详解有这篇就够了

1、方法区在哪里《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于HotSpotJVM而言,方法区还有一个别名叫做Non-Heap(非堆&#xff09…

机械键盘不只有轴体的区别!键帽高度也有些学问

键盘键帽的学问有很多,上篇文章中,笔者和大家聊了键帽的材质和耐油污的问题。 除此之外,键帽的高度和字符的印刷方式也有不同,对于多数机械键盘来说,会发现每一列键帽的倾斜角度都略有不同,使用起来可以减少…

Android TV UI开发常用知识

导入依赖 Google官方为Android TV的UI开发提供了一系列的规范组件,在leanback的依赖库中,这里介绍一些常用的组件,使用前需要导入leanback库。 implementation androidx.leanback:leanback:$version常用的页面 这些Fragment有设计好的样式&…

3.ffmpeg命令行环境搭建、ffmpeg命令行初步了解

在上章,我们讲过: ffmpeg.exe: 主要用于转码或者剪切的应用程序, 也可以从url/现场音频/视频源抓取输入源ffplay.exe: 主要用于播放视频的应用程序,该应用程序源码是开源的,我们后面章节会去源码分析ffprobe.exe: 主要用于分析视频码流的应用程序, 可以获取媒体文件的详细信息,…

【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Data Factory】系列。 接上文【Azure 架构师学习笔记】-Azure Data Factory (3)-触发器详解-翻转窗口 前言 事件触发指的是存储事件,所以在新版的ADF 中,已经明确了是“存储事件”,…

【C语言】结构体进阶

一、结构体 1. 结构体的声明 (1) 结构的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。(2)结构的声明 struct tag {member-list; }variable-list;例如描述一个学生&#x…

【SPSS】两配对样本T检验分析详细操作教程(附案例实战)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

RocketMQ的一些使用理解

1.RocketMQ的生产者生产负载策略(3种) (1)SelectMessageQueueByHash (一致性hash) (2)SelectMessageQueueByMachineRoom (机器随机) (3)SelectMessageQueueByRandom (随机) 第1种一…

VBA之正则表达式(41)-- 快速标记两个星号之后的字符

实例需求:工作表中的数据保存在A列~G列,现需要识别D列中包含超过两个星号的内容,并将第3个星号及其之后的字符设置为红色字体,如图所示。 示例代码如下。 Sub Demo1()Dim objRegExp As ObjectDim objMatch As ObjectDim strMatch…

08 自研or借力(上):集成Gin替换已有核心

我们的框架和这些顶级的框架相比,差了什么呢?如何才能快速地把我们的框架可用性,和这些框架提升到同一个级别?我们做这个框架除了演示每个实现细节,它的优势是什么呢? 不妨带着这些问题,把我们…