力扣 二叉树的锯齿形层序遍历-103

二叉树的锯齿形层序遍历-103

此题就是再二叉树层序遍历的基础上,加了反转当前层数组元素的函数reverse(),也可以不反转,直接在遍历当前层的所有节点的for循环里直接进行if判断,根据遍历方向,决定如何插入元素。

class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {//二叉树的层序遍历vector<vector<int>> res;// 二维数组用来存储每层节点if(root == nullptr) return res;queue<TreeNode*> que;// 队列用来进行层序遍历que.push(root);// 将第一层的根节点加入队列中bool flag = true;//标记,用来标记每层的遍历方向while(!que.empty()){vector<int>vec;// 用于存储当前层的所有节点int n = que.size();// 当前层的节点个数for(int i=0;i<n;i++)//遍历当前层的所有节点{TreeNode* node = que.front();//将队列当前节点存下来que.pop();//将当前节点弹出队列//*************************************************************// 根据遍历方向,决定如何插入元素 // if (flag) {//     vec.push_back(node->val);  // 从左到右时,顺序插入// } else {//     vec.insert(vec.begin(), node->val);  // 从右到左时,将元素插入到开头// }//*************************************************************vec.push_back(node->val);//将存下来的当前节点if(node->left)que.push(node->left);//如果当前节点有左节点,加入队列if(node->right)que.push(node->right);//如果当前节点有右节点,加入队列}if(!flag)reverse(vec.begin(),vec.end());//翻转当前层数组中的元素res.push_back(vec);//将当前层的节点值加入结果flag = !flag;//反转遍历方向}return res;}
};

每日问题

什么是内存对齐?为什么需要内存对齐?

什么是内存对齐?

内存对齐(Memory Alignment) 是指计算机系统中数据存储的方式,要求数据按照特定的边界(通常是数据类型的大小)存储在内存中。也就是说,数据在内存中的地址应该是其大小的整数倍。

内存对齐的基本概念:
  • 例如,32位的整数(int)通常需要存储在4字节边界上,也就是说,int 类型的变量地址应该是4的倍数。如果将一个32位整数存储在一个不是4的倍数的地址上,就会违反内存对齐规则。
  • 相应地,64位的长整型(long long)通常需要存储在8字节边界上,因此它的地址应该是8的倍数。

内存对齐的规则通常依赖于机器架构和编译器。例如,在x86和ARM架构中,内存对齐是非常重要的,因为CPU对未对齐的访问可能会导致效率下降或者运行时错误。

为什么需要内存对齐?

内存对齐的主要原因有以下几点:

1.提高访问效率:

        在现代CPU中,数据通常通过总线进行传输。如果数据在内存中不按照特定的边界对齐,CPU可能需要进行额外的操作来访问数据,导致访问速度变慢。例如,某些CPU只能在字边界上高效访问数据。如果数据没有按照字边界对齐,CPU就必须进行多次内存读取,增加了访问的时间。

2.硬件限制:

        某些硬件平台(尤其是一些较旧的或嵌入式的处理器)要求内存对齐,否则会导致硬件错误。例如,一些处理器对于不对齐的访问会抛出异常或者产生未定义的行为。

3.内存访问的优化:

        现代处理器通常有内存缓存(cache),并且内存访问往往是按块进行的。数据对齐可以确保处理器能够一次性加载一个内存块,这样可以减少内存访问次数,从而提高性能。

4.节省内存:

        通过合理的内存对齐,编译器可以优化数据结构布局,尽量减少内存浪费。比如,在结构体(struct)中,编译器会通过插入填充字节(padding)来确保成员变量的对齐,从而使得每个变量能够尽可能高效地访问。

内存对齐的例子

假设我们有一个结构体 struct,包含多个不同大小的数据类型。我们来看一个简单的例子:

struct Example {char c;      // 1字节int i;       // 4字节
};
未对齐的布局:

在某些编译器中,char 类型的 c 会被存储在起始地址,紧接着 int 类型的 i 会被存储在接下来的内存位置,但由于 int 通常需要 4 字节对齐,编译器会插入一些填充字节(padding)来使 i 的地址是 4 的倍数。这种布局可能是这样的:

| char (1 byte) | padding (3 bytes) | int (4 bytes) |

总共需要 8 字节来存储这个结构体。

对齐后的布局:

为了确保内存对齐,int 类型的数据必须按照 4 字节边界存储。编译器会在 char 和 int 之间插入填充字节,使得 int 从 4 字节的地址开始:

| char (1 byte) | padding (3 bytes) | int (4 bytes) |

结果是,整个结构体占用 8 字节,其中 3 个字节是为了对齐 int 而插入的填充字节。

内存对齐的影响

1.性能:

        对齐能够提高程序的内存访问效率,减少由于跨越多个内存区域(非对齐数据)导致的访问开销。

2.内存浪费:

        为了保证内存对齐,结构体或数组中可能会插入一些填充字节。这些填充字节虽然没有被实际使用,但会导致内存浪费。例如,在一个包含多个不同类型字段的结构体中,可能会出现一些无用的内存占用。

内存对齐的处理

不同的编译器和平台可能对内存对齐的要求有所不同,但大多数现代编译器都会自动处理内存对齐问题。你也可以通过编译器提供的相关指令来控制内存对齐。例如,使用 #pragma pack 或 __attribute__((packed)) 等指令来改变结构体的对齐方式。

示例:在GCC中使用 __attribute__((packed))

struct __attribute__((packed)) Example {char c;int i;
};

使用 __attribute__((packed)) 可以告诉编译器不要插入填充字节,这样可以减少内存的占用,但会牺牲性能(因为这可能会导致不对齐的访问)。

总结

  • 内存对齐是指将数据存储在内存中的地址遵循一定的对齐规则,使得数据存储在内存的边界上,这通常是数据类型大小的整数倍。
  • 为什么需要内存对齐:内存对齐提高了数据访问的效率,避免了硬件故障,并确保数据访问的性能。
  • 内存对齐的影响:虽然内存对齐可以提高性能,但有时可能会浪费内存,特别是在结构体中需要插入填充字节时。

通过合理利用内存对齐,可以有效提升程序的执行效率并减少内存访问的时间开销。

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

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

相关文章

多级缓存设计实践

缓存是什么&#xff1f; 缓存技术是一种用于加速数据访问的优化策略。它通过将频繁访问的数据存储在高速存储介质&#xff08;如内存&#xff09;中&#xff0c;减少对慢速存储设备&#xff08;如硬盘或远程服务器&#xff09;的访问次数&#xff0c;从而提升系统的响应速度和…

Linux网络编程之---多线程实现并发服务器

下面我们来使用tcp集合多线程实现并发服务器 一.服务端 #include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <pthread.h>typedef struct sockinfo {char ip[16];unsigne…

Web API基本认知

作用和分类 作用&#xff1a;就是使用JS去操作html和浏览器 分类&#xff1a;DOM&#xff08;文档对象模型&#xff09;、BOM&#xff08;浏览器对象模型&#xff09; 什么是DOM DOM&#xff08;Document Object Model ——文档对象模型&#xff09;是用来呈现以及与任意 HTM…

《Python基础》之Numpy库

目录 简介 一、创建数组 1、根据列表创建数组 2、创建全0数组 3、创建全1数组 4、创建单位矩阵 5、创建随机数数组 二、查看数组的属性 三、 数组的操作 1、索引和切片 2、变形 3、拼接 &#xff08;1&#xff09;、vstack() 纵向拼接 &#xff08;2&#xff09;、hs…

人工智能-卷积神经网络(学习向)

一.概述&#xff1b; 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种专门用于处理具有类似网格结构的数据&#xff08;如图像&#xff09;的深度学习模型。 主要用于处理机器视觉任务。 主要功能&#xff1b; 1.图像分类 2.目标检测 3.图像分割…

思维导图+实现一个登录窗口界面

QQ2024122-205851 import sys from PyQt6.QtGui import QIcon, QPixmap, QMovie from PyQt6.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton, QLabel, QVBoxLayout# 封装我的窗口类 class LoginWidget(QWidget):# 构造函数def __init__(self):# 初始化父类su…

使用 Pytorch 构建 Vanilla GAN

文章目录 一、说明二、什么是 GAN&#xff1f;三、使用 PyTorch 的简单 GAN&#xff08;完整解释的代码示例&#xff09;3.1 配置变量3.2 、PyTorch 加速3.3 构建生成器3.4 构建鉴别器 四、准备数据集五、初始化函数六、前向和后向传递七、执行训练步骤八、结果 一、说明 使用…

Windows常用DOS指令(附案例)

文章目录 1.dir 查看当前目录2.cd 进入指定目录3.md 创建指定目录4.cd> 创建指定文件5.rd 删除指定空目录6.del 删除指定文件7.copy 复制文件8.xcopy 批量复制9.ren 改名10.type 在命令行空窗口打开文件11.cls 清空DOS命令窗口12.chkdsk 检查磁盘使用情况13.time 显示和设置…

【Maven】Nexus私服

6. Maven的私服 6.1 什么是私服 Maven 私服是一种特殊的远程仓库&#xff0c;它是架设在局域网内的仓库服务&#xff0c;用来代理位于外部的远程仓库&#xff08;中央仓库、其他远程公共仓库&#xff09;。一些无法从外部仓库下载到的构件&#xff0c;如项目组其他人员开发的…

【CSS】小球旋转loading加载动画

效果 css小球旋转loading动画 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document<…

Web day07 项目实战

目录 Restful风格&#xff1a; 代码结构&#xff1a; 1). Controller层 2). Service层 3). Mapper&#xff08;dao&#xff09;层 4).yml文件&#xff1a; 数据封装&#xff1a; 1). 手动结果映射 2). 起别名 3). 开启驼峰命名(推荐) 删除部门&#xff1a; 新增部门&a…

rest-assured multiPart上传中文名称文件,文件名乱码

rest-assured是一个基于java语言的REST API测试框架&#xff0c;在使用rest-assured的multipart 上传文件后&#xff0c;后端获取的文件名称乱码。截图如下&#xff1a; 原因是rest-assured multipart/form-data默认的编码格式是US-ASCII&#xff0c;需要设置为UTF-8。 Befo…

【Git操作】-- 将已存在的项目复制一份到另一个分组空间下

目录 1、需求描述 2、操作步骤 2.1 配置 2.2、git 上创建新项目 2.3 添加到旧的项目中 2.3、将新项目添加到待复制的项目上 3、Push an existing Git repository 4、浏览器打开新项目 nn_bigdata 5、其他&#xff1a;如果项目已经拉取到本地&#xff0c;那么可以使用以…

搭建环境-PHP简介及环境搭建教程

搭建环境-PHP简介及环境搭建教程 前言 在现代Web开发中,PHP是一种广泛使用的服务器端脚本语言,它以简洁、高效和跨平台的特性受到开发者的青睐。无论是小型网站还是大型企业应用,PHP都能提供强大的支持。本文将为您详细介绍PHP的基本概念、特点,以及如何搭建PHP开发环境。…

Python中通过点运算符来访问命名空间中参数args方法

Python中通过点运算符来访问命名空间中参数args方法 在Python中&#xff0c;在使用args进行参数传入时&#xff0c;通常是调用argparse模块的ArgumentParser来创建对象。这种设计虽然使得访问命令行参数更加方便&#xff0c;可以通过点运算符来访问命名空间中的参数。但是当封装…

Unity类银河战士恶魔城学习总结(P156 Audio Settings音频设置)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了音频的大小设置与保存加载 音频管理器 UI_VolumeSlider.cs 定义了 UI_VolumeSlider 类&#xff0c;用于处理与音频设置相关的…

基于单片机的WIFI、语音、储存、时钟、闹钟、定位系统

所有仿真详情导航&#xff1a; PROTEUS专栏说明-CSDN博客 目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DS1302时钟模块&#xff0c;通过LCD1602显示实时时间&#xff0c;也可以储存时间在AT2DC02中&#xff0c…

贪心算法专题(四)

目录 1. 单调递增的数字 1.1 算法原理 1.2 算法代码 2. 坏了的计算器 2.1 算法原理 2.2 算法代码 3. 合并区间 3.1 算法原理 3.2 算法代码 4. 无重叠区间 4.1 算法原理 4.2 算法代码 5. 用最少数量的箭引爆气球 5.1 算法原理 ​5.2 算法代码 1. 单调递增的数字…

Creating Server TCP listening socket *:6379: bind: No error

启动redis报错&#xff1a;Creating Server TCP listening socket *:6379: bind: No error 解决方案&#xff1a; 1、直接在命令行中输入 redis-cli.exe 2、输入shutdown&#xff0c;关闭 3、输exit&#xff0c;退出 4、重新输入 redis-server.exe redis.windows.conf&…

【HM-React】02. React基础-下

React表单控制 受控绑定 概念&#xff1a;使用React组件的状态&#xff08;useState&#xff09;控制表单的状态 function App(){const [value, setValue] useState()return (<input type"text" value{value} onChange{e > setValue(e.target.value)}/>) …