堆和栈的区别
数据结构中的堆和栈
栈:是一种可以实现“先进后出”的存储结构。操作仅限于栈的顶部。常应用于实现递归功能方面的场景
堆:是一种经过排序的完全二叉树。其中,节点是从左到右填满的,并且最后一层的树叶都在最左边;每个节点的值都小于(或者都大于)其子节点的值。因为堆有序的特点,一般用来做数组中的排序,称为堆排序。
内存分配中的堆和栈
分配方式
栈:由编译器自动分配和释放的,处于相对较高的地址,其栈地址是向下增长的。
堆:由程序员手动完成申请和释放,地址是向上增长的。
存储内容
栈:主要用于存放函数的参数与局部变量等
堆:具体存储内容由程序员根据需要决定存储数据
生存周期
栈:其生存周期也只在函数的运行过程中,在运行后就释放,并不可以再次访问
堆:动态内存的整个生存期是由程序员自己决定的,使用非常灵活。但必须及时释放它,否则将会导致运行的程序出现内存泄漏等错误。
分配效率
栈:栈内存分配运算内置于处理器的指令集中,它的效率一般很高
堆:由函数库提供,机制复杂(由链表记录空闲内存区域),分配效率比栈要低得多
内存碎片
栈:不会存在这个问题
堆:频繁分配和释放不同大小的堆空间会造成内存空间的不连续,从而造成大量碎片,导致程序效率降低
数据结构
满二叉树:二叉树中除了叶子结点,每个结点的度都为2。完全二叉树:二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布。一颗完全二叉树上有个结点,求叶子节点个数:除以2向上取整二叉树性质因为所以由于该等式右边为奇数,左边的只能是偶数又因为完全二叉树中度为结点个数要么是要么是,所以只能是因此所以
二叉树的性质
二叉树中,第层最多有个结点。如果二叉树的深度为,那么此二叉树最多有个结点。二叉树中,终端结点数(叶子结点数)为,度(子树数量)为的结点为,度为的结点数为,则。总结点。包含个结点的二叉树的高度至少为。个结点的完全二叉树的深度为。表示取小于的最大整数。当时,父亲结点为结点。(时,表示的是根结点,无父亲结点)如果(总结点的个数),则结点肯定没有左孩子(为叶子结点);否则其左孩子是结点。如果,则结点肯定没有右孩子;否则右孩子是结点。
判断合法的出栈序列
按顺序入栈的序列,任意元素e,比e先入栈的元素,并且比e后出栈的元素,一定是逆序的。
例:设栈的入栈序列是,则下列不可能是其出栈序列的是()。A.B.C.D.E.
解法:以E选项讲解
选择任意元素e,这里选择3比3后出栈的有三个元素其中比3先入栈的有两个元素12但是12是正序的,而不是逆序的所以这个序列不是合法出栈序列算法相关
排序算法的时间复杂度和空间复杂度
this指针
this指针指向被调用的成员函数所属的对象。本质是一个指针常量,储存了调用他的对象的地址。
用途:
当形参和成员变量同名时,可用this指针来区分在类的非静态成员函数中返回对象本身,可使用return*this特点:
只能在成员函数中使用,在全局函数、静态成员函数中都不能使用this。this始终指向当前对象,静态成员函数属于类。this指针是在成员函数的开始前构造,并在成员函数的结束后清除。和函数的其他参数生命周期一样。this指针会因编译器不同而有不同的存储位置,可能是栈、寄存器或全局变量。编译器在生成程序时加入了获取对象首地址的相关代码并把获取的首地址存放在了寄存器中。大多数编译器是在创建对象的时候,向ecx寄存器传递this指针。
计算机网络
计算机网络笔记
TCP/IP五层模型
5、会话层管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。会话层还利用在数据中插入校验点来实现数据的同步。数据传输基本单位为:报文。6、表示层对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解。表示层的数据转换包括数据的加密、压缩、格式转换等。数据传输基本单位为:报文。7、应用层为操作系统或网络应用程序提供访问网络服务的接口。直接为用户的应用进程提供服务(HTTP、FTP等)。数据传输基本单位为:报文。网络互连的中间设备物理层使用的中间设备称为转发器数据链路层使用的中间设备称为网桥/桥接器网络层使用的中间设备称为路由器网络层以上使用的中间设备称为网关IP地址及分类{网络号,主机号}第一个字段第二个字段网络号,标志主机或路由器所连接到的网络。主机号,标志该主机或路由器
类别网络号主机号范围A类(0)8位24位1.0.0.1-...B类(10)16位16位.1.0.1-...C类()24位8位.0.1.1-...
类别最大网络数第一个网络号最后一个网络号最大主机数A类(2^7-2)1.0.0.0.0.0.02^24-2B类(2^14-1).1.0.0..0.02^16-2C类(2^21-1.0.1.0...02^8-2
注:
A类网络号减2:1、IP全0表示本网络;2、IP()表示环回测试地址A类主机号减2:1、全0表示所连接到的单个网络地址;2、全1表示所有主机B类网络号减1:1、前面两位(10)已经固定,不会出现全0或全1;2、.0.0.0不指派B类主机号减2:扣除全0和全1的情况C类网络号减1:1、前面两位()已经固定,不会出现全0或全1;2、.0.0.0不指派C类主机号减2:扣除全0和全1的情况其他控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。IP地址放在IP数据报的首部,而硬件地址放在MAC帧的首部。在网络层和网络层以上使用的是IP地址,而数据链路层及以下使用的是硬件地址使用抽象的IP地址,而不直接使用硬件地址通信的原因:全世界存在不同的网络使用不同的硬件地址,要使这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作,但IP编址把这个复杂问题解决了IP首部的固定长度是20字节IP数据报的数据部分在4字节的整数倍时开始数据报能在互联网中经过的路由器的最大数值是,若把TTL初始值设置为“1”,表示这个数据报只在本局域网中传送划分子网的方法:从网络的主机号借用若干位作为子网号IP地址={网络号,子网号,主机号}子网掩码:将三级IP地址的子网掩码与收到的数据报的目的IP地址逐位相与,得出所要找的子网的网络地址无分类编制CIDR的特点:1、消除了传统的A、B、C类地址以及划分子网的概念;2、把网络前缀相同的连续的IP地址组成一个“CIDR地址块”IP={网络前缀,主机号}CIDR斜线记法:IP地址后面加上斜线“/”,然后写上网络前缀所占的位数网络号的位数直接决定了可以分配的网络数;主机号的位数则决定了网络中最大的主机数。Linux相关
文件权限符号
第一个字符表示文件类型:普通文件:-目录文件:d字符设备文件:c块设备文件:b符号链接文件:l命名管道文件:psocket文件:sr:读权限。w:写权限。x:可执行权限。-:没有权限。s:SET位可执行权限。SUID:只对二进制文件有效SGID:对普通文件和目录有效t:粘滞位权限。Sticky。在该目录创建的文件或目录只有创建者才有权限删除。-rwxr-xr-x:文件类型(普通文件-),所有者权限(r读/w写/x可执行),所属组的权限(r读/x可执行),其它用户权限(x可执行)权限属性后面有点(.),表示该文件带有SELinux的安全上下文;权限属性后面标记为加号(+),表示使用了ACL(AccessControlList)权限。如果文件权限后面附加一个空格,则表示系统没有可替换的访问控制措施。
修改文件权限
chgrp(changegroup):改变文件所属用户组chown(changeowner):改变文件所有者chmod(changemod):修改文件的权限#设置一个可执行文件,不让其他人修改chmodfilename#-rwxr-xr-x#让文件拥有执行权限,但不知道原权限chmoda+xfilename命令身份操作文件参数chmodugoa+(加入)-(除去)=(设置)rwx文件或目录u=user,g=group,o=other,a=all目录结构
/:根目录只有root用户具有该目录下的写权限/bin:用户二进制文件包含二进制可执行文件,包含常见的Linux命令。/sbin:系统二进制文件包含二进制可执行文件,但该目录下的Linux命令通常由系统管理员使用,对系统进行维护/etc:配置文件包含所有程序所需的配置文件,也包含了用于启动/停止单个程序的启动/关闭shell脚本/dev:设备文件包括终端设备、USB或连接到系统的任何设备/proc:进程信息这是一个虚拟的文件系统,包含正在运行的进程的信息。/var:变量文件可以找到内容可能增长的文件。包括:/var/log:系统日志文件/var/lib:包和数据库文件/var/mail:电子邮件/var/spool:打印队列/var/lock:锁文件/tmp:临时文件包含系统和用户创建的临时文件,系统重启后,文件都将删除/usr:用户程序包含二进制文件、库文件、文档和二级程序的源代码。包括:/usr/bin:包含用户程序的二进制文件/usr/sbin:包含系统管理员的二进制文件/usr/lib:包含/usr/bin和/usr/sbin用到的库/usr/local:包含从源安装的用户程序/home:HOME目录所有用户用home目录来存储他们的个人档案/lib:系统库包含支持位于/bin和/sbin下的二进制文件的库文件/boot:引导加载程序文件把汗引导加载程序相关的文件/opt:可选的附加应用程序包含从个别厂商的附加应用程序。附加应用程序应该安装在/opt或/opt的子目录下/mnt:挂载目录临时安装目录,系统管理员可以挂载文件系统/media:可移动媒体设备用于挂载可移动设备的临时目录
常用命令
新手必须掌握的Linux命令
常见执行Linux命令的格式:命令名称[命令参数][命令对象]
arch:显示机器的处理器架构
uname-a:完整地查看当前系统的内核名称、主机名、内核发行版本、处理器类型等信息
uname-r:显示内核版本
文件系统
文件系统是针对于存储器分区而言的,而非存储芯片。
基于FLASH的文件系统(基于MTD驱动层)jffs2(JournallingFlashFileSystemv2)日志闪存文件系统主要用于NOR型闪存,不适合容量较大的NAND。特点:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点:当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。存储设备
Flash
结合ROM和RAM的长处,具备可擦除可编程的性能,不会断电丢失数据,可以快速读取数据。
NORFlash
接口时序同SRAM,易使用读取速度较快擦除速度慢写入速度慢(需要先擦除)随机存取速度较快,支持XIP,适用于代码存储。常用于存放引导程序、根文件系统等单片容量较小NANDFlash
地址/数据线复用,数据位较窄读取速度较慢擦除速度快写入速度快顺序读取较快,随机存取速度慢,适用于数据存储。常用于存放用户文件系统等。单片容量较大嵌入式平台启动流程
系统从装有启动代码的NorFlash启动后,初始化对应的硬件,包括SDRAM等,然后将NandFlash上的Linux内核读取到内存中,做好该做的事情后,就跳转到SDRAM中去执行内核了,然后内核解压(如果是压缩内核的话,否则就直接运行了)后,开始运行,在Linux内核启动最后,去NandFlash上,挂载根文件,比如jffs2,yaffs2等,挂载完成,运行初始化脚本,启动consle交互,才允许你通过console和内核交互。至此完成整个系统启动过程。
RAM(RandomAccessMemory)
随机访问存储器,直接与CPU交换数据,也叫内存。可以随机读写,速度很快。断电后数据丢失。
SRAM(StaticRAM)
静态RAM,速度非常快,不需要刷新电路即可保存数据。集成度较低,非常昂贵,多用于CPU的一二级缓存L1/L2Cache。DRAM(DynamicRAM)
动态RAM,速度比SRAM慢,需要定时刷新充电才能保存数据。比SRAM便宜很多,多用于计算机内存。DDRRAM(Double-Data-RateRAM)
可以在一个时钟读写两次数据,使得数据传输速度加倍了