java校招我的归纳总结

**

数据库

**

1数据库有哪些索引?原理是什么

唯一索引:UNIQUE 表明此索引的每一个索引值只对应唯一的数据记录,对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。
主键索引:数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。   在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。 
聚集索引:在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。   如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。
 
2为什么MySQL数据库索引选择使用B+树? 

**

计算机网络

**
1 OSI分层 (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

物理层:通过媒介传输比特,确定机械及电气规范(数据单元是 比特Bit)
			物理层描述了以下一些特性:
		1、机械特性——描述接头的形状和尺寸,引线数目和排列;
		2、功能特性——接口部件的信号线(数据线、控制线、定时线等)的用途 ;
		3、规程特性——接口部件的信号线在建立、维持、释放物理连接和传输比特流的时序。
		4、电气特性——指明什么样的电信号表示0和1;

数据链路层:将比特组装成帧和点到点的传递(数据单元是 帧Frame 差错控制的两种基本方法是检错和纠错)在物理层提供比特流传输服务的基础上,在通信的实体之间建立数据链路连接,传送以帧为单位的数据,采用差错控制、流量控制方法,使有差错的物理线路变成无差错的数据链路。它可以保证数据正确的顺序、无错和完整。
	链路层主要作用:
	封装成帧(framing):就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。
	透明传输	: 传输的数据内容 格式及编码无限
	差错检测 一类就是最基本的比特差错,另一类就是收到的帧并没有出现比特错误,但却出现了帧丢失、帧重复或帧失序。
	1数据链路两端的设备是 (DTE或DCE 
	Data Terminal Equipment(DTE),数据终端设备,指具有一定的数据处理能力和数据收发能力的设备。Data Circuit-terminating Equipment(DCE),数据通信设备,它在DTE和传输线路之间提供信号变换和编码功能,并负责建立、保持和释放链路的连接。)
	2 
网络层:负责数据包从源到宿的传递和网际互连(数据单元是 包PackeT) 完成网络路径的选择功能(因为路由器在网络层)
传输层:提供端到端的可靠报文传递和错误恢复(数据单元是 段Segment)
		 为了使运行不同操作系统的计算机的应用程序能够互相通信,就必须用同一的方法对TCP/IP体系的应用进行进行标志
         这个方法就是在运输层使用协议端口号,简称端口;在协议栈层间的抽象的协议端口是软件端口,软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址。路由器或交换机上用的是硬件端口,硬件接口时不同硬件设备进行交互的物理接口。
会话层:建立、管理和终止会话(会话协议数据单元SPDU)
表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)
应用层:允许访问OSI环境的手段(应用协议数据单元APDU 传送数据)

2 一个简单的计算机网络 3 个主要组成部分是:一个通信子网,一系列通信协议,若干主机(资源子网、通信子网和通信协议)

3 各层所用到的协议:
   应用层协议有:HTTP 80, Telnet 23,FTP 21(文件传输协议),SMTP 25(简单邮件传输协议)         ,WWW,DNS、SNMP、TFTP
   表示层协议有:TIFF,GIF,JPEG,PICT,ASCII,EBCDIC,encryption
   会话层协议有:RPC,SQL,NFS
   传输层协议有:TCP,UDP
   网络层协议有:IP,ICMP
   数据链路层协议有:Frame Relay,HDLC,PPP(点对点协议), IEEE 802.3/802.2,ARP
   物理层协议有:EIA/TIA-232, EIA/TIA-499,V.35, V.24,RJ45
4 Internet是将无数局域网连接起来组成的网络,而不是将无数个微型机通过路由器互连的大型网络
5

2Ip地址 = 网络地址+主机地址

有效主机地址要求:地址主机号既不全为1,也不全为0,网络号也属于ABC类中的一种
基本类
A类地址:以0开头,   第一个字节范围:1~126(1.0.0.0 - 126.255.255.255);

B类地址:以10开头,  第一个字节范围:128~191(128.0.0.0 - 191.255.255.255);

C类地址:以110开头, 第一个字节范围:192~223(192.0.0.0 - 223.255.255.255);

D类地址:以1110开头,第一个字节范围:224~239(224.0.0.0 - 239.255.255.255);(作为多播使用)

E类地址:保留
本地广播地址:255.255.255.255   有时需要在本网络内部广播,但又不知道本网络网络号 用本地广播地址
广播地址是:子网掩码&ip(网络号)+ ~子网掩码 | ip(主机号),在网间网上的任何一点均可向其他任何网络进行直接广播,但直接广播有一个缺点,就是要知道信宿网络的网络号。
IP地址与子网掩码相与得到网络号:

ip       : 192.168.2.110&
Submask : 255.255.255.0
 ----------------------------
网络号   :192.168.2  .0(将两个二进制数做按位与(&)运算后得出的结果即为网络地址)
主机号:将子网掩码取反再与IP地址按位与(&)后得到的结果即为主机地址
题目:
	1 168.192.33.124/26 subnet mask IP address block can be written as(  255.255.255.192 )   26指的是掩码有26个1后面跟着0
	2 私有IP地址范围有:
    A类:10.0.0.0-10.255.255.255
    B类:172.16.0.0-172.31.255.255
    C类:192.168.0.0-192.168.255.255
    3 190.233.27.13./16所在网段地址( 190.233.0.0)
    4一A类网络的子网号subnet-id分别为16个1,那么他的子网掩码是多少?     255.255.255.0
    	A类地址网络号为8位 因为是从主机号中借出几位来划分子网的 借出来的就是子网号 所以子网掩码就是255.255.255.0
    
CIDR把32位的IP地址划分为两个部分:IP地址 ::={<网络前缀>,<主机号>} 网络前缀越短,其地址块所包含的地址数就越多。

3ARP (地址解析协议) 是根据IP地址获取物理地址的一个TCP/IP协议 通过ip查找地址,但是链路层是MAC (典型的MAC地址长度为48位(6个字节),标准的表示方法是在两个十六进制数之间用一个连字符隔开)所以要进行一个转换~

1:首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。
2:当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机 IP地址,源主机MAC地址,目的主机的IP 地址。
3:当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址。
4:源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
广播发送ARP请求,单播发送ARP响应。
5:身份识别鉴定  一般由ARP(address resolution protocol)协议实现,用于将通信双方的IP地址解析为物理地址,因为网卡都分配了一个硬件地址来标识一个联网的计算机或其他设备.所谓物理地址是指固化在网卡EPROM中的地址,这个地址应该保证在全网是唯一的
6ARP工作在数据链路层
7下列哪种情况需要启动ARP请求(主机需要发送信息,但ARP表中没有目的IP地址与MAC地址的映射  主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的MAC地址;收到返回消息后将该IP地址和MAC地址存入本机ARP缓存中并保留一段时间,下次请求时直接查询ARP缓存以节约资源)

4RARP

RARP是逆地址解析协议,作用是完成硬件地址到IP地址的映射,主要用于无盘工作站,因为给无盘工作站配置的IP地址不能保存。工作流程:在网络中配置一台RARP服务器,里面保存着IP地址和MAC地址的映射关系,当无盘工作站启动后,就封装一个RARP数据包,里面有其MAC地址,然后广播到网络上去,当服务器收到请求包后,就查找对应的MAC地址的IP地址装入响应报文中发回给请求者。因为需要广播请求报文,因此RARP只能用于具有广播能力的网络。

5各种协议的介绍

ICMP协议 网络层: 因特网控制报文协议。它是TCP/IP协议族的一个子协议 ,用于在IP主机、路由器之间传递控制消息。
 			检测网络通信故障和实现链路追踪 

		 PING: 发送回送请求报文和回送回答报文来检测源主机到目的主机的链路是否有问题,目的地是否可达,以及通信的延迟情况。
	1应用程序PING发出的是什么报文(ICMP请求报文)
	    traceroute:通过发送探测报文来获取链路地址信息。第一个探测报文TTL为1,到达第一个路由器时,TTL减1为0所以丢掉这个探测包,同时向源主机发回ICMP时间超过报文,这时源主机就获得了第一个路由器的IP地址;接着源主机发送第二个探测报文,TTL增1为2,到达第一个路由器TTL减1为1并转发探测包到第二个路由器,这时TTL减1为0,丢掉这个探测包并向源主机发回ICMP时间超过报文,源主机就获得了第二个路由器的IP地址;以此类推,直到探测报文到达traceroute的目的地,这时源主机就获得了到目的地的每一路由器的IP地址。
	     
TFTP协议 网络层: 简单文件传输协议 是TCP/IP协议族中的一个用来在客户机与服务器之间提供不复杂、开销不大的文件传输服务。
    	 		   FTP 是完整、面向会话、常规用途文件传输协议;   而 TFTP特殊目的文件传输协议。
			       FTP 提供用户身份验证   TFTP 不支持验证 
			       可以以交互方式使用 FTP; TFTP 允许文件只能单向的传送。
		           FTP 依赖于 TCP          TFTP 依赖 UDP 
			      一般防火墙都会封TCP端口而不会封UDP的,所以TFTP有时比FTP好用,
			      FTP一般传输大文件   		TFTP传输文件较小
			    
HTTP协议    应用层: 超文本传输协议,是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。
NAT协议 网络地址转换:网络地址转换属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,
				      实现内网的IP地址与公网的地址之间的相互转换,将大量的内网IP地址转换为一个或少量的公网IP地址,减少对
				       公网IP地址的占用 ;
				      典型应用是:在一个局域网内,只需要一台计算机连接上Internet,就可以利用NAT共享Internet连接,使局域网内其他计算机也可以上网。局域网内的计算机可以访问Internet上的计算机,但Internet上的计算机无法访问局域网内的计算机。
				       网关或路由器对内部向外发出的信息不会进行拦截,但对来自外部想进入内部网络的信息则会进行识别、筛选,认为是安全的、有效的,才会转发给内网电脑。
DHCP协议   应用层:动态主机配置协议,是一种让系统得以连接到网络上,并获取所需要的配置参数手段,使用UDP协议工作。由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。
1接收邮件时,使用了如下哪些协议(  TCP)
发送邮件是:SMTP(基于TCP)
接收邮件是:POP3(基于TCP)
这里说的是接收,然后又没有列举POP3,所以只能选TCP了。

6TCP和UDP

TCP对应的协议:
(1) FTP:文件传输协议
(2) Telnet:一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上
(3) SMTP:邮件传送协议,用于发送邮件。 
(4) POP3:它是和SMTP对应,POP3用于接收邮件!
(5)HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。
UDP对应的协议:
(1) DNS:用于域名解析服务,将域名地址转换为IP地址。 
(2) SNMP:简单网络管理协议,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
用以监测连接到网络上的设备是否有任何引起管理上关注的情况,为了让别人能够获得路由器上的统计数据而约定好的数据交流的规则。
(3) TFTP(Trival File Transfer Protocal),简单文件传输协议 。

	1 TCP/IP 参考模型的网络层提供的是  无连接不可靠的数据报服务
	2如果在一个建立了TCP连接的socket上调用recv函数,返回值为0,则表示(对端关闭了连接 recv是个阻塞函数,返回值有3种,大于0表示接受到的字节数,等于0表示对方关闭连接,小于0表示错误)
	3TCP服务:
    	(1)可靠性、面向连接、字节流传输 (TCP协议的主要特点:面向连接、字节流传输 、支持全双工通信、支持同时建立多个并发的TCP链接、支持可靠的传输服务)
    	(2)流量控制算法:控制发送端发送速率,使之不超过接收端的接受速率,防止出现报文端的丢失
    	(3)拥塞控制算法:防止过多的报文进入网络,造成路由器与链路过载
    4TCP建立连接的过程采用三次握手,已知第三次握手报文的发送序列号为1000,确认序列号为2000,请问第二次握手报文的发送序列号和确认序列号分别为(1999,1000)
    		                                  发送                  确认
    		               第一次:SYN=1       SEQ=X               ACK=0(客)
    		               第二次:SYN=1       SEQ=Y              ACK=X+1(服)
    		               第三次:            SEQ=X+1          ACK=Y+1(客)
    		               SYN 同步位
    		               
UDP和TCP有什么区别:
	1、连接方面区别
	TCP面向连接(如打电话要先拨号建立连接)。
	UDP是无连接的,即发送数据之前不需要建立连接。
	2、安全方面的区别
	TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。
	UDP尽最大努力交付,即不保证可靠交付。
	3、传输效率的区别
	TCP传输效率相对较低。
	UDP传输效率高,适用于对高速传输和实时性有较高的通信或广播通信。
	4、连接对象数量的区别
	TCP连接只能是点到点、一对一的。
	UDP支持一对一,一对多,多对一和多对多的交互通信。

7DNS域名系统,简单描述其工作原理。

当DNS客户机需要在程序中使用名称时,它会查询DNS服务器来解析该名称。把待解析的域名放在DNS请求报文中,以UDP数据报的形式发送给本地域名服务器,本地域名服务器查找到相应域名的IP地址后,就将该域名的IP地址信息放入应答报文中返回给客户进程,如果本地域名服务器没有直接查找到对应的IP地址,则向根域名服务器发出迭代查询,再将查询到的IP地址信息回传给客户程序。该应用一般不直接为用户使用,而是为其他应用服务,如HTTP,SMTP等在其中需要完成主机名到IP地址的转换。

1当本机DNS高速缓存中存有该域名的DNS信息时,则不需要查询任何域名服务器,这样最少发出0次DNS查询。最多情况下:因为均采用迭代查询的方式,在最坏的情况下,需要依次迭代地向本地域名服务器、根域名服务器(.com)、顶级域名服务器(xyz.com)、权限域名服务器(abc.xyz.com)发出DNS查询请求,因此最多发出4次DNS查询。
2

8交换机、路由器、网关 中继器的概念,并知道各自的用途

 

1)中继器(转发器)
		工作在物理层,用来连接两个速率相同且数据链路层协议也相同的网段,连接起来的几个网段仍然是一个局域网。
		中继器功能是消除数字信号在基带传输中由于经过一长段电缆而造成的失真和衰减,使信号的波形和强度达到所需的要求,其原理是信号再生
2)集线器  各个端口共用带宽 效率低
		也工作在物理层,相当于一个多接口的中继器,可以将多个节点连接成一个共享式局域网,但任何时刻只能有一个节点通过公共信道发送数据。主要功能是将信号放大,扩大网络的传输距离。
		1不可以过滤网络流量
		2会导致冲突域的扩大 路由器和交换机不会
3)网桥
		两个或多个以太网通过网桥连接起来后,就成为一个覆盖范围更大的以太网,而原来的每个以太网就可称为一个网段。
				
		网桥工作在数据链路层的MAC子层,可以互联不同的物理层、不同的MAC子层以及不同速率的以太网
				
		网桥具有过滤帧以及存储转发帧的功能
4)交换机(各个端口独占带宽)=======》ARP!!!!! 
		交换机是针对共享工作模式的弱点而推出的。
		交换机工作于OSI参考模型的第二层,即数据链路层。交换机内部的CPU会在每个端口成功连接时,通过ARP协议学习它的MAC地址,保存成一张 ARP表。在今后的通讯中,发往该MAC地址的数据包将仅送往其对应的端口,而不是所有的端口。
		交换机被广泛应用于二层网络交换,俗称“二层交换机”。
		(1)对于100Mbps 的以太网交换机,当输出端口无排队,以直通交换( cut-through switching)方式转发一个以太网帧(不包括前导码)时,引入的转发延迟至少是(以太网的直通交换方式在输入端口检测到一个 数据包 时,检查该包的包头,获取包的目的地址,启动内部的动态查找表转换成相应的输出端口,在输入与输出交叉处接通,把数据包直通到相应的端口,实现交换功能。它只检查 数据包 的包头(包括7个字节的前同步码+1个字节的帧开始界定符+6个字节的目的地址共14个字节),有时题目说明不包含前导码,即只包6个字节含目的地址。那么转发时延=6B/100Mbps=0.48us )。 
		1某一速率为100M的交换机有20个端口,则每个端口的传输速率为 (100M)
		2可以过滤网络流量
		3三层交换机具有路由功能 工作在第三层网络层
5)路由器
		提供了路由与转送两种重要机制,可以决定数据包从来源端到目的端所经过的路由路径(host到host之间的传输路径),这个过程称为路由;将路由器输入端的数据包移送至适当的路由器输出端(在路由器内部进行),这称为转 送。路由工作在OSI模型的第三层——即网络层
		路由器的一个作用是连通不同的网络,另一个作用是选择信息传送的线路。 路由器与交换器的差别,路由器是属于OSI第三层的产品,交换器是OSI第二层的产品(这里特指二层交换机)。
		1通过找出到各个网络的最短距离来更新路由表的算法称为距离向量算法
6)网关
		网关只是一个逻辑概念,路由器是一个看的见摸的着的物理设备.但是路由器可以作为网关来使用

9 TCP阻塞控制
这里主要关注四种算法,慢开始,阻塞避免,快重传,快恢复

慢开始和阻塞避免 

首先慢开始阶段以指数增长(1,2,4,8,16…)直到阻塞避免门槛后进入阻塞避免阶段变成类似(16,17,18,19…)
如果此时出现了重传计时器溢出的情况就把阻塞窗口变成1,慢开始门槛变成出现阻塞时候的窗口值的一半,然 后重新执行慢开始和阻塞避免。。。

快重传 快恢复

10 FTP:

1FTP 基于TCP 提供文件传输的基本服务 为了减少或消除,由于操作系统不同造成的文件的不兼容性
2 FTP 服务的默认 TCP 端口号是 21  ,其中21端口用于控制连接 用于FTP的登陆认证,20端口用于传输数据

11 CSMA

1 在一个CSMA/CD的局域网上(不是802.3),一个数据帧最大长度是1518字节,其中的 头部、效验和等其他附加的长度为18字节,请问我们在这个网络上,传输100字节,1000 字节,2000字节在没有遇到冲突的时候花费的三个时间的比是多少?
数据长度分别是要 传输的数据长度加上附加长度,
第一个需要100+18<1518,可用一帧传输
第二个需要1000+18<1518,可用一帧传输
第三个2000+18>1518,需要分两帧传输,分别是1500+18,和500+18
根据帧数,时间比是1:1:2

2 CSMA/CD总线网适用的标准 IEEE802.3

12 ip相关

1在Internet中,IP数据报从源结点到目的结点可能需要经过多个网络和路由器,在整个传输过程中,IP数据报头部中的(源地址和目的地址都不会发生变化)。即使在IP数据报被分片时,源IP数据报的源IP地址和目的IP地址也将复制到每个分片的头部中。
2上网的时候,访问某个网页却突然出现了某个运营商的网页(如联通、电信)。出现此问题的可能的原因是?(DNS劫持
)
3IP数据报分片和重组:IP 分片发生在 IP 层 ,不仅 源端主机 会进行分片,中间的 路由器 也有可能分片,因为不同的网络的 MTU 是不一样的,如果传输路径上的某个网络的 MTU 比源端网络的 MTU 要小,路由器就可能对 IP 数据报再次进行分片。而分片数据的 重组 只会发生在 目的端 的 IP 层。
4IP 数据包的哪个字段用于防止无限循环 ( TTL生存时间,当TTL小于0就丢弃)
5在MTU较小的网络,需将数据报分成若干较小的部分进行传输,这种较小的部分叫做 :分片
	举一个具体的例子说明IP包分片的原理。以太网的MTU值是1500 bytes,假设发送者的协议高层向IP层发送了长度为3008 bytes的数据报文,则该报文在添加20 bytes的IP包头后IP包的总长度是 3028 bytes,因为3028 > 1500,所以该数据报文将被分片,分片过程如下:
		1. 首先计算最大的IP包中IP净荷的长度 =MTU-IP包头长度=1500-20= 1480 bytes。
		2. 然后把3028 bytes按照1480 bytes的长度分片,将要分为3片,3028= 1480+1480+68。
		3. 最后发送者将为3个分片分别添加IP包头,组成3个IP包后再发送,3个IP包的长度分别为1500 bytes、1500 bytes和 88 bytes。
6对 IP 数据报进行分片的主要目的是 (适应各个物理网络不同的MTU长度)
7下述协议中,不建立于IP协议之上的协议是(ARP)。
8数据报:
	每个分组自身携带有足够的信息,它的传送是被单独处理的    不需建立虚电路    所有分组不是按顺序到达的目的端系统    网络节点要为每个分组做出路由选择

13域名体系

1 在Internet域名体系中,域的下面可以划分子域,各级域名用圆点分开,按照 从右到左越来越小的方式分多层排列: … . 三级域名 . 二级域名 . 顶级域名

14关于 RFCs :

是一种在线的技术报告,任何人都可以下载,所有的互联网标准都是以RFC的形式在互联网上发表的。所有的RFC文档都可以从互联网上免费下载。并非所有的RFC文档都是互联网标准,只有很少的RFC文档最后变成了互联网标准。

15 吞吐量

1吞吐量受下面哪个因素影响:网络设备 传输的数据类型 网络拓扑 用户数量

16传输介质

双绞线:不仅可以传输数字信号,而且也可以传输模拟信号,与其他传输介质相比,双绞线在传输距离,信道宽度和数据传输速度等方面均受到一定限制,但价格较为低廉,双绞线传输介质是把两根导线绞在一起,可以减少信号之间的相互串扰
光缆:	是网络传输介质中性能最好、应用前途最广泛的一种。
		单模传输距离远,不会发生色散,质量可靠,通常使用激光作为光源,贵 多模传输带宽大,使用便宜的led,近距离传输,不能说谁的性能好过谁
		光纤传输拥有许多优点:频带宽,损耗低,重量轻,抗干扰能力强,保真度高,工作性能可靠,成本不断下降。
		光纤不受外界电磁干扰与噪声的影响,能在长距离、高速率的传输中保持低误码率。光纤传输的安全性与保密性极好。
同轴电缆:存在一个问题,就是如果电缆某一段发生比较大的挤压或者扭曲变形,那么中心电线和网状导电层之间的距离就不是始终如一的,这会造成内部的无线电波会被反射回信号发送源。这种效应减低了可接收的信号功率。为了克服这个问题,中心电线和网状导电层之间被加入一层塑料绝缘体来保证它们之间的距离始终如一。这也造成了这种电缆比较僵直而不容易弯曲的特性。
微波受电磁干扰

17差错控制方法

1在数据通信中,当发送数据出现差错时,发送端无须进行数据重发的差错控制方法为(FEC),FEC 是利用数据进行传输冗余信息的方法,当传输中出现错误,将允许接收器再建数据。
2

18网络类型

局域网(LAN):一般限定在较小的区域内(小于10km的范围),通常采用有线的方法连接起来.  局域网网络控制的核心是网络服务器
城域网(MAN):规模局限在一座城市的范围内.
广域网(WAN):网络跨越国界、洲界,甚至遍及全球范围.  基本采用网状拓扑
个人区域网(PAN):一般指家庭一台或多台电脑所使用的网络
无线局域网(WLAN):是指通过无线设备建立的,给支持无线通信的设备使用的,比如无线网卡,或手机上的WIFI.

1一座大楼属于较小的区域,因此该网络为局域网。
2由于局域网的介质访问控制方法比较复杂,所以局域网的标准主要建立在( 介质访问控制MAC子层 )上。
	1.物理层 局域网体系结构中的物理层和计算机网络OSI参考模型中物理层的功能一样,主要处理物理链路上传输的比特流,
   实现比特流的传输与接收、同步前序的产生和删除;建立、维护、撤销物理连接,处理机械、电气和过程的特性。
	2.媒体访问控制MAC子层:MAC子层负责介质访问控制机制的实现,即处理局域网中各站点对共享通信介质的争用问题,不同类型的局
	域网通常使用不同的介质访问控制协议,另外MAC 子层还涉及局域网中的物理寻址。
	3.逻辑链路控制LLC子层:LLC子层负责屏蔽掉MAC子层的不同实现,将其变成统一的LLC界面,从而向网络层提供一致的服务。
	   局域网体系结构中的LLC子层和MAC子层共同完成类似于OSI参考模型中数据链路层的功能,将数据组成帧进行传输,并对数据帧进行顺序控制、差错控制和流量控制,使不可靠的链路变为可靠的链路。
3当用户数据需要在两个VLAN之间互相传输时,需要(三层交换机)等设备的支持。
	

19命令作用

ping是用来发送ping命令的,通常查看线路是否通畅;
Winipcfg命令的作用,是用于显示用户所在主机内部IP协议的配置信息
Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP 数据包访问目标所采取的路径
ipconfig可以获得本机的IP地址

20各种攻击原理:

1 SYN Flood攻击     属于DOS(DDOS)
	大家都知道,TCP与UDP不同,它是基于连接的,也就是说:为了在服务端和客户端之间传送TCP数据,必须先建立一个虚拟电路,也就是TCP连接,建立TCP连接的标准过程是这样的:
	首先,请求端(客户端)发送一个包含SYN标志的TCP报文,SYN即同步(Synchronize),同步报文会指明客户端使用的端口以及TCP连接的初始序号;
	第二步,服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgment)。
	第三步,客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。
	以上的连接过程在TCP协议中被称为三次握手(Three-way Handshake)。
	问题就出在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃---即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了SYN Flood攻击(SYN洪水攻击)。
		服务端由于连接队列被占满而不能对外服务
		大量连接处于SYN_RECV状态
		使用硬件防火墙可以一定程度上抵御攻击
		只能攻击TCP
2 DDOS分布式拒绝服务攻击  属于DOS   
	借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力。

21网络服务类型

1 在面向连接的网络服务中,每个分组的路由是在哪一时刻确定的(建立虚电路)
		在网络层中,当两个计算机进行通信时,对于面向连接的网络服务,应当先建立连接(在分组交换中是建立一条虚电路VC),以保证双方通信所需的一切网络资源。然后双方就沿着已经建立的虚电路发送分组(确定路由) 。
		这样的分组的首部不需要填写完整的目的主机地址,而只需要填写这条虚电路的编号,这样做可以减少分组的开销 。

22常用的数据传输单位:

1Gbit/s  = 1×103Mbit/s

23大小端与发送顺序

1 在x86平台上,有一个int型变量,在内存中的内部由低到高分别是:0x12,0x34,0x56,0x78当通过网络发送该数据时,正确的发送顺序是(0x78,0x56,0x34,0x12)
	UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节 	X86 系列 CPU都是 little-endian 的
	小端法(Little-Endian)就是低位字节排放在内存的低地址端(即该值的起始地址),高位字节排放在内存的高地址端;
	大端法(Big-Endian)就是高位字节排放在内存的低地址端(即该值的起始地址),低位字节排放在内存的高地址端;

24进程和线程

1基本概念和区别:
	1、首先是定义
	进程:是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。
	线程:单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位。
	2、一个线程只能属于一个进程,但是一个进程可以拥有多个线程。多线程处理就是允许一个进程中在同一时刻执行多个任务。
	3、线程是一种轻量级的进程,与进程相比,线程给操作系统带来侧创建、维护、和管理的负担要轻,意味着线程的代价或开销比较小。
	4、线程没有地址空间,线程包含在进程的地址空间中。线程上下文只包含一个堆栈、一个寄存器、一个优先权,线程文本包含在他的进程 的文本片段中,进程拥有的所有资源都属于线程。所有的线程共享进程的内存和资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段, 寄存器的内容,栈段又叫运行时段,用来存放所有局部变量和临时变量。
	5、父和子进程使用进程间通信机制,同一进程的线程通过读取和写入数据到进程变量来通信。
	6、进程内的任何线程都被看做是同位体,且处于相同的级别。不管是哪个线程创建了哪一个线程,进程内的任何线程都可以销毁、挂起、恢复和更改其它线程的优先权。线程也要对进程施加控制,进程中任何线程都可以通过销毁主线程来销毁进程,销毁主线程将导致该进程的销毁,对主线程的修改可能影响所有的线程。
	7、子进程不对任何其他子进程施加控制,进程的线程可以对同一进程的其它线程施加控制。子进程不能对父进程施加控制,进程中所有线程都可以对主线程施加控制。
	相同点:
	进程和线程都有ID/寄存器组、状态和优先权、信息块,创建后都可更改自己的属性,都可与父进程共享资源、都不鞥直接访问其他无关进程或线程的资源。
	
2进程通信方式:
	(1)管道(无名管道)	半双工 具有固定的读端和写端		只能用于具有亲缘关系的进程之前的通信(父子进程和兄弟进程)   可以看成是一种特殊的文件 但是并不是普通的文件 不属于其他文件系统 并且只存在于内存当中
	(2)FIFO (命名管道)  可以在无关的进程之间交换数据   有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。
	(3)消息队列
	(4)信号量 用于进程间的同步和互斥 而不是进程间数据的通信
	(5)共享内存 指两个或多个进程共享一个给定的存储区

3协程
协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。用到更少的资源 协程切换任务资源小,效率高


25同步和异步:

1计算机网络通信采用同步和异步两种方式,但传送效率最高的是( 同步通信)。
	同步通信原理
	
	    同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息。这里的信息帧与异步通信中的字符帧不同,通常含有若干个数据字符。
	
	    采用同步通信时,将许多字符组成一个信息组,这样,字符可以一个接一个地传输,但是,在每组信息(通常称为帧)的开始要加上同步字符,在没有信息要传输时,要填上空字符,因为同步传输不允许有间隙。在同步传输过程中,一个字符可以对应5~8位。当然,对同一个传输过程,所有字符对应同样的数位,比如说n位。这样,传输时,按每n位划分为一个时间片,发送端在一个时间片中发送一个字符,接收端则在一个时间片中接收一个字符。
	
	    同步传输时,一个信息帧中包含许多字符,每个信息帧用同步字符作为开始,一般将同步字符和空字符用同一个代码。在整个系统中,由一个统一的时钟控制发送端的发送和空字符用同一个代码。接收端当然是应该能识别同步字符的,当检测到有一串数位和同步字符相匹配时,就认为开始一个信息帧,于是,把此后的数位作为实际传输信息来处理。
	
	异步通信原理
	
	    异步通信是一种很常用的通信方式。异步通信在发送字符时,所发送的字符之间的时间间隔可以是任意的。当然,接收端必须时刻做好接收的准备。发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。异步通信的好处是通信设备简单、便宜,但传输效率较低(因为开始位和停止位的开销所占比例较大)。
	
	同步通信与异步通信区别:
	
	   1.同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;异步通信时不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节。
	    2.同步通信效率高;异步通信效率较低。
	    3.同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。
	    4.同步通信可用于点对多点;异步通信只适用于点对点。

26信道传输速率

1关于信道传输速率:
	信道的码元传输速率是有上限的	频带宽度越宽的信道,其信息传输速率越大  信噪比越大的信道,其信息传输速率越大 	   Cmax=B×log2(1+(S/N))

**

算法

**
o(1)<o(logn)<o(n)<o(nlogn)<o(n²)<o(n³)<o(2的n次方)
o(logn):二分搜索(底数是2 如果不是整数取下数+1)
分块查找:o(log2n)到o(n)之间
o(n): 顺序查找 线性时间选择(平均时间o(n) 最坏o(n²)) 桶排序 改良的冒泡
O(n+k)计数排序
o(nlogn):合并(最坏也是nlogn) 快速排序(O(n log n) ~ O(n^2) 不稳定) 堆排序(不稳定 O(n+nlogn)=O(nlogn)) 查找n点中最接近两点
o(N*M)基数排序(N为数据个数,M为数据位数)
o(n²):冒泡(最好O(n)) 二分插入排序 插入排序(最好O(n)) 希尔排序(不稳定) 直接选择排序(不受数据的初始特性影响)
哈希查找:o(1)

基本的五大算发:
分治法

二分搜索:将已排好序的n个元素分成个数大致相同的两半,取n/2与x作比较,x在左边就从左边搜索,在右边就从右边搜索
合并排序:将带排序元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合合并
快速排序:对数组a[p:r],
		(1)选择a[q]使得a[p:q-1]小于a[q],a[q+1:r]大于a[q]。
		(2)递归调用快速排序算法分别对a[p:q-1]  a[q+1:r] 进行排序  
					在a[p:r]中随机选出一个元素作为划分基准======》》》舍伍德型随机算法
选择排序:每进行一次外循环都找到一个最大的数(或者最小的数)移到后面
线性时间选择:
		(1):将n个输入元素以每组5个地划分,共划分出(n/5)个组,每个组分别进行排列,找出中位数,然后按照每个组的顺序,把每个组的中位数与整个数组的前(n/5)个数交换;
		(2):那么,前(n/5)个数就是各组的中位数了,然后,我们通过select方法找出这些中位数的中位数,以这个中位数的中位数为基准,调用partition方法;
		(3):调用了partition方法后的基准元素正是处于数组的正确位置(前边的元素都比基准元素小,后边的元素都比基准元素大),记下基准元素前边的元素个数leftNum,如果k小于或等于leftNum,则在基准位置前的这部分调用select方法即可,如果在k大于leftNum,则在基准位置后的这部分调用select方法。
·			      随机选取一个元素作为基准=====》》》舍伍德型随机算法
==============顺路整理一下排序===============
冒泡:将相邻的两个数两两比较,每次外循环都将最大的数移到最后,每次内循环比较两个数,如果后一个数小于前一个数,两个数交换。
		优化的冒泡:可以增加一个boolean变量,来标识是否已经排好序;
基数排序:利用计数排序的原理,从最低位开始,进行按位的大小排序,直到最高位为止
计数排序:记录下数组中每个数前面有多少个小于他的数 则该数就在这个位置。
插入排序(注意和选择排序的区别):从第二个数开始,与已排好的序列的最后一个数比较,如果其值小于最后一个数,则与前一个数比较,到找到小于它的数,将其插入到这个数的后面
希尔排序:  按照一个增量进行分组 每一组内进行插入排序 直到增量变成1 就变成普通的插入排序
堆排序(大顶堆 小顶堆):将数组排成堆(正序:大顶堆 逆序:小顶堆),然后将堆顶元素与数组末尾元素交换,重新整理成堆,再交换。。。
桶排序:每一个桶代表一个范围把相应数收集起来 在这个范围内对数进行排序 然后得到结果

1基于比较方法的n个数据的内部排序。最坏情况下的时间复杂度能达到的最好下界是(O(nlogn))
2一个算法应该是(问题求解步骤的描述)     5个特性::输入、输出、有穷性、确定性和可行性
3二叉排序树中查找效率最高的是(平衡二叉树)  二叉查找数的查找速度取决于树的深度 相同节点数深度最小的是平衡二叉树
4一组记录的关键字为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为(40,38,46,56,79,84)   要注意是使用的i和j两个变量从开始元素和另一边扫描 互相交换而来的!
5在对一组记录(54,38,96,23,15,72,60,45,83)进行直接插入排序时,当把第7个记录60插入到有序表时,为寻找插入位置需比较(3)次
6已知一个长度为16的顺序表L,其元素按关键字有序排列,若采用折半查找法查找一个 L中 不存在的元素,则 关键字的 比较次数最多是(5)
	第一种方法:深度是log2(16)+1=5
	第二种方法:要注意round的问题 和 这种算法计数的问题
	一次找到最边界的那一个数的情况下是最多次数的。
		eg:  找的是第16个数
		(0+15)/2   7      第1次
		(8+15)/2   11    第2次
		(12+15)/2  13  第3次
		(14+15)/2 14     第4次
		(15+15)/2  15   第5次
		
给定n个节点的平衡二叉搜索树,每个节点的值是整数。给定一个整数,在树中找出与该整数最接近的节点的最小算法复杂度是(Θ(logn))
7希尔排序每的最后一趟排序的地址增量一定是(1) 因为退化为插入排序
8给定一个整数sum,从有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum,最快的平均时间复杂度是:O(n)    注意是有序
9分配式排序: 基数排序、桶排序
10对一个具有n个元素的线性表,建立其有序单链表的时间复杂度为(O(nlog2n))
		先排序O(nlogn)   后构建链表是O(n)   总的时间复杂度为O(nlogn)+O(n)=O(nlog2n)
11不稳定的排序算法有:快、希、选、堆。(记忆:找到工作就可以“快些选一堆”美女来玩了(并不能))
12排序算法空间复杂度(要求内存):
	O(1):冒泡排序,简单选择排序,堆排序,直接插入排序,希尔排序
	logn:快排
    O(n): 归并排序 基数排序
    桶排序的空间复杂度不确定
13T(n)=1(n<=1),T(n)=25T(n/5)+n^2,T(n)复杂度是多少?   O(n^2logn)

在这里插入图片描述

14在外排序过程中,对长度为n的初始序列进行"置换-选择"排序时,可以得到的最大初始有序段的长度不超过n()
15分支限界法与回溯法都是在问题的解空间树T上搜索问题的解,关于二者说法中正确的是( 求解目标不同,搜索方式也不同)
16下列程序段的时间复杂度为(O(n^(1/2))) i=0 , s=0 ; while (s<n) {s=s+i ; i++ ; }
		(1+x)/2*x <=n
17以下函数的时间复杂度和空间复杂度为( T(n)=O(2ⁿ),S(n)=O(n))    T(n)=T(n-1)+T(n-2)+1,通过画递归树,可得答案
					int Function(int n)
					{
					    if (n <=1)
					        return n;
					    else
					        return Function(n-1)+ Function(n-2);
					}
18假设包含t个非零元素的稀疏矩阵A含有m行n列,并采用三元组顺序表压缩存储,其快速转置算法的时间复杂度为(  O(n+t))
19从n个数里面找最大的两个数理论最少需要比较(n+ logn -2)
	找出最大的数比较次数是n-1。然后第二大的数肯定是跟冠军比较过的数字,那么很明显每一层都有一个,所以有logn-1次比较
20贪心算法:
	单源最短路径中的Dijkstra算法O(n^2)        最小生成树的Prim算法       最小生成树的Kruskal算法
    动态规划:
    计算每对顶点最短路径的Floyd-Warshall算法O(n^3)         字符串匹配中的KMP算法(最大特色是指示主串的指针不需回溯)

模式串的长度是m,主串的长度是n(m<n),使用KMP算法匹配的时间复杂度是(O(m+n))?
  21
    元素的移动次数与关键字的初始排列次序无关的是:基数排序
	元素的比较次数与初始序列无关是:选择排序
	算法的时间复杂度与初始序列无关的是:直接选择排序

动态规划

1最优子结构:问题的最优解包含了其子问题的最优解
2重叠子问题:每次产生的子问题并不总是新的问题,对每一个子问题只解一次,而后将其解保存在一个表格之中,当每次需要解此子问题的时候,只是简单地用常数时间查看一下结果。

贪心算法

总是做出当前看来最好的选择,不从整体最优上加以考虑,所做出的选择只是局部最优选择

回溯法

1定义所需的解空间
2把解空间组织成树或者图
3从根节点开始深度优先搜索
可用约束函数或限界函数给出可行结点相应子树的最大价值的上界,小于最优值就剪去

分支限界法:

分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。
在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。
此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。

-----------------------------------------------------------------------主体----------------------------------------------------------------------------------

快速排序(QuickSort):(java中Array.sort)

算复杂度为 O(n log n),其中 n 是 array 的 Length;最坏的情况下其运算复杂度为 O(n ^ 2)

在网上看到一哥们总结得很好 偷一下~
https://blog.csdn.net/yushiyi6453/article/details/76407640
在网上搜到一个java的好网站hh
https://github.com/frank-lam/fullstack-tutorial
p问题:

P:  能在多项式时间内解决的问题  所有的P类问题都是NP问题
NP: 不能在多项式时间内解决或不确定能不能在多项式时间内解决,但 能在多项式时间验证的问题
NPC: NP完全问题, 所有NP问题在多项式时间内都能约化(Reducibility)到它的NP问题 ,即解决了此NPC问题,所有NP问题也都得到解决。
NP hard:NP难问题, 所有NP问题在多项式时间内都能约化(Reducibility)到它的问题(不一定是NP问题)。

数据结构

1n个顶点,m条边的全连通图,至少去掉几条边才能构成一棵树(m-n+1)
		n个顶点的树一定有n-1条边,所以需要去掉m-(n-1)=m-n+1条边
2把数据结构从逻辑上分为(线性结构、非线性结构)两大类
3平均情况与最坏情况下的时间复杂度不同的是(快速排序对数组进行排序)
4n!后面有多少个0,6!=1*2*3*4*5*6=720.720后面有1个0,n=10000,求n!。   2499
6已知字符A、B、C、D的使用频率(权值)分别为22,7,9,27。对其进行HUFFMAN编码,各字符对应的编码为(  A(11)  B(100)C(101) D(0))
 当一棵具有n个叶结点的二叉树的WPL值为最小时,称其树为哈夫曼树,且其二叉树的形状不是唯一的 但是wpl是唯一的,权值较大的结点离根较近。
 7广告系统为了做地理位置定向,将IPV4分割为627672个区间,并标识了地理位置信息,区间之间无重叠,用二分查找将IP地址映射到地理位置信息,请问在最坏的情况下,需要查找多少次? 
 	目的就是算二分查找树的深度!    log(627672)/log(2) = 19.26

 9数据元素是数据的最小单位(❌)
 	数据元素:字段、域、属性
	数据项:元素、结点、顶点、记录
	数据项组成数据元素,数据元素组成数据     数据项是数据不可分割的最小单位
 10图
在用邻接表表示图时,拓扑排序算法时间复杂度为(O(n+e))

图的BFS生成树的树高比DFS生成树的树高(小或相等)
 
在有向图中,出度为0的结点称为叶子
用邻接矩阵表示图,容易判断任意两个结点之间是否有边相连,并求得各结点的度
深度优化DFS(Depth First Search),是从根节点开始先根后左后右,所以类似于前序遍历。
广度优先(Breadth First Searh),是一层一层从左到右遍历,所以类似于层序遍历。
树的深度优先的遍历与树的先序遍历时类似的,但是深度优先遍历的结果不是确定的,它没有左右子树的先后顺序之分
拓扑序列:若有向图G中从结点Vi到结点Vj有一条路径,则在图G的结点的线性序列中结点Vi,必在结点Vj之前的话

十字链表是有向图的一种链式存储结构。该结构可以看成是将有向图的邻接表和逆邻接表结合起来得到的。用十字链表来存储有向图,可以达到高效的存取效果。同时,代码的可读性也会得到提升。

11设散列表的长度为10,散列函数H(n)=n mod 7,初始关键字序列为 (33,24,8,17,21,10),用链地址法作为解决冲突的方法,平均查找长度是(1.5)
12对递归常用的优化手段 尾递归
	尾递归:在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况
13最短路径算法:
	 迪杰斯特拉算法,求从某个源点到其余各顶点的最短路径,求解过程按路径长度递增的次序产生的最短路径O(n^2) ;
	 弗洛伊德算法,求 每一对顶点之间的最短路径 O(n^3)。
14  二叉查找树(左子树数小于右子树数)  --加上颜色特性限制-》 红黑树(平衡的 利用颜色限制使得最短路径与最长路径不会相差的太远)
	红黑树 B+树 插入操作的平均时间复杂度为0(log n),最坏时间复杂度为0(log n)
15四种数据存储结构
			顺序存储 链接存储 索引存储 散列存储
			字符串用的: 顺序 链式存储
	四种逻辑结构:集合、线性结构、树、图状结构
16在存储数据时,通常不仅要存储各数据元素的值,而且还要存储(数据元素间的关系 即数据结构)。 
17算术表达式a+b*(c+d/e)转为后缀表达式后为(abcde/+*+)    中缀转后缀
写出a*(b-c*d)+e-f/g*(h+i*j-k)的逆波兰表达式(abcd*-*e+fg/hij*+k-*-);
		根据运算符优先级添加括号。 每个括号只能移动一个位置
		    a*(b-c*d)+e-f/g*(h+i*j-k)
		=  a * (b - (c * d)) + e - (f / g) * (h + (i * j) - k)
		=  a * (b - (cd*)) + e - (fg/) * (h + (ij*) - k)
		=  a * (bcd*-) + e - (fg/) * ((hij*+) - k)
		=  (abcd*-*) + e - (fg/) * (hij*+k-)
		=  (abcd*-*e+) - (fg/hij*+k-*)
		=  (abcd*-*e+fg/hij*+k-*-)

**

算法思想题目总结:

**
1基于回溯法思想 用于解决类似于一个字符串中所有字母排序问题
典型的回溯法排列数算法

主题代码
if(){
	终止条件 例如 i == cs 数组长度-1时候的操作
}else {
   for (int j = i; j < cs.length; j++) {
            swap(cs, i, j);
            yourFucntion(cs, i+1, list);  //list用来存储结果
            swap(cs, i, j);
        }
}

此外回溯法搜索子集树的一般算法:
if(){
终止条件 例如 i == cs 数组长度-1时候的操作
}else {
for (int j = i; j < cs.length; j++) {

            yourFucntion(cs, i+1, list);  //list用来存储结果
         
        }
}

2找出数字出现次数超过数组长度一半 时间复杂度是O(n)

思想:从头开始记录count 变换一个就count--  最后count不为0的则是超过数组长度一半的数字

3输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

思想 首先存入四个值,然后每次跟最大的值进行比较即可 所以用java可以用PriorityQueue实现 java的优先队列是基于大顶堆实现的,所以重写Comparator即可
      主体代码:
       for (int i = 0; i < length; i++) {
            if (maxHeap.size() != k) {
                maxHeap.offer(input[i]);
            } else if (maxHeap.peek() > input[i]) {
                maxHeap.poll();
                maxHeap.offer(input[i]);
            }
        }

4输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
Comparator的高级使用

重写 Collections.sort(,比较器)
比较器代码:
					String s1=str1+""+str2;
                    String s2=str2+""+str1;
                     
                    return s1.compareTo(s2);
  这里有个我想不用到的点就在于Comparator比较的过程中只可以把每个string都比较的,所以输出的结果是符合需求的。也就是最后输出的总结果应该是str1+str2+.....+strn是最小的。

5在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).

基本版思想:   有个主意点 ArrayList remove操作需要用包装类 或则查找的是下标,因为add是包装类
		ArrayList<Character> arrayList = new ArrayList<>();
		ArrayList<Character> check = new ArrayList<>();
		for (int i = 0; i < str.length(); i++) {
			char c = str.charAt(i);
			if (arrayList.contains(c)) {
				arrayList.remove(new Character(c));
			} else {
				if(!check.contains(new Character(c))) {
					arrayList.add(c);
					check.add(c);
				}
				
			}

		}

改进版思想:我的方法中使用了两个ArrayList 一个用来判断 也可以用map来操作。

6在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P

我的基本思想,两个for循环, 但是时间复杂度太大 达不到要求
for (int i = 0; i < array.length-1; i++) {
			 for (int j = i+1; j < array.length; j++) {
				 if(array[i]>array[j]) {
					 count++;
				 }
			}
			
		}

改进版思想:可以使用归并排序  
主体代码:
if(low==high)
        {
            return 0;
        }
        int mid = (low+high)>>1;
        int leftCount = InversePairsCore(array,copy,low,mid)%1000000007; //归并排序首先分成左右两部份,如果到最后三个 则左边											两个右边1个 右边返回0
        int rightCount = InversePairsCore(array,copy,mid+1,high)%1000000007;
        int count = 0;
        int i=mid;
        int j=high;
        int locCopy = high;
        while(i>=low&&j>mid)
        {
            if(array[i]>array[j])
            {
                count += j-mid;//算出当前拥有的逆序对
                copy[locCopy--] = array[i--]; 交换位置 即将此逆序对排序为正序对
                if(count>=1000000007)//数值过大求余
                {
                    count%=1000000007;
                }
            }
            else
            {
                copy[locCopy--] = array[j--];
            }
        }
        for(;i>=low;i--)
        {
            copy[locCopy--]=array[i];
        }
        for(;j>mid;j--)
        {
            copy[locCopy--]=array[j];
        }
        for(int s=low;s<=high;s++)
        {
            array[s] = copy[s];
        }
        return (leftCount+rightCount+count)%1000000007;
发布了63 篇原创文章 · 获赞 44 · 访问量 6261

猜你喜欢

转载自blog.csdn.net/weixin_40695328/article/details/91412564
今日推荐