南软复试真题

文章目录

计算机网络

ARP(地址解析协议)(Address Resolution Protocol)

把IP地址解析为硬件地址,它解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题
make the IP to hardware adress

AS(自治系统)(Autonomous System)

处于一个管理机构控制之下的路由器和网络群组。对内使用OSPF,RIP,对外BGP
a network gruop

BGP(边界网关协议)(Border Gateway Protocol)

边界网关协议。不同自治系统的路由器之间交换路由信息的协议。外部网关协议
路径向量路由选择协议,应用层协议,基于TCP
BGP的使用环境:
因特网规模太大,自治系统之间路由选择很困难
自治系统之间的路由选择,找最佳路由并不现实
自治系统之间的路由选择必须考虑有关策略
力求寻找一条能够到达目的网络且比较好的路由
工作原理:每个自治系统选出一个(或多个)路由器作为该自治系统的“BGP发言人”。发言人与发言人之间交换信息,首先要建立TCP连接

BGP支持CIDR
use to exchange the information between different AS

CRC循环冗余码。(Cyclic Redundancy Check)

最常用的一种差错校验码。如ARQ方法中,发送方将要发送的数据帧附加一定的CRC冗余检错码一并发送,接收方根据检错码对数据帧进行错误检测,发现错误丢弃,发送方超时重传该数据帧。
use to check the data

CSMA/CD(载波监听多点接入/碰撞检测协议):(Carrier Sense Multiple Access with Collision Detection)

CSMA的改进,总线型网络
应用于有线连接的局域网。总是以广播模式发送
先听后发,边听边发(区别于CSMA协议),冲突停发,随机重发(二进制退避算法)

Local Area Network (LAN) for wired connections
CSMA/CA(载波监听多点接入/碰撞避免协议):Carrier Sense Multiple Access with Collision Avoid

广播告诉其他结点,让其他结点在某段时间不要发送数据
为什么要有这个协议:无线介质实现碰撞检测硬件花费过大;“隐蔽站”
适用于无线局域网
二进制退避算法
实现方法:
预约信道:我要用多久
ACK:收到了给我个回复
RTS/CTS帧:“隐蔽站”
Suitable for wireless LAN

DHCP

动态主机配置协议。用于给主机动态地分配IP地址(Dynamic Host Configuration Protocol)
应用层协议。基于UDP。C/S方式(所以是应用层协议)
DHCP服务器聚合DHCP客户端的交换过程:
DHCP客户机广播“DHCP发现”,找服务器
DHCP服务器收到,广播“DHCP提供”
DHCP客户机收到“DHCP提供”,广播“DHCP请求”消息
DHCP服务器广播“DHCP确认”

DNS:(Domain Name System)域名系统

将特定含义的主机名(www.baidu.com)转变为IP地址
层次域名空间
www(三级域名).baidu(二级域名).com(顶级域名)
域名服务器
根域名服务器
顶级域名服务器
授权域名服务器(权限域名服务器)
本地域名服务器
解析器
change the url to ip, like baidu.com to a ip adress
域名解析:(《王道》P246)
迭代与递归结合
迭代式

EGP(Exterior Gateway Protocol)

外部网关协议,域间路由选择。自治系统之间所使用的路由选择协议。用于不同自治系统之间的路由器交换路由信息。BGP
exchange the infromation between different AS

FTP(文件传送协议): (File Transfer Protocol)

异构网络中任意计算机之间传送文件。提供交互式的访问,允许客户指明文件的类型与格式,允许文件具有存取权限
提供的功能:
不同种类主机系统之间的文件传输能力
以用户权限方式提供用户对远程FTP服务器上的文件管理能力
以匿名FTP的方式提供公用文件共享的能力
C/S工作方式,FTP。由主进程与若干从属进程构成
控制连接(端口21)与数据连接(端口20)
transfer file between any PC in different structurenetwork

HDLC(高级数据链路控制协议)(High-level Data Link Control)

一组用于在网络结点间传送数据的协议
面向比特
全双工通信,较高的数据链路传输效率
所有帧使用CRC检验,顺序编号,可靠传输
传输控制与处理功能分离,较大灵活性
基本配置:
平衡配置:一个主站控制整个链路
非平衡配置:两个站都是复合站,平等地发起数据传输
站:主站,从站,复合站
tranfer information between different network point. It is data link layer protocol

ICMP(互连网控制报文协议 )

允许主机或路由器报告差错情况和提供有关是否有异常情况的报告。
IP层协议
报文种类:ICMP差错报文,ICMP询问报文
两个常见应用:
PING(工作在应用层,直接使用ICMP)
Traceroute,tracert(工作在网络层)
Internet Control Message Protocol, report the error and exception

IGMP(网际组管理协议)

多播协议。互联网组播所使用的一种协议,进行组播组成员信息的交互 。IGMP 使用 IP 数据报传递其报文
Internet Group Management Protocol

IGP:内部网关协议(域内路由选择)

一个自治系统内部额所使用的路由选择协议。RIP,OSPF
Interior Gateway Protocol. choose the routing in an Autonomous System

IP

网际协议。用来使互连起来的网络能够相互通信。整个TCP/IP协议族的核心,也是构成互联网的基础。IP位于TCP/IP模型的网络层
Internet Protocol,Used to enable interconnected networks to communicate with each other. located in the network layer of the TCP/IP model. The foundation of the Internet.

LAN

局域网。采用广播技术,几十米到几千米的覆盖范围
Local Area Network

LCP

链路控制协议。PPP的组成部分。建立、配置、测试和管理数据链路
Link Control Protocol.
Part of PPP.
manage the data link

LLC

数据链路层中的逻辑链路控制子层:向网络层提供无确认的无连接服务,有确认的无连接服务,有确认的面向连接服务
Logical Link Control.
Logical control sublayer in the data link layer.
Provision of services to the network layer

MAC

数据链路层中的MAC介质访问控制子层:组帧,差错控制,透明传输
medium access control.
sublayer in data link layer. Error Control, Transparent Transmission

NAT

网络地址转换:通过将专用网络地址转换为公用地址从而对外隐藏内部管理的IP地址。
Network Address Translation

NCP

网络控制协议。PPP的组成部分。为网络层协议建立和配置逻辑连接
Network control protocol.
Part of PPP, Establishing and configuring logical connections for network layer protocols

OSPF

(开放最短路径优先)
IGP的一种,使用迪杰斯特拉算法
LSA(链路状态通告)来在网络中的路由器之间交换网络拓扑信息
基本特点:
向本自治系统中所有路由器发送信息,使用洪泛法
发送的信息是与路由器相邻的所有路由器的链路状态
只有链路状态发生变化时,路由器才向所有路由器发送此信息
OSPF是网络层协议,直接用IP数据报发送
能适用于规模很大的自治系统中
全网范围内是一致的
灵活
多路径间的负载平衡
子网划分与CIDR
虽然能算出完整的最优路径,但路由表中不会存储完整路径。只存储“下一跳”
能将一个自治系统再划分为更小的范围

POP

(邮局协议)
UA向邮件服务器发出请求,“拉”取用户邮箱中的邮件。C/S工作方式。TCP连接(端口110)
Post Office Protocol.
UA sends a request to the mail server to “pull” the mail from the user’s mailbox.

PPP

点对点协议(Point to Point Protocol)
串行线路通信的面向字节(byte-oriented)的协议
拨号或专线建立点对点连接
三个组成部分:
链路控制协议LCP:建立、配置、测试和管理数据链路
网络控制协议NCP:为网络层协议建立和配置逻辑连接
一个将IP数据报封装到串行链路的方法

RARP

逆地址解析协议,使只知道自己硬件地址的主机能够知道其IP地址。
Reverse Address Resolution Protocol.
A host that knows its hardware address can know its IP address

RIP

(路由信息协议):IGP的一种。应用层协议,传输层使用UDP
使用跳数,每经过一个路由器,跳数加1
一条路径最多15个路由器。距离16不可达
特点
仅和相邻路由器交换信息
交换的是当前路由器所知道的全部信息,即自己的路由表
选择最小跳数路由
缺点
限制了网络的规模
开销大,交换的是完整的路由表
慢收敛,需要较长时间才能将此信息传送到所有路由器
Routing Information Protocol.
application layer protocol.

TCP(传输控制协议)

传输层协议。面向连接、可靠的、全双工通信
提供单播,不支持广播和多播。
面向字节流,而非消息流,消息的边界在端到端传输中不能得到保留。(TCP虽是面向字节流的,但TCP传送的数据单元却是报文段)
Transmission Control Protocol.

UDP(用户数据报协议)

无连接、不可靠、面向报文。没有拥塞控制。不需要确认。
不可靠的逻辑信道
优点:
无需建立连接
无连接状态
分组首部开销小(8B)
应用层能更好地控制要发送的数据和发送时间

用于DNS、SNMP,TFTP,RTP(实时传输协议)
特点:
尽最大努力交付
面向报文:添加首部直接交付IP层,接收方去首部原封不动交付完整报文。报文不可分割,是UDP数据报处理的最小单位
计算校验和:在UDP数据报之前加12B伪首部
User Datagram Protocol. No connection, unreliable, low cost.

URL

为了使用户清楚地知道能够很方便地找到所需的信息,万维网使用统一资源定位符URL(Uniform Resource Locator)来标志万维网上的各种文档,并使每一个文档在整个因特网的范围内具有唯一的标识符URL

传输单位:Transmission unit

物理层:比特bits

数据链路层:帧frames

网络层:数据报datagram

传输层:TCP或UDP

计算机网络拓扑结构(topology)的分类:

星形(star-shaped)

总线型(Bus type)

网状(Mesh Network)

环形(ring network)

OSI模型

物理层:在物理媒体上透明地传输比特流

Physical layer: transparent transmission of bit streams over physical media

数据链路层:点到点通信。成帧,差错控制,流量控制,传输管理

Data link layer: point-to-point communication. Framing, Error Control, Traffic Control, Transmission Management

网络层:为不同主机提供通信服务

Network layer: communication services for different hosts

流量控制flow control

拥塞控制congestion control

差错控制error control

网际交互Internet interaction

传输层:主机间进程间的通信。提供端到端的可靠的传输服务。流量控制,差错控制,服务质量,数据传输管理

Transport layer: communication between processes between hosts. Provides end-to-end reliable transmission services. Traffic control, error control, quality of service, data transfer management

会话层:不同主机之间的进程进行会话

Session layer: Processes between different hosts to have a session

表示层:交换信息的表示方式

Representation layer: a representation of the information exchanged

应用层:用户与网络的界面

Application layer: user interface to the network

TCP/IP模型

网际接口层network interface layer

网际层network layer

传输层transmission layer

应用层application layer

数据链路层协议:

SDLC

HDLC

PPP

STP

帧中继

网络层协议:

IP

IPX

ICMP

IGMP

ARP

RARP

OSPF

应用层协议

FTP

SMTP

HTTP

电路交换circuit switching

两个结点建立一条专用物理通信路径。这一路径在整个数据传输期间一直被独占。分为连接建立,数据传输,连接释放。

Dedicated physical communication path

优点

通信时延小

有序传输

orderly transmission

没有冲突

适应范围广

实时性强

控制简单

缺点

建立连接时间长

线路独占

灵活性差:只要通信双方建立的通路中的任何一点出了故障,就必须重新拨号建立连接

难以规格化

报文交换exchange of messages

交换的单位是报文

优点

无需建立连接

动态分配线路

提高线路可靠性

提高线路利用率

Improve line utilization

提供多目标服务

缺点

转发时延

Relay delay

需要网络结点有较大的缓存空间

分组交换(packet switching):

限制了每次传送的数据块的上限,大的数据划分为合理的小数据块,加上必要的控制信息,构成分组

Large data divided into reasonably small chunks of data

优点(角度:时延,利用率,存储,出错)

无建立时延

线路利用率高

简化了存储管理(相对于报文交换)

加速传输

减少了出错概率和重发数据量

缺点

存在传输时延

需要传输额外的信息量

分类:

面向连接虚电路virtual circuits:

结合数据报与电路交换的优点,建立逻辑上相连的虚电路

三个阶段:虚电路建立、数据传输与虚电路释放

建立和拆除需要时间开销。短分组显得浪费,长时间频繁的数据交换效率较高

连接建立后,就确定了传输路径

提供可靠的通信功能

某结点故障,会导致虚电路破坏

分组首部不包括目的地址

链路可以有多条虚电路

无连接数据报unconnected datagram

不需要建立连接

尽最大可能交付

分组需要发送端和接收端的完整地址

转发时延

故障适应能力强

提高了网络的吞吐量

资源利用率高

数据链路层的功能:

将物理层提供的可能出错的物理连接改造为逻辑上无差错的数据链路

为网络层提供服务

无确认的无连接服务:适用于实时通信或误码率低的通信信道。如以太网

Acknowledgement-free, connectionless service

有确认的无连接服务:适用于误码率高的通信信道,如无线通信

Acknowledged connectionless service

有确认的面向连接服务:适用于通信要求较高的场合

Acknowledged connection-oriented services

链路管理

link management

帧定界:确定帧的界限

Frame delimitation

帧同步:接收方能从接收到的二进制比特流中区分出帧的起始与终止

Frame synchronization

透明传输:不管传什么数据都要能够传输

Transparent transfer

流量控制

差错控制

ARQ(自动重传请求)方法:发送方将要发送的数据帧附加一定的CRC冗余检错码一并发送,接收方根据检错码对数据帧进行错误检测,发现错误丢弃,发送方超时重传该数据帧

数据链路层的SAP:MAC地址

MAC地址的长度为48位(6个字节),通常表示为12个16进制数

随机访问:所有的用户能根据自己的意愿随机发送信息

核心思想:争用

随机访问介质访问控制协议又称争用型协议

ALOHA:不检测直接发送,没收到确认再发

时隙ALOHA:时间上同步,划分若干个时隙,只能在时隙开始时发送

CSMA(载波侦听多路访问):

核心思想:先听,空闲就发送

分类:

1-坚持CSMA:坚持侦听,信道空闲立刻发送

非坚持CSMA:忙就放弃侦听,一会再听,信道空闲立刻发送

p-坚持CSMA:如果空闲,以概率p发送数据,1-p推迟到下一个时隙

CSMA/CD(载波侦听多路访问/碰撞检测):

CSMA的改进,适用于总线型网络或者半双工环境。不太可能全双工通信

应用于有线连接的局域网

先听后发,边听边发(区别于CSMA协议),冲突停发,随机重发(二进制退避算法)

二进制指数退避算法等待一段时间

争用期(冲突窗口或碰撞窗口):2*单程传播时延

最小帧长:以太网规定64B,太短了无法判断是否会冲突,发出此帧的时候,前期发送的侦听帧还没回来

二进制退避算法:最多重传16次

CSMA/CA(载波侦听多路访问/碰撞避免):广播告诉其他结点,让其他结点在某段时间不要发送数据

为什么要有这个协议:无线介质实现碰撞检测硬件花费过大;“隐蔽站”

适用于无线局域网

二进制退避算法

实现方法:

预约信道:我要用多久

ACK:收到了给我个回复

RTS/CTS帧:“隐蔽站”

PPP协议:拨号或专线建立点对点连接

串行线路通信的面向字节的协议

三个组成部分:

链路控制协议LCP:建立、配置、测试和管理数据链路

网络控制协议NCP:为网络层协议建立和配置逻辑连接

一个将IP数据报封装到串行链路的方法

工作原理:为了建立点对点链路上的通信连接,发送端PPP首先发送LCP帧,以配置和测试数据链路。

在LCP建立好数据链路并协调好所选设备之后,发送端PPP发送NCP帧,以选择和配置一个或多个网络层协议。

当所选的网络层协议配置好后,便可以将各网络层协议的数据包发送到数据链路上。配置好后的链路一直保持通信状态,直到LCP帧或NCP帧明确提示关闭链路,或者有其它的外部事件发生。

PPP协议注意点:

不提供纠错功能,只保证无差错接收

仅支持点对点

只支持全双工

两端可以运行不同的网络层协议

面向字节

HDLC(高级数据链路控制协议) 一组用于在网络结点间传送数据的协议

面向比特

全双工通信,较高的数据链路传输效率

所有帧使用CRC检验,顺序编号,可靠传输

传输控制与处理功能分离,较大灵活性

基本配置:

平衡配置:一个主站控制整个链路

非平衡配置:两个站都是复合站,平等地发起数据传输

站:主站,从站,复合站

数据操作方式

正常响应方式:非平衡。主站向从站传输数据

异步平衡方式:平衡。

异步响应方式:非平衡。从站未收到主站允许也可以传输

HDLC与PPP的比较:

面向比特VS面向字节

PPP不使用序号和确认机制,只保证无差错接收。HDLC使用了编号和确认机制,可提供可靠传输

单帧滑动窗口与停止-等待协议

多帧活动窗口与GBN(后退N帧)协议

对n帧的确认表示,1~n帧均正确收到

接收窗口为1

发送窗口1≤W≤2^n-1

多帧活动窗口与选择重传协议

NAK帧:要求发送方对指定的帧重传

发送窗口+接收窗口≤2n(一般而言发送窗口=接收窗口=2(n-1))

轮询访问介质控制:令牌传递协议

主要用在令牌环局域网中

用户不能随机发送信息,而是通过一个集中控制的监控站。以循环方式轮询每个结点,再决定信道的分配

令牌在各结点间以固定次序交换

传输介质的物理拓扑不必是一个环,令牌在设备间的传递通路逻辑上必须是一个环

非常适合负载很高的广播通道:同一时刻发送数据概率很大的信道

局域网(LAN)

拓扑结构

星型

环形

总线型

星型和总线型结合的复合结构

主流传输介质:双绞线,铜缆,光纤

介质访问控制方法:

总线型CSMA/CD,令牌总线

环形局域网:令牌环

拓扑实现:

逻辑拓扑是总线型,物理拓扑是星型

令牌环:逻辑拓扑是环形,物理拓扑是星型

IEEE 802.3与以太网

物理上是星型拓扑结构

IEEE 802.3是一种基带总线形的局域网标准

通常把802.3局域网简称为以太网

以太网逻辑上采用总线型拓扑结构

以太网提供的是不可靠服务

IEEE802.11

无线局域网的一系列协议标准,MAC层采用CSMA/CA

无线局域网中,即使发生了碰撞,也要将帧发送完毕

网络层是什么:提供主机之间的逻辑通信

为不同主机提供通信服务

流量控制

拥塞控制

Congestion control

差错控制

网际交互

IPv4:

IP分组:

首部与数据组成,首部有20B固定长度。首部长度最大60B(首部长度基本单位4B)

总长度:16位。数据报最大长度=2^16-1(以太帧的MTU为1500B)。总长度基本单位1B

标识:用于组装数据报

标志:MF=1表示还有分片,MF=0表示最后一个分片。DF=0才允许分片

片偏移:某片在原分组的相对位置,8个字节为偏移单位。

首部检验和:只校验首部

IPv4地址:

***私有地址:

10全段

172.16.0.0~172.31.255.255

192.168全段

IGP:内部网关协议,域内路由选择。一个自治系统内部额所使用的路由选择协议。RIP,OSPF

EGP:外部网关协议,域间路由选择。自治系统之间所使用的路由选择协议。用于不同自治系统之间的路由器交换路由信息。BGP

路由算法:

距离向量路由算法

链路状态路由算法

距离向量路由算法(Distance vector routing algorithm)

路由选择表(routing table)包含:目的地,路径代价(距离)

RIP将距离定义为“跳数”

特点:

定期地将它们的整个路由选择表传送给所有与之直接相邻的结点

所有结点都必须参与距离向量交换

迭代计算找一个最短通路

什么时候更新路由表:发现新路由,发现更短的通路

链路状态路由算法(Link state routing algorithm)

每个参与该算法的结点都具有完全的网络拓扑信息

两项任务:

主动测试所有邻接节点的状态

定期地将链路状态传播给其他所有结点

迪杰斯特拉算法

三个特征:

向本自治系统中所有路由器发送信息:泛洪法

发送的信息是与路由器相邻的所有路由器的链路状态

只有链路状态发生变化时,路由器才向所有路由器发送此信息

优点:

每个结点计算路径不依赖于中间结点的计算

易于查找故障

链路状态报文仅运载来自单个节点关于直连链路的信息。因此链路状态算法比距离-向量算法有更好的规模可伸展性

距离-向量算法与链路状态算法的比较:

每个结点仅与它的邻居交流,仅为它的邻居提供从自己网络中所有其他结点的最低费用估计VS每个结点通过广播与所有其他结点交流,仅告诉与它直接相邻的链路的费用

距离-向量算法有可能遇到路由环路等问题

避免路由环路:

定义最大跳数(一般为15)

水平分割(horizontal segmentation),从哪个接口来的更新信息不允许再从这个接口出去

抑制计时器(suppression timer):更新的路由跳数大于已记录的跳数,启动计时器,超时前不再接受该路由更新信息

路由毒害(router poisoning):路由跳数超过定义最大跳数,向相邻路由发送信息,通知该路径失效

路由协议:

OSPF:

IGP的一种,使用迪杰斯特拉算法

LSA(链路状态通告)来在网络中的路由器之间交换网络拓扑信息

基本特点:

向本自治系统中所有路由器发送信息,使用洪泛法

发送的信息是与路由器相邻的所有路由器的链路状态

只有链路状态发生变化时,路由器才向所有路由器发送此信息

OSPF是网络层协议,直接用IP数据报发送

能适用于规模很大的自治系统中

全网范围内是一致的

灵活

多路径间的负载平衡

子网划分与CIDR

虽然能算出完整的最优路径,但路由表中不会存储完整路径。只存储“下一跳”

能将一个自治系统再划分为更小的范围

RIP

IGP的一种。应用层协议,传输层使用UDP

使用跳数,每经过一个路由器,跳数加1

一条路径最多15个路由器。距离16不可达

特点

仅和相邻路由器交换信息

交换的是当前路由器所知道的全部信息,即自己的路由表

选择最小跳数路由

缺点

限制了网络的规模

开销大,交换的是完整的路由表

慢收敛,需要较长时间才能将此信息传送到所有路由器

RIP比较OSPF

RIP发送整个路由表,OSPF发送路由表的一部分

BGP:边界网关协议。不同自治系统的路由器之间交换路由信息的协议。外部网关协议

路径向量路由选择协议,应用层协议,基于TCP

BGP的使用环境:

因特网规模太大,自治系统之间路由选择很困难

自治系统之间的路由选择,找最佳路由并不现实

自治系统之间的路由选择必须考虑有关策略

力求寻找一条能够到达目的网络且比较好的路由

工作原理:每个自治系统选出一个(或多个)路由器作为该自治系统的“BGP发言人”。发言人与发言人之间交换信息,首先要建立TCP连接

BGP支持CIDR

组播:源计算机一次发送的单个分组可以抵达用一个组地址标识的若干目标主机

主机使用IGMP的协议加入组播组,多播路由器周期性探测主机是否是组的成员

使用D类地址

组播路由选择协议——找出以源主机为根节点的组播转发树,每个分组在每条链路上只传送一次

洪泛与剪除

隧道技术

基于核心(路由器)的发现技术

移动IP的三种功能实体:移动结点,归属代理(本地代理),外部代理

通信流程:

在本地网时,采用TCP/IP通信

外地网络,向本地代理注册当前的位置,这个位置地址就是转交地址

本地代理创建一条通向转交地址的隧道

截获的发送给移动结点的IP分组通过隧道送到转交地址处。在转交地址处解除隧道封装,恢复原始IP分组,送到移动结点

回到本地网时,注销转交地址

移动IP为移动主机设置了两个IP地址。主地址与辅地址

传输层是什么(功能):提供进程之间的逻辑通信,即端到端的通信(end-to-end communication)

传输层怎么提供:端口(port),端口是传输层服务访问节点

SAP:端口

端口:应用层的各种应用进程将其数据交付给传输层,让传输层知道将其报文段中的数据向上通过端口交付给应用层的进程

UDP:

不可靠的逻辑信道

用于DNS、SNMP,TFTP,RTP(实时传输协议)

优点:

无需建立连接

无连接状态

***分组首部开销小(8B)

应用层能更好地控制要发送的数据和发送时间

特点:

尽最大努力交付

面向报文:添加首部直接交付IP层,接收方去首部原封不动交付完整报文。报文不可分割,是UDP数据报处理的最小单位

计算校验和:在UDP数据报之前加12B伪首部

TCP:

面向连接,全双工可靠的逻辑信道

TCP是面向字节流的:

TCP仅把应用程序交下来的数据看成一连串的无结构的字节流,并不知道所传输的字节流的含义,也不保证接收方应用程序收到的数据块和发送方发送的数据块的大小是否具有对应关系。即:TCP可能把应用层交下来的数据块分成几个部分发送出去,也可能把几个数据块合并成一个发送出去。在接收端也同样。

传送的数据单元:报文段

FTP,HTTP,TELNET

重传:

超时

冗余ACK(三个就重传)

TCP连接(三次握手)

SYN=1 seq=x

SYN=1,ACK=1, seq=y,ack=x+1

ACK=1 seq=x+1,ack=y+1

TCP连接的释放(四次挥手)

FIN=1,seq=x

ACK=1, seq=y,ack=x+1

FIN=1,ACK=1,seq=z,ack=x+1

ACK=1,seq=x+1,ack=z+1

TCP拥塞控制:

发送窗口的上限=接收窗口和拥塞窗口的较小值

慢开始算法:指数式增长

拥塞避免算法:加法增大,乘法减少(阈值等于当前拥塞窗口的一半)

快重传:三个ACK

快恢复:三个冗余ACK,执行“乘法减少”。把拥塞窗口设为减半后的数值,执行加法增大

HTTP响应过程:

点击URL

浏览器向DNS请求解析URL的IP地址

DNS解析出IP地址

浏览器与服务器建立TCP连接(端口80)

浏览器HTTP请求

服务器HTTP响应

TCP连接释放

浏览器解释文件,显示

操作系统

PCB

英文名称是Process Control Block,意为进程控制块,用来记录各个进程执行时的情况。
Documentation of processes at the time of implementation

进程(process)

把一个程序在一个数据集上的一次执行称为一个进程。
Call a single execution of a program on a data set a process.

作业(Job)

用户要求计算机系统进行处理的一个计算问题称为一个作业。
A computational problem that a user asks a computer system to process is called a job.

多道程序设计(Multi-channel programming)

让多个计算问题同时装入一个计算机系统的主存储器并行执行,这种程序设计技术成为多道程序设计。
allows multiple computational problems to be loaded into the main memory of a computer system and executed in parallel

中断(interrupt)

一个进程占有处理器运行时,由于自身或外界的原因使运行被打断,让操作系统处理所出现的时间,到适当的时候再让被打断的进程继续运行,这个过程称为中断。
when a process take up the CPU, it can be interrupted. Another process can use the CPU first

输入井(Input Well)

在磁盘上用来存放作业信息的专用区域称为输入井。
The area on the disk used to store job information is called the input well.

原语(primitive)

操作系统中有些能完成特定功能且不可中断的过程,这些不可中断的过程称为原语。
some operation can not be interrupted

中断响应

如有中断事件发生,暂停现行进程的执行,而让操作系统的中断处理程序占用处理器,这一过程称为中断响应。

作业调度(job scheduling)

从输入井中选取后备作业装入主存储器的工作称为作业调度。
select a job in the input well to take up the CPU

当前PSW(Program Status Word)

存放在程序状态字寄存器中的PSW是当前正在占用处理器的进程的PSW,称为当前PSW。

进程切换

把一个进程让出处理器由另一个进程占用处理器的过程称为进程切换。
process switching

时间片

允许进程一次占用处理器的最长时间。
time piece, the longest time process can taken up the CPU

进程调度

从就绪进程中选取一个进程,让它占用处理器的工作称为进程调度。
Process scheduling, pick a process from the ready process, and take up the CPU

重定位

把相对地址转换成绝对地址的工作称为重定位,也称为地转转换。
Relocation: the conversion of a relative address to an absolute address is called relocation, also known as ground conversion.

静态重定位

地址转换工作是在作业执行前集中一次完成,在作业执行过程中就无需再进行地址转换,这种定位方式称为静态重定位。
Static repositioning: address conversion work is done centrally once before the job execution, there is no need for address conversion in the process of job execution, this positioning method is called static repositioning.

分区

固定分区存储管理方式是把主存储器中可分配的用户区域预先划分成若干个连续区,每个连续区称为一个分区。
Partitioning: Fixed partitioned storage management is the pre-division of the assignable user area in the main memory into a number of contiguous zones, each contiguous zone is called a partition.

驻留区

操作系统采用覆盖技术控制作业执行时,在作业执行期间,让主段始终保留在主存中,主段所占的主存空间称为驻留区。

碎片

大的主存空间被分割成许多小的空闲区,在主存储器中形成许多不连续的空闲区,这些不连续的空闲区称为碎片。
Fragmentation: the large main memory space is divided into many small free zones, forming many discontinuous free zones in the main memory, these discontinuous free zones are called fragments.

缓冲技术

在操作系统中,把利用缓冲区来缓解处理器与外围设备之间工作速度不匹配的矛盾而采用的技术成为缓冲技术。
Buffering: In an operating system, a technique that uses buffers to mitigate a mismatch between the operating speed of the processor and peripheral devices becomes a buffering technique.

独占设备

在作业执行期间,只允许一个作业独占使用的设备称为独占设备。
Exclusive equipment: Equipment that is allowed to be used exclusively by only one job during the execution of the job is called exclusive equipment.

进程同步

多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系。异步环境下的一组并发进程因直接制约而互相发送消息、进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。
process synchronization

信号机制(Signal mechanism)

是一种使用信号来进行进程之间传递消息的方法,信号的全称为软中断信号,简称软中断(soft interruption)。信号的本质是软件层次上对中断的一种模拟(软中断)
a method of using signals to pass messages between processes

集中分布管理

对所管资源拥有完全控制权,一类资源中的每一个资源仅受控于一个资源管理者
Centralized distribution management: complete control over the resources under management, each resource in a class of resources is controlled by only one resource manager

完全分布管理

对所管资源仅有部分控制权,一类资源存在多个管理者,每一个资源都由多个管理者共同管理
Fully distributed management: only partial control over the resources under management, there are multiple managers for one type of resource, each resource is managed by multiple managers

分布式资源搜索算法

在分布式系统中使用集中分布管理资源时,搜索资源的算法。如回声、由近至远、投标等算法
Distributed resource search algorithm, Echo, Near to Far, Tender, etc. algorithms

操作系统资源管理技术

复用,虚拟和抽象(Reuse, virtual and abstract)
复用:时分复用,空分复用
虚拟:物理资源与逻辑资源的对应。如SPOOLing,虚拟内存,VFS
时间换空间:虚拟存储技术
空间换时间:SPOOLing
抽象:资源体现为接口,接口表现为一组操作

操作系统最基础的抽象

进程抽象,虚存抽象,文件抽象(Process abstraction, virtual storage abstraction, file abstraction)

进程抽象:进入内存的执行程序在处理器上操作的状态集的一个抽象。对于用户来说,就是fork(),wait()和exec(),不关心细节操作
文件抽象:设备的一种抽象。open(),write(),read(),不关心细节操作

操作系统的作用

(接口与服务,进程调度,虚拟机,管理资源)
用户接口与公共服务:改善人机界面,提供各种服务
进程执行的控制者和协调者:控制程序运行,组织工作流程
扩展机与虚拟机
资源的管理者和控制者:管理系统资源

系统调用:使用系统服务
作用:保证系统安全性,提供一致性接口

操作系统的分类

批处理操作系统(batch operating system)
批中作业输入作业队列,依次执行
关键机制是:在响应一个作业的处理结束信号时,处理器将在主存中驻留的不同作业间切换
资源利用率高,吞吐量大
作业周转时间延长,无法交互,不适合调试

分时操作系统(Time-sharing operating System)
快速响应交互式用户的命令请求
采用时间片轮转法,让处理器在多个交互式用户间多路复用
四个性质:若干用户同时使用,相互独立,得到及时的交互反馈
同时性:若干用户
独立性
及时性
交互性

实时操作系统(real-time operating system)
监控控制对象并能做出及时反应
其关键机制是:事件驱动机制,当系统接受来自外部的事件后,快速分析这些事件,驱动实时任务在规定的响应时间完成相应处理和控制
应用于数据库的查询和修改应用或生产过程控制实时应用
响应迅速,安全保密,可靠性高

分布式操作系统(distributed operating system)
具备进程通信、资源共享、并行运算、网络管理等基本功能,用于管理分布式计算机系统。
它的主要优点和特点是:坚定性强、扩充容易、可靠性好、维护方便和效率较高

操作系统:运行在内核态的,受硬件保护的软件
内核态(管态,核心态)Kernel state
用户态(目态,普通态)User state

操作系统的特征

并发(Concurrent)
共享(shared)
异步(asynchronous)(随机性)

系统调用与函数调用的区别
函数调用地址不变VS系统调用不包含入口地址
用户态VS核心态
静态调用VS动态调用
编程语言提供VS操作系统提供

特权指令(Privileged commands):仅在内核态下才能使用的指令
非特权指令(Non-privileged commands):目态与管态皆可。应用程序只能使用非特权指令

内核态与用户态:
内核态:全部机器指令允许运行
用户态转变为内核态的情况:
系统调用
中断(如I/O操作完成)
异常事件

程序状态字PSW(Program status word):指示程序状态,控制执行顺序,保留与运行相关的各种信息。实现程序状态的保护和恢复

中断:暂时中止现行程序在CPU上的运行,转而执行相应事件处理程序,待处理完成后再返回断点或调度其他程序执行的过程

硬中断:硬件发出或产生的中断
中断源分类:外中断,内中断
外中断(中断或异步中断):处理器之外的中断信号
分为可屏蔽中断与不可屏蔽中断

内中断(异常或同步中断):处理器内部的中断信号
细分为:
1.访管中断:系统调用
2.硬件故障中断:电源失效
3.程序性异常:非法操作
无法屏蔽,必须立即响应处理

中断与异常的比较:
1.中断是与当前运行程序无关的中断信号触发的,CPU与中断是异步的,CPU对于中断是完全被动的
异常是CPU控制单元产生的,与CPU同步。大部分异常发生在用户态。唯一发生在内核态的异常是“缺页异常”
2.中断要求快速处理,中断处理程序过程中不能被阻塞。异常处理程序过程中可以被阻塞
3.中断允许嵌套,异常大多数为一重

软中断:软件上模拟硬件中断

线程(threads):轻量级进程。线程是进程中能够并发执行的实体,是进程的组成部分,也是处理器调度和分派的基本单位。
线程状态:运行,就绪,等待,终止
没有挂起:线程不是资源拥有单位。对换出内存的是其所属的进程
优点:
快速线程切换
通信易于实现
减少管理开销
并发程序提高

为什么引入线程:
开销:减少程序并发执行时所付出的时空开销
并发性:使得并发粒度更细,并发性更好
分离“独立分配资源”与“被调度分派执行”

进程的两部分:资源集合和线程集合
进程映像——某时刻进程的内容及其状态集合,包括:
进程控制块
进程程序块
进程核心栈
进程数据块

为什么引入进程:
刻画系统的并发性。程序的执行不是连续的而是走走停停的。程序并发执行会引发共享和竞争问题。“程序”是个静态概念,无法描述程序的并发性
解决资源的共享性
调度的层次:
作业调度(高级调度):从外存的作业里选择作业,分配资源,建立进程,获得竞争处理机的权利,作业调度就是内存与辅存之间的调度
中级调度:内存调度。提高内存使用率和系统吞吐量。把暂时不能运行的进程调至外存,此时进程的状态为挂起态
进程调度
多线程的实现:
内核级线程(KLT):线程管理工作由内核完成。如Windows 2003,OS/2,Mach C
优点:
能够同时调度同一进程中的多线程并行运行
一个线程阻塞,其他线程(同一进程或不同进程)的运行不受影响
切换速度快
缺点:同一进程的线程切换需要内核态与用户态的转变,系统开销大

用户级线程(ULT):线程管理工作由应用程序完成。如POSIX,Java线程库
优点:
无需使用内核特权,节省开销与资源

允许实现自己的调度算法
能够运行在任何操作系统上
缺点:
一个线程阻塞,整个进程阻塞
只能执行一个用户级线程,无法得益于多线程的并发执行
混合式线程:Solaris
低级调度算法:(P101)
FCFS
SJF
SRTF(最短剩余时间优先算法)
HRRF(最高响应比优先)
优先级调度算法
RR
MLFQ(多级反馈队列)
死锁:(deadlock)
定义:一个进程集合内每个进程都在等待只能由此集合中的其他进程才能引发的事件,而无限期僵持的现象
死锁产生的原因:
进程推进顺序不当
PV使用不妥
资源分配不均
资源使用不加限制
死锁的条件:
互斥(mutually exclusive)
占有和等待(Possession and waiting)
不剥夺(non-deprivation)
循环等待(wait in a loop)
解决方法:
死锁防止
死锁避免
死锁检测和恢复
死锁预防:(Deadlock prevention)
静态分配——破坏条件占有和等待
Static allocation
按序分配,层次分配——破坏循环等待
Sequential distribution, hierarchical distribution
死锁避免(deadlock avoidance)
银行家算法——循环等待(Banker’s Algorithm - Loop Waiting)
死锁检测和恢复(Deadlock detection and recovery)
资源剥夺(Deprivation of resources)
进程回退(process regression)
进程撤销(Process revocation)
系统重启(system reboot)

进程同步与互斥的解决:
信号量
管程
消息传递

***临界区:进程中用于访问临界资源的代码。一次只允许一个程序访问
Critical section:The code used in the process to access critical resources. Only one program is allowed access at a time.

信号量PV:
信号中包括一个整形变量,和两个原子操作P和V,其原子性由操作系统保证,这个整形变量只能通过P操作和V操作改变。
P意味着信号量值减1,减完之后如果信号量值小于0,则说明资源不够用的,把进程加入等待队列。
V意味着信号量值加1,加完之后如果信号量值小于等于0,则说明等待队列里有进程,那么唤醒一个等待进程

***进程通信(IPC,Inter-Process Communication):
信号通信
信号量

管道通信

连接读写进程的一个特殊文件。允许进程按先进先出方式传送数据,也能够使进程同步执行操作

消息传递

两条原语:发送消息和接收信息

间接通信,发送或接收消息通过共享数据结构——信箱

共享内存

**源程序运行的三个阶段:

编译(compile):生成目标代码

链接

静态链接:装载前将目标模块与库函数链接装配成一个完整的可执行程序

动态链接:程序装载时一边装载一边链接

运行时链接:目标模块与库函数的链接推迟到执行时才进行

装载:装入物理空间

绝对装载:始终与内存地址相同

可重定位装载:根据内存当前状况决定放入的物理位置。使用的地址为相对地址

动态运行时装载:允许内存的程序换出到磁盘,适当时再换入内存。前后物理位置可不同。即允许进程的内存映像不同时候在不同位置

**重定位(repositioning):逻辑地址变物理地址

静态地址重定位Static address relocation

动态地址重定位

使用两个控制寄存器:基址寄存器和限长寄存器

运行时链接地址重定位

连续存储管理:

固定分区fixed partition

缺点:

必须使用覆盖技术

内存利用率不高

无法动态扩充

限制多道程序的道数

动态分区

可变分区分配算法:

最先适应:未分配区表或链表中的空闲区按地址从小到大排列

下次适应:上次扫描结束处顺序查找

最优适应:满足要求的最小分区

最坏适应:总是挑一个最大的空闲区给作业使用

快速适应:经常用到的长度的空闲区设立单独的空闲区链表

管理的数据结构:已分配区表,未分配区表

空闲区管理办法:链表

内存不足处理技术

移动:已在内存的进程分区连接到一起

对换:移出内存,把磁盘中某个进程换入内存

覆盖:执行过程中不同模块在内存中相互替代

基本实现技术是把用户控件分成固定区和一个或多个覆盖区。由程序员实现

分页存储管理Pagination storage management

一维结构,用户不可见,信息的物理单位,与逻辑单位无关

One-dimensional structure, invisible to the user

页面:逻辑地址分成大小相同的区

页框(页帧):内存物理地址分成大小相等的区,与页面大小相等

frame:The physical address of the memory is divided into equal-sized zones

页表:用于页面与页框建立联系,逻辑地址转换成物理地址。程序页面和内存页框的对照表

page table: Logical address converted to physical address

采用动态地址重定位技术

实际上是重定位寄存器的集合

物理地址=页框号*块长+页内位移

分段存储管理Segmented storage management

二维结构,用户可见。

Two-dimensional structure, user visible

信息的逻辑单位,由源程序的逻辑结构及含义决定

以段位单位来划分和连续存放,各段之间不一定连续

分段与分页存储的比较:

二维结构VS一维结构

用户可见VS用户不可见

逻辑结构VS物理结构

任意内存地址开始VS页面大小整数倍地址开始

满足用户模块化程序设计的需要VS实现离散分配并提高内存利用率

段页式存储管理系统中其虚拟地址空间是二维的

多级页表:

页表项:把整个页表分割成许多小页表

二级页表地址转换需要访问三次内存:一次页目录,一次页表项,一次指令或数据

虚拟存储管理:在具有层次结构存储器的计算机系统中,自动实现部分装入和部分替换。从逻辑上为用户提供一个比物理内存容量大的多的“内存储器”。

核心思想:局部性原理——部分装入,部分替换

Partial principle - partial loading, partial replacement

局部性:时间局部性,空间局部性

Localization: temporal localization, spatial localization

在逻辑上扩充内存

Logically expand memory

请求分页虚拟存储管理

Request paging virtual storage management

全局页面替换策略:P224

Global page replacement strategy

OPT:(OPTimal replacement)首先选择以后不再访问的页面,然后选择距离现在最长时间再访问的页面

先进先出

LRU(Least recently used)

SCR:再给你一次机会。引用位是1便放到队尾

时钟页面替换算法(Clock)

页面首次装入内存,“引用位”置1

内存的任何一个页面被访问,“引用位”置1

淘汰页面时,开始扫描,所有“引用位”为1的置0。找第一个为0的引用页面

改进Clock:

1选择最佳淘汰页面,找r=0,m=0;

2找r=0,m=1,扫描过程中把经过的r置0

实现:

请求分页虚存管理:进程信息副本放在外存,只装入当前使用页面

请求分页

实现的硬件:页表基址寄存器,TLB快表

交换区

页面装入和清除策略:

请页式和预调式

请页式和预约式(写回外存)

页面分配策略

页面替换:局部替换(作用范围局限于进程自身)和全局替换

当工作集在进程运行期间发生较大变化时,全局算法比局部算法好

固定分配与局部替换配合使用

可变分配与全局替换配合使用

请求段页

例子:

Windows的虚拟内存

Linux的交换空间

抖动(颠簸):页面被调入不久即被淘汰,淘汰不久再被调入

Shaking (bumps)

虚拟存储器和对换的比较:

虚存以段或页为单位VS对换以进程为单位

Void storage in segments or pages vs. swap in processes

I/O控制方式

轮询:查询指令——读写指令——转移指令

好了没有?好了没有?好了没有?

会中止原程序的执行。主机不能充分发挥功效,整个系统效率很低

中断

核心思想:允许I/O设备主动打断CPU的运行

不必忙式轮询

响应中断请求后必须停止现行程序

DMA(Direct Memory Access)直接存储器存取

无需CPU干预,只有当整个数据块传送结束后,处理器才被中断

CPU总是把总线占有权让给DMA,“周期窃取”,降低CPU处理效率

每发出一次I/O指令只能读写一个数据块

通道(I/O处理器)

Channel

完成内存和设备之间的信息传送,与CPU并行工作

CPU需要完成一组相关的读写操作与有关控制时,只需要向通道发送一条I/O指令。通道完成传送时向CPU发送中断请求

通道程序是由一系列通道指令所构成的

DMA与通道的区别:(通道的自主权更大)

DMA需要CPU来控制传输的数据块大小,内存位置。通道则自行控制

DMA控制器对应一台设备与内存传递数据。通道控制多台设备与内存的数据交换

磁盘调度算法:(P270)

先来先服务FCFS

最短寻找时间优先

扫描算法(必须扫描到头)

循环扫描算法(总是从0号柱面至最大号柱面顺序扫描,然后直接返回0,需要扫描到头)

分步扫描算法(分N个子队列)

电梯算法(LOOK)(不用扫描到头)

虚拟设备

原理:

缓冲区:输入缓冲区“预输入”与输出缓冲区“缓输出”

好处:

设备利用率提高

作业运行时间缩短

SPOOLing技术:独占型设备变成共享设备的一种技术

预输入:输入磁盘的输入缓冲区

pre-input

井管理

well management

井文件存放方式:连接方式与计算方式

缓输出:数据暂存磁盘的输出缓冲区

slow output

文件系统:文件与管理信息资源的管理程序的集合。按名存取。

File system: A collection of files and management procedures for managing information resources.

Access by name.

文件:信息按一定结构组成,可持久性保存的抽象机制

文件系统的优点

便于用户使用

文件安全可靠

有效地利用存储空间

文件共享

***文件存取方法

顺序存取

直接存取(随机存取)

索引存取

文件保护:

口令保护(password protection):如Window系统的进入密码

加密保护(encryption protection):使用密钥。如RAR的加密方法

访问控制:访问控制列表。如Window的用户组的实现方式

DAC(Discretionary Access Control,自主访问控制)

资源属主可以按照自已的意愿指定系统中的其他用户对其资源的访问权限的一类访问约束机制

MAC(Mandatory Access Control,强制访问控制)

用于将系统中的信息分密级和范畴进行管理,保证每个用户只能够访问那些被标明能够由他访问的信息的一种访问约束机制。MAC 比DAC 有更强的安全手段和设施,使用户不能通过意外事件和有意的误操作逃避安全控制。

文件目录:

是指:为实现“按名存取”,必须建立文件名与辅存空间中物理地址的对应关系,体现这种对应关系的数据结构称为文件目录。(百度定义)

文件目录的基本功能:文件名转变成此文件信息在磁盘上的物理位置

提高检索速度,文件共享

FCB的集合

FCB:

方便操作系统对文件的管理、控制和存取,可以实现文件的按名存取

包括:

文件名,类型,大小,位置,保护信息

***文件的逻辑结构:

流式文件:文件的数据不再组成记录

记录式文件:有结构,包含若干逻辑记录

记录式顺序文件

记录式索引顺序文件

***文件的物理结构:(逻辑文件在物理存储空间中的存放方法和组织关系)P308

顺序文件(连续文件):

逻辑上连续的信息存放到存储介质的相邻物理块上形成顺序结构。

逻辑记录顺序和物理块顺序完全一致的文件

磁带,卡片机,打印机

优点:顺序存取记录速度快

缺点:需要预先确定文件长度,插入修改文件记录有难度,变长记录处理很困难,对磁盘作连续分配会造成空闲块的浪费

连接文件

特点:使用连接字(指针)

输入井,输出井

存放信息的物理块不必连续

索引文件

散列存储,直接读写任意记录的能力,便于信息的增删改

缺点:索引表的空间开销与查找开销大

索引顺序文件:能够快速顺序处理。既允许按物理顺序又允许按逻辑顺序进行处理。

直接文件(散列文件,哈希文件)

常用的溢出处理技术:顺序探测法,两次散列法,拉链法,独立溢出区法

硬链接:文件名和自身inode链接起来

只能用于单个文件系统

可用于文件共享不能用于目录共享

实现简单,访问速度快

软链接(符号链接):只有文件名、不指向inode的链接,通过名称来引用文件

能用于链接计算机系统中不同文件系统中的文件,也可用于链接目录

缺点是搜索文件路径的开销大,需要额外的空间查找存储路径

数据结构

判断素数

直接判断
去偶数判断
只需要判断到平方根

如何在给定的整数数组中找到重复的数字?

插入排序
HashSet

重新排序数组每个数字,当扫描到数字m的时候判断下标为i的数字是否等于m:
如果是,就寻找下一个;
如果不是,就判断下标为m的对应的数字是否等于m,
如果它与第m个数字相等,就等于找到了一个重复的数字,
如果不相等就把第i个数与第m个数交换位置,把m放在其对应的下标m的位置。

例如:

首先给定数组arr[] = {2, 3, 0, 1, 3}。因为数组中最大的数是n-1,那就一个萝卜一颗坑。从0号下标位置开始,0号元素为2,不等于0,交换0号和2号位置,数组变为:
{0, 3, 2, 1, 3}。再比较0号位置,下标和值相等,往后走到1号下标元素为3,不等于1,交换1号和3号,变成:{0, 1, 2, 3, 3}。再继续,下标来到4号位置,发现元素下标与值不相等,比较4号和3号下标位置,发现元素相等,返回3即可。

如何在未排序整数数组中找到最大值和最小值?

一次遍历,2n次比较
分治法:首尾先比较,再线性找最大最小,1.5n次
参考

如何找到数组所有和等于一个给定数的数对?

直接比较
排序后比较

Hash表,看看sum-x在不在表里

如何在一次遍历中找到单个链表的中值?

如果有序:快慢指针
如果无序:开一个新空间进行排序

如何实现桶排序算法?

桶排序(Bucket sort)或所谓的箱排序,是一个排序算法。
工作的原理是将数组分到有限数量的桶里。每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。
最后依次把各个桶中的记录列出来记得到有序序列。
桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是比较排序,他不受到O(n log n)下限的影响。

如何在不使用第三个变量的情况下交换两个数字?
int a,b;
a=10;b=12;
a=b-a; //a=2;b=12
b=b-a; //a=2;b=10
a=b+a; //a=10;b=10
什么是决策树
数组和链表的区别,请详细解释

从逻辑结构来看:
a) 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;数组可以根据下标直接存取。
b) 链表动态地进行存储分配

从内存存储来看:
a) (静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小
b) 链表从堆中分配空间, 自由度大但是申请管理比较麻烦

从上面的比较可以看出,如果需要快速访问数据,很少或不插入和删除元素,就应该用数组;

相反, 如果需要经常插入和删除元素就需要用链表数据结构了。

快速排序的改进

只对长度大于k的子序列递归调用快速排序,让原序列基本有序,然后再对整个基本有序序列用插入排序算法排序。实践证明,改进后的算法时间复杂度有所降低,且当k取值为 8 左右时,改进算法的性能最佳。

选择基准元的方式
对于分治算法,当每次划分时,算法若都能分成两个等长的子序列时,那么分治算法效率会达到最大。也就是说,基准的选择是很重要的。选择基准的方式决定了两个分割后两个子序列的长度,进而对整个算法的效率产生决定性影响。最理想的方法是,选择的基准恰好能把待排序序列分成两个等长的子序列。

方法1 固定基准元
如果输入序列是随机的,处理时间是可以接受的。如果数组已经有序时,此时的分割就是一个非常不好的分割。

方法2 随机基准元
这是一种相对安全的策略。由于基准元的位置是随机的,那么产生的分割也不会总是会出现劣质的分割。在整个数组数字全相等时,仍然是最坏情况,时间复杂度是 O ( n 2 ) O(n^{2}) O(n2)。实际上,随机化快速排序得到理论最坏情况的可能性仅为 1 / ( 2 n ) 1/(2^n) 1/(2n)。所以随机化快速排序可以对于绝大多数输入数据达到O(nlogn)的期望时间复杂度。

方法3 三数取中
引入的原因:虽然随机选取基准时,减少出现不好分割的几率,但是还是最坏情况下还是O(n^2),要缓解这种情况,就引入了三数取中选取基准。

分析:最佳的划分是将待排序的序列分成等长的子序列,最佳的状态我们可以使用序列的中间的值,也就是第N/2个数。可是,这很难算出来,并且会明显减慢快速排序的速度。这样的中值的估计可以通过随机选取三个元素并用它们的中值作为基准元而得到。事实上,随机性并没有多大的帮助,因此一般的做法是使用左端、右端和中心位置上的三个元素的中值作为基准元。

选择排序算法准则

一般而言,需要考虑的因素有以下四点:
设待排序元素的个数为n.
1)当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序。
2)当n较大,内存空间允许,且要求稳定性:归并排序
3)当n较小,可采用直接插入或直接选择排序。
直接插入排序:当元素分布有序,直接插入排序将大大减少比较次数和移动记录的次数。
直接选择排序 :元素分布有序,如果不要求稳定性,选择直接选择排序
5)一般不使用或不直接使用传统的冒泡排序。
6)基数排序
它是一种稳定的排序算法,但有一定的局限性:
  1、关键字可分解。
  2、记录的关键字位数较少,如果密集更好
  3、如果是数字时,最好是无符号的

冒泡排序算法的改进
  1. 设置一标志性变量pos,用于记录每趟排序中最后一次进行交换的位置。由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只要扫描到pos位置即可。
  2. 传统冒泡排序中每一趟排序操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最终值(最大者和最小者) , 从而使排序趟数几乎减少了一半。
B树和B+树的区别,以一个m阶树为例。
  1. 关键字的数量不同;B+树中分支结点有m个关键字,其叶子结点也有m个,其关键字只是起到了一个索引的作用,但是B树虽然也有m个子结点,但是其只拥有m-1个关键字。
  2. 存储的位置不同;B+树中的数据都存储在叶子结点上,也就是其所有叶子结点的数据组合起来就是完整的数据,但是B树的数据存储在每一个结点中,并不仅仅存储在叶子结点上。
  3. 分支结点的构造不同;B+树的分支结点仅仅存储着关键字信息和儿子的指针(这里的指针指的是磁盘块的偏移量),也就是说内部结点仅仅包含着索引信息。
  4. 查询不同;B树在找到具体的数值以后,则结束,而B+树则需要通过索引找到叶子结点中的数据才结束,也就是说B+树的搜索过程中走了一条从根结点到叶子结点的路径。
    每个叶子结点都存有相邻叶子结点的指针
红黑树的定义

红黑树是一种二叉查找树,但在每个结点上增加了一个存储位表示结点的颜色,可以是RED或者BLACK。通过对任何一条从根到叶子的路径上各个着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。

当二叉查找树的高度较低时,这些操作执行的比较快,但是当树的高度较高时,这些操作的性能可能不比用链表好。红黑树(red-black tree)是一种平衡的二叉查找树,它能保证在最坏情况下,基本的动态操作集合运行时间为O(lgn)。

红黑树必须要满足的五条性质:
性质一:节点是红色或者是黑色; 在树里面的节点不是红色的就是黑色的,没有其他颜色,要不怎么叫红黑树呢,是吧。
性质二:根节点是黑色; 根节点总是黑色的。它不能为红。
性质三:每个叶节点(NIL或空节点)是黑色;
性质四:每个红色节点的两个子节点都是黑色的(也就是说不存在两个连续的红色节点); 就是连续的两个节点不能是连续的红色,连续的两个节点的意思就是父节点与子节点不能是连续的红色。
性质五:从任一节点到其每个叶节点的所有路径都包含相同数目的黑色节点。从根节点到每一个NIL节点的路径中,都包含了相同数量的黑色节点。

字典树

trie,又称前缀树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。

了解并查集吗?(低频)
什么是合并查找问题呢?

顾名思义,就是既有合并又有查找操作的问题。
举个例子,有一群人,他们之间有若干好友关系。如果两个人有直接或者间接好友关系,那么我们就说他们在同一个朋友圈中,这里解释下,如果Alice是Bob好友的好友,或者好友的好友的好友等等,即通过若干好友可以认识,那么我们说Alice和Bob是间接好友。随着时间的变化,这群人中有可能会有新的朋友关系,这时候我们会对当中某些人是否在同一朋友圈进行询问。这就是一个典型的合并-查找操作问题,既包含了合并操作,又包含了查找操作。

并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。

并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。

并查集也是使用树形结构实现。不过,不是二叉树。每个元素对应一个节点,每个组对应一棵树。在并查集中,哪个节点是哪个节点的父亲以及树的形状等信息无需多加关注,整体组成一个树形结构才是重要的。类似森林

贪心算法和动态规划的区别

贪心算法:局部最优,划分的每个子问题都最优,得到全局最优,但是不能保证是全局最优解,所以对于贪心算法来说,解是从上到下的,一步一步最优,直到最后。

动态规划:将问题分解成重复的子问题,每次都寻找左右子问题解中最优的解,一步步得到全局的最优解.重复的子问题可以通过记录的方式,避免多次计算。所以对于动态规划来说,解是从小到上,从底层所有可能性中找到最优解,再一步步向上。

https://leetcode-cn.com/problems/climbing-stairs/solution/pa-lou-ti-by-leetcode/

分治法:和动态规划类似,将大问题分解成小问题,但是这些小问题是独立的,没有重复的问题。独立问题取得解,再合并成大问题的解。

贪心算法的典型:
哈夫曼树

例子:比如钱币分为1元3元4元,要拿6元钱,贪心的话,先拿4,再拿两个1,一共3张钱;实际最优却是两张3元就够了。

区分用动态规划还是贪心:找特例

Top K问题(可以采取的方法有哪些,各自优点?)
  1. 将输入内容(假设用数组存放)进行完全排序,从中选出排在前K的元素即为所求。有了这个思路,我们可以选择相应的排序算法进行处理,目前来看快速排序,堆排序和归并排序都能达到O(nlogn)的时间复杂度。
  2. 对输入内容进行部分排序,即只对前K大的元素进行排序(这K个元素即为所求)。此时我们可以选择冒泡排序或选择排序进行处理,即每次冒泡(选择)都能找到所求的一个元素。这类策略的时间复杂度是O(Kn)。
  3. 对输入内容不进行排序,显而易见,这种策略将会有更好的性能开销。我们此时可以选择两种策略进行处理:
    用一个桶来装前k个数,桶里面可以按照最小堆来维护
    a)利用最小堆维护一个大小为K的数组,目前该小根堆中的元素是排名前K的数,其中根是最小的数。此后,每次从原数组中取一个元素与根进行比较,如大于根的元素,则将根元素替换并进行堆调整(下沉),即保证小根堆中的元素仍然是排名前K的数,且根元素仍然最小;否则不予处理,取下一个数组元素继续该过程。该算法的时间复杂度是O(nlogK),一般来说企业中都采用该策略处理top-K问题,因为该算法不需要一次将原数组中的内容全部加载到内存中,而这正是海量数据处理必然会面临的一个关卡。
    b)利用快速排序的分划函数找到分划位置K,则其前面的内容即为所求。该算法是一种非常有效的处理方式,时间复杂度是O(n)(证明可以参考算法导论书籍)。对于能一次加载到内存中的数组,该策略非常优秀。
Bitmap的使用,存储和插入方法

BitMap从字面的意思,很多人认为是位图,其实准确的来说,翻译成基于位的映射。
在所有具有性能优化的数据结构中,大家使用最多的就是hash表,是的,在具有定位查找上具有O(1)的常量时间,多么的简洁优美。但是数据量大了,内存就不够了。
当然也可以使用类似外排序来解决问题的,由于要走IO所以时间上又不行。
所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。
其实如果你知道计数排序的话(算法导论中有一节讲过),你就会发现这个和计数排序很像。

BitMap应用:排序示例

假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么我们就可以采用Bit-map的方法来达到排序的目的。要表示8个数,我们就只需要8个Bit(1Bytes),首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0

然后遍历这5个元素,首先第一个元素是4,那么就把4对应的位置为1(可以这样操作 p+(i/8)|(0×01<<(i%8)) 当然了这里的操作涉及到Big-ending和Little-ending的情况,这里默认为Big-ending。不过计算机一般是小端存储的,如intel。小端的话就是将倒数第5位置1),因为是从零开始的,所以要把第五位置为一(如下图):

然后再处理第二个元素7,将第八位置为1,,接着再处理第三个元素,一直到最后处理完所有的元素,将相应的位置为1,这时候的内存的Bit位的状态如下:

然后我们现在遍历一遍Bit区域,将该位是一的位的编号输出(2,3,4,5,7),这样就达到了排序的目的。

bitmap排序复杂度分析

Bitmap排序需要的时间复杂度和空间复杂度依赖于数据中最大的数字。

bitmap排序的时间复杂度不是O(N)的,而是取决于待排序数组中的最大值MAX,在实际应用上关系也不大,比如我开10个线程去读byte数组,那么复杂度为:O(Max/10)。也就是要是读取的,可以用多线程的方式去读取。时间复杂度方面也是O(Max/n),其中Max为byte[]数组的大小,n为线程大小。

空间复杂度应该就是O(Max/8)bytes吧

BitMap算法流程

假设需要排序或者查找的最大数MAX=10000000(lz:这里MAX应该是最大的数而不是int数据的总数!),那么我们需要申请内存空间的大小为int a[1 + MAX/32]。

其中:a[0]在内存中占32为可以对应十进制数0-31,依次类推:

bitmap表为:

a[0]--------->0-31

a[1]--------->32-63

a[2]--------->64-95

a[3]--------->96-127

我们要把一个整数N映射到Bit-Map中去,首先要确定把这个N Mapping到哪一个数组元素中去,即确定映射元素的index。我们用int类型的数组作为map的元素,这样我们就知道了一个元素能够表示的数字个数(这里是32)。于是N/32就可以知道我们需要映射的key了。所以余下来的那个N%32就是要映射到的位数。

1.求十进制数对应在数组a中的下标:
先由十进制数n转换为与32的余可转化为对应在数组a中的下标。
如十进制数0-31,都应该对应在a[0]中,比如n=24,那么 n/32=0,则24对应在数组a中的下标为0。又比如n=60,那么n/32=1,则60对应在数组a中的下标为1,同理可以计算0-N在数组a中的下标。
i = N>>K % 结果就是N/(2^K)
Note: map的范围是[0, 原数组最大的数对应的2的整次方数-1]。

2.求十进制数对应数组元素a[i]在0-31中的位m:
十进制数0-31就对应0-31,而32-63则对应也是0-31,即给定一个数n可以通过模32求得对应0-31中的数。
m = n & ((1 << K) - 1) %结果就是n%(2^K)

3.利用移位0-31使得对应第m个bit位为1
如a[i]的第m位置1:a[i] = a[i] | (1<<m)
如:将当前4对应的bit位置1的话,只需要1左移4位与B[0] | 即可。

BitMap算法评价
优点:

  1. 运算效率高,不进行比较和移位;
  2. 占用内存少,比如最大的数MAX=10000000;只需占用内存为MAX/8=1250000Byte=1.25M。
    缺点:
  3. 所有的数据不能重复,即不可对重复的数据进行排序。(少量重复数据查找还是可以的,用2-bitmap)。
  4. 当数据类似(1,1000,10万)只有3个数据的时候,用bitmap时间复杂度和空间复杂度相当大,只有当数据比较密集时才有优势。
为什么要使用红黑树,B树和B+树

B/B+树是为了磁盘或其它存储设备而设计的一种平衡多路查找树(相对于二叉,B树每个内节点有多个分支),与红黑树相比,在相同的的节点的情况下,一颗B/B+树的高度远远小于红黑树的高度(在下面B/B+树的性能分析中会提到).B/B+树上操作的时间通常由存取磁盘的时间和CPU计算时间这两部分构成,而CPU的速度非常快,所以B树的操作效率取决于访问磁盘的次数,关键字总数相同的情况下B树的高度越小,磁盘I/O所花的时间越少.

数据库索引采用B+树的主要原因是:B树在提高了IO性能的同时并没有解决元素遍历的效率低下的问题,正是为了解决这个问题,B+树应用而生.B+树只需要去遍历叶子节点就可以实现整棵树的遍历.而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作(或者说效率太低)。

https://baijiahao.baidu.com/s?id=1651803445417553212&wfr=spider&for=pc

并查集原理

话说在江湖上有很多门派,这些门派相互争夺武林霸主。毕竟是江湖中人,两个人见面一言不合就开干。但是打归打,总是要判断一下是不是自己人,免得误伤。
于是乎,分了各种各样的门派,比如说张无忌和杨过俩人要打架,就先看看是不是同一门派的,不是的话那就再开干。要是张无忌和杨过觉得俩人合得来,那就合并门派。
而且规定了,每一个门派都有一个掌门人,比如武当派就是张三丰。华山派就是岳不群等等。

现在我们把目光转到并查集上。
(1)张无忌和杨过打架之前,先判断是否是同一门派,这就涉及到了并查集的查找操作。
(2)张无忌和杨过觉得俩人合得来,那就合并门派,这就涉及到了并查集的合并操作。
(3)每一个门派都有一个掌门人,这涉及到了并查集的存储方式。掌门人代表了这个门派的根节点。
现在我们从这个例子的思想开始认识一下并查集。

数据库

2019

Part l 数据库名词及概念简答:(5题,每题6分,共30分)

1.解释数据库中的约束

primary key:设置主键约束
foreign key :设置外键约束
not null:设置非空约束,该字段不能为空
unique:设置唯一性约束,不能有重复值
default 默认值约束,height double(3,2) default 1.2 height不输入是默认为1,2

2.描述(身份证、生日)可以达到的范式等级

任何一个二元关系都满足BCNF,关系模式R<U,F>∈1NF。若X→Y且Y不是X的子集时,X必含有码,则R<U,F>∈BCNF

3.简述SQL执行的过程

语法检查:检查 SQL 拼写是否符合语法规范
语义检查:检查访问对象是否符合存在及用户是否具有相应权限
解析:在共享池中检查是否有完全相同的之前完全解析好的,如果存在,跳过选择执行计划和产生计划,直接运行
硬解析:就是对提交的 SQL完全重新从头进行解析,创建解析树,生成执行计划对 SQL 的执行来说是开销昂贵的动作,在很多项目中对功能相同的代码要保持一致性,用绑定变量
软解析:在共享池(shared pool)中找到了与之完全相同的 SQL 解析好的结果会跳过硬解析后面的两个步骤
执行计划:以缩排列表的方式显示 SQL 语句的执行步骤

4.描述堆结构,存储、修改的过程

5.解释空值的含义以及它们在不同数据库中的实现

空值就是“不知道”或“不存在”或“无意义”的值。

Part ll SQL编程题:(3题,前两题每题15分,第三题10分,共40分)

某商场部分关系模式如下:
店铺表store(store_id, store_name, store_floor, room_no)
商品表commodity(com_id, com_name, com_price, store_id)
销售员表saler(saler_id, saler_name, saler_gender, saler_age, store_id)
流水账单表bill(bill_id, saler_id, com_id, purchase_quantity, total_price, bill_time)
其中,店铺表记录了该商场入驻的店铺信息,商品为每个店铺中销售的商品信息,销员为店铺中的工作人员,流水账单表为为商场收银台交易的纪录,bill_time交易发生的时间,为 datetime类型,每个流水账单只包含了一种商品,不同类商品为不同的账单,purchase_quantity 数量为正整数。
(1)在生成账单记录时,total_price是由传入的com_id和purchase_quantity查询到相关的单价以及数量计算出来的,请完成这样一条插入。

/**
* saler_id_in 销售人员id
* com_id_in 商品id
* purchase_quantity_in 购买数量
*/
create procedure insert(saler_id_in int,com_id_in int, purchase_quantity_in int)
begin
	declare com_price float  //商品价格
	declare total_price float//总价格
	
	com_price=select com_price
		from commodity 
		where com_id=com_id_in
	total_price=com_price*purchase_quantity_in
	
	insert into bill(saler_id, com_id, purchase_quantity, total_price, bill_time) 
	values(saler_id_in,com_ id_in, purchase_quantity_in, total_price,now())
end


set @saler_id_in=...
set @com_id_in=...
set @purchase_quantity_in=...
call insert(@saler_id_in, @com_id_in, @purchase_quantity_in)

(2)A店铺的老板想要了解一下店铺员工每天的销售业绩,请查询store_id为"MCS_A"的店铺里的所有员工在2015年11月11日的完成的交易笔数,以及每个员工完成的总交易额。

/**
* 每个员工完成的交易笔数
* 每个员工完成的交易额
* 要有每个员工,所以需要左外连接
*/
select count(bill.*)
from bill,saler
while date(bill.bill_time)='2015-11-11'
	and saler.store_id='MCS_A'
	and bill.saler_id=saler.saler_id

select s.saler_id, s.saler_name, count(bill_id), sum(total_price)
from saler s, bill b
where s.store_id='MCSA'
	and date_format(bill_time,'%Y-%m-%d')='2015-11-11'
	and s.saler_id=b.saler_id 
union
select saler_id, saler_name, 0 as bill_count, 0 as bill_total 
from saler
where store_id='MCSA' 
	and saler_id  not in(
		select saler_id 
		from bill 
		where date_format(bill_time, '%Y-%m-%d')='2015-11-11'
	)

(3)商场的管理人员想了解2015年11月11日哪个店铺的交易额最大,查询其店铺名称,店铺所在楼层,店铺编号以及当天的交易额。

select store_name,store_floor,room_no,sum(total_price)
from store,saler,bill
where store.store_id=saler.store_id
	and saler.saler_id=bill.saler_id
	and date_formate(bill_time,'%Y-%m-%d')='2015-11-11'
group by store_id
order by sum(total_price)
limit 0,1

select store_id, store_name, store_floor, room_no, sumPrice 
from (
	select t.store_id, store_name, t.store_floor, t.room_no, sum(total_price) as sumPrice
	from store t, saler s, bill b
	where t.store_id=s.store_id
		and s.saler_id=b.saler_id
		and date_format(bill_time, '%Y-%m-%d')='2015-11-11'
	group by t.store_id
) as T
where T.sumPrice=max(T.sumPrice)

教师表teacher(teacher_id, teacher_name, teacher_email, teacher_gender, teacher_title)
课程表course(course_id, course_name, teacher_id, term,year)
学生表student(student_id, student_name,student_grade, student_gender)
选课情况course_election(ce_id, course_id, student_id, marks)
其中,教师表中 teacher_ title为教师的职称,课程表中term为学期,year为年份,如2015年第一学期,则 term为1,year为 2015,学生表中student_grade为所在年级。
(1)辅导员想了解其所在年级学生的课程选修数量是否合理,请查询该院系每个三年级学生
2015年第一学期的选修课程数量,查询学生的student_id, student_name,student_grade,以及选修的课程数量。

select s.student_id,student_name,student_grade,count(s.student_id)
from student s,course_election ce,course c
where s.student_id=ce.student_id
	and ce.course_id=c.course_id
	and student_grade='三年级'
	and c.year=2015
	and c.term='第一学期'
group by s.student_id

(2)为了方便查询,希望创建一个课程视图,包括2015年第一学期的所有课程,包含课程
表的所有字段,以及每门课的总选修人数。若没人选修,则选修人数为0。

create view course_view as (
	select c.* count(c.course_id)
	from course c
	left join on c.course_id=ce.course_id
	group by c.course_id
)

(3)教务处现在进行了一些修改,当有不及格的成绩录入时,需要对成绩进行规范处理。对
于低于60分的成绩按照60分算,使用触发器完成相应的要求。

create trigger grade_trigger
before insert or update on course_election
for each row
begin
	if new.marks<=60
	then new.marks=60
	end if
end

Part IlI 论述题:(3题,每题10分,共30分)

1.解释SQL优化原理及背后的逻辑

2.a. B*结构应用有哪些类型?
b. 当要通过索引访问表中很少一部分行,如果要处理表中多行,可以使用索引而不使用表,谈谈对以上两点的理解。
c.对上述结构常见的优化有哪些?

4.a.反范式打破范式的模式有哪些?
b.描述树状结构的存储,并分析它们的查询效率。

5.简述数据库的发展历史及其原因。

2018

Part l 数据库名词及概念简答:(5题,每题6分,共30分)

1)关系数据库(Relational DataBase)中的关系(Relational)的具体含义是什么?

一个关系对应通常说的一张表

2)对表的外键构建索引的做法非常普遍,已被认为是常识,这样做会避免出现哪些问题?

为确保数据的完整性,在对主表操作时,需要对参照表进行加锁操作。
如果外键没有索引,查找子记录就会很慢,且参照表被锁的时间很长,进而使很多更改操作阻塞,甚至可能发生死锁。

3)什么是分区(Partition)?根据分区键( Partition Key)的类型分类,分区有哪几种类型?

分区就是将一个大表根据条件分割成若干个小表,是一种数据分组方式。
哈希分区:把不同的列随机平均的分布到不同的物理环境,达到备份和恢复(写 undo 和 redo文件)效率高,降低错误回滚压力(为了管理)。
范围分区:把字段的值分布到一个物理范围,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的。
列表分区:把不同的列存到不同的物理环境,某列的值只有几个,容易按值进行分区。

4)数据库的第一范式、第二范式、第三范式各是什么含义?还有哪些范式,请描述其含义?

若关系模式R的每一个分量是不可再分的数据项,则关系模式R∈1NF
若关系模式R∈1NF,且每一个非主属性完全函数依赖于码,则关系模式R∈2NF。(即1NF消除了非主属性对码的部分函数依赖则成为2NF)。
设关系模式R<U,F>∈1NF,若关系模式R<U,F>中不存在这样的码X,属性组Y及非主属性Z(Z不是Y的子集)使得X→Y,Y→Z成立,则称R<U,F>∈3NF
关系模式R<U,F>∈1NF。若X→Y且Y不是X的子集时,X必含有码,则R<U,F>∈BCNF
关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y不是X的子集,Z=U-X-Y不为空),X都含有码,则称R<U,F>∈4NF

5)什么是索引?很多数据库使用B树索引,这种索引的结构是怎样的?能适合怎样的查询?

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。是一种以原子粒度访问数据的手段,而不是为了大量数据的访问。是一种数据访问方式;索引是顺序存取。
B树索引的结构:由根指向子节点,B树将索引按顺序存储,在叶节点保存索引到字段及其对应数据在表中的位置指针。从根节点开始搜索,通过节点中的指针进入下一级节点,通过比较要查找的索引值和节点中的指针大小选择进入哪个子节点,最终要么找到对应叶节点,要么没找到。叶节点中有指向表中数据的指针。
何时使用
a、仅需要索引访问表中很少一部分行时,索引提供以原子粒度访问数据的功能,可以快速定位所查找数据的位置;
b、虽然查询行数比较多,当索引包含多个字段,而要访问的字段全部包含在索引中时,查找只需通过索而不用访问全表时。

Part ll SQL编程题:(3题,前两题每题15分,第三题10分,共40分)

以下题目请用单独SQL语言描述,因为不同数据库的差异,可以使用Oracle、MySQL、SQL Server、DB2、PostgreSQL,请在你完成的SQL中对你使用的数据库进行标识。
1)考虑下面的关系模式、一个雇员可以在多个部门工作,works关系的pic_time字段表明了一个指定的员工在指定的部门工作的时间比率。(15分)
Emp (eid, ename,age, salary)
Works (eid, did, pct_time:integer)
Dept (did, budget, managerid)
用SQL写出下列查询:
1.1)同时工作于“硬件”和“软件”两个部门的每个雇员的名字和年龄

select ename,age
from Emp,Works,Dept
where (budget='硬件' or budget='软件')
and Works.did=Dept.did
and Works.eid=Emp.eid;


select e.ename, e.age
from Emp e
left join Works w on w.eid = e.eid
where w.did in (
	select d.did
	from Dept d 
	where d.dname = "软件" 
	or d.dname = "硬件"
);

1.2)找出那些工资超过他(或她)所在部门预算20%的雇员

select *
from Emp
having salary>1.2*average(salary);

select *
from Emp e
left join Works w on w.eid = e.eid
left join Dept d on d.did = w.did
where e.salary >= d.budget*1.2;

1.3)找出预算最高的前五个部门管理者的managerids
1.4)如果一个管理者管理多个部门,那么他控制的部门预算就是这些部门的预算的总和,找出控制预算超过50万的管理者的managerids。

2)考虑以下数据库设计模式:
EMP(EMPNO, ENAME, JOB, HIREDATE, SAL,DEPTNO)
DEPT(DEPTNO,DNAME, LOC)
2.1)计算DNAME = 'Research Institute'的员工工资的“中位数”。
所谓中位数是指:一组按照大小排列起来的数据中处于中间位置的数,当有奇数个(如17个)数据时,中间数就是中间那个数(第9个);当有偶数个(如18个)数据时,中间数就是中间那两个数的平均值(第9个和第10个的平均值)

select 
from DEPT
where 

2.2)求第一个员工和最后一个员工聘用(HIREDATE)之间相差的月份数,以及这些月折合的年数。

select timestampdiff(month,max(HIREDATE),min(HIREDATE)) month,
	timestampdiff(month,max(HIREDATE),min(HIREDATE))/12 year
from EMP

2.3)计算2017年中周内各日期(星期日、星期一…期六)的次数。(完全用SQL完成,可以分成多步骤完成,包括构建数据表和查询计算结果)

//创建表,用来存储2017年所有的天
create table week (
	date_no int identity(1,1) primary key,
	date_in_year datetime,
	weekday varchar(100)
)
//插入2017年的所有数据
delimiter $$  //定义结束符号
create procedure insert_calendar(s_date DATE, e_date DATE)
begin
	declare insertdayofweek int;
	declare dateofweek varchar(100);
	while s_date <= e_date DO
		dateofweek=DAYOFWEEK(s_date);//求是一个星期的第几天
		if  dateofweek=1  then insertdayofweek='星期日'
		else if dateofweek=2 then  insertdayofweek='星期一'
		else if dateofweek=3 then  insertdayofweek='星期二'
		else if dateofweek=4 then  insertdayofweek='星期三'
		else if dateofweek=5 then  insertdayofweek='星期四'
		else if dateofweek=6 then  insertdayofweek='星期五'
		else if dateofweek=7 then  insertdayofweek='星期六'
		end if
		insert into week(dateInYear, weekday) values(s_date, dateofweek);
		set = s_date + INTERVAL 1 DAY;
	end while
end $$

call insert_calendar('2017-01-01','2017-12-31')$$

2.4)计算每个品T的 DFPTNO、 FNAMF和<AI 以及与同一部门(DFPTNO侑相同的)员工之间的 SAL的差。该差值在当前员工及同部门内紧随其后的员工之间计算而来,对最聘用的员工这个差值是 N/S。


3)考虑以下数据库设计模式,orderstatus 是记录订单状态的表,主键是 oid 和 status 的复合键,订单
包含多种状态,同事某一订单可能会有某一状态多次出现的情况,比如换货的过程。
Customers(cid, cname, city)
Orders(oid,cid,date)
Orderstatus(oid,status,statusdate)
请完成查询,列出所有尚未标记为完成状态的订单的以下字段:oid,canme,订单的最后状态 status
以及设置状态的时间 statusdate。

Part IlI 论述题:(3题,每题10分,共30分)

1)集中式数据库和分布式数据库,谁的效率更高?它们各有怎样的特征和应用场景?适合的不同应用有哪些?
2)对树状数据的数据构建关系模型,有哪些方式,请举例说明?需要描述表结构设计,同时需要考虑单父节点和多父节点的多种树状结构类型,针对单父节点的树状结构需要描述至少三种数据库表结构设计模式,多父节点树状结构至少需要描述一种数据库表结构设计。
3)请描述锁机制和多种锁类型(至少三种),并举例说明以及描述其应用场景?大部分锁机制都是数据库配置后自动执行,但请举例描述哪些情况下,必须由程序员利用程序语言控制并发更新?
提示:树状结构:Adjacency model-邻接模型、物化路径模型、嵌套集合模型

2017

2016

2015

提示:树状结构:Adjacency model-邻接模型、物化路径模型、嵌套集合模型

SQL

SQL

Discuss(user1, user2, topic)
(1)SQL:所有被Alice和Bob讨论但不被Alice和Crowe讨论的话题

select topic 
from Discuss 
where user1='Alice' 
	and user2='Bob'
except
select topic 
from Discuss 
where user1='Alice' 
	and user2='Crowe'

intersect(交)
(2)SQL:被超过10对用户讨论的话题的个数

select count(*) from (
	select topic 
	from Discuss
	group by topic
	having count(*)>10
) as T

职员表EMP(eno,ename,job,hire,salary,dno)
eno是员工编号,dno是部门编号,hire是雇佣日期就是进公司的日期。
部门表DEPT(dno,dname,loc)
①dname=RI的员工工资的中间数。中间数就是若有九个员工,将员工工资从大到小排列,中间数就是第五个,若有十个就是从大到小排列的第五和第六个数的平均数。

set @id=-1
select avg(salary) from(
	select @id:=@id+1 as id, salary 
	from dept d, emp e
	where d.dno=e.dnp=o and dname='RI'
	order by salary
) as t
where t.id in(
	FLOOR(@id/2),
	CEIL(@id/2)
)
set @id=0
select avg(salary) from(
	select @id:=@id+1 as id, salary 
	from dept d, emp e
	where d.dno=e.dnp=o and dname='RI'
	order by salary
) as t
where  IF(
	ID%2=0,
	ID in (
		ROUND(@ID/2,0),@ID/2 + 1), 
		ID=ROUND(@ID/2,0
	)
)

ceil() / ceiling() 向上取整
ex: ceil(1.2) = 2
2.floor() 向下取整
ex: floor(1.2) = 1
3.round() 四舍五入
select时必须用“:=赋值”
③每个部门第一个进部门和最后一个进部门的员工的时间上的时间差换算成年是差几年,换算成月又是差几个月。

select hire into @firstdate from emp order by hire limit 0,1

另一种写法:

select  @firstdate:=hire from emp order by hire limit 0,1
select hire into @lastdate from emp order by hire desc limit 0,1

desc从大到小排列

select TIMESTAMPDIFF(YEAR,DATE_FORMAT(@firstdate,'%Y-%m-%d'),DATE_FORMAT(@lastdate,'%Y-%m-%d'))
select TIMESTAMPDIFF(MONTH,DATE_FORMAT(@firstdate,'%Y-%m-%d'),DATE_FORMAT(@lastdate,'%Y-%m-%d'))

Emp(eid, ename, age, salary)
Works(eid, did, pct_time)
Dept(did,dname , budget, managerid)
1.1)同时工作于“硬件”和“软件”两个部门的每个雇员的名字和年龄

select e.ename, e.age 
from emp e, works w, dept d
where e.eid=w.eid 
	and d.did=w.did
	and dname='硬件'
intersect
select e.ename, e.age from emp e, works w, dept d
where e.eid=w.eid 
	and d.did=w.did
	and dname='软件'

2)考虑以下数据库设计模式:
EMP(EMPNO, ENAME, JOB, HIREDATE, SAL, DEPTNO)
DEPT(DEPTNO, DNAME, LOC)
2.2)求第一个员工和最后一个员工雇佣(HIREDATE)之间相差的月份数,以及这些月折合的年数

select timestampdiff(MONTH, MIN(e.HIREDATE), MAX(e.HIREDATE)) month,
	TIMESTAMPDIFF(MONTH, MIN(e.HIREDATE), MAX(e.HIREDATE))/12 year
FROM EMP e

2.3)计算2017年中周内各日期(星期日、星期一…星期六)的次数(完全用SQL完成,可以分成多步骤完成,包括构建数据表和查询计算结果)

create table week(
	dateno int identity(1,1) primary key,
	dateInYear datetime,
	weekday varchar(100)
)

delimiter $$

create procedure insert_calendar(s_date DATE, e_date DATE)

begin
	declare insertdayofweek int;
	declare dateofweek varchar(100);
	while s_date <= e_date DO
		dateofweek=DAYOFWEEK(s_date);
		if  dateofweek=1  then insertdayofweek='星期日'
		else if dateofweek=2 then  insertdayofweek='星期一'
		else if dateofweek=3 then  insertdayofweek='星期二'
		else if dateofweek=4 then  insertdayofweek='星期三'
		else if dateofweek=5 then  insertdayofweek='星期四'
		else if dateofweek=6 then  insertdayofweek='星期五'
		else if dateofweek=7 then  insertdayofweek='星期六'
		end if
		insert into week(dateInYear, weekday) values(s_date, dateofweek);
		set = s_date + INTERVAL 1 DAY ;
	end while
end 
$$ delimiter

call insert_calendar('2017-01-01','2017-12-31')

select weekday,count(*) 
from week 
group by weekday
order by weekday

2.4)计算每个员工的DEPTNO、ENAME和SAL以及同一部门(DEPTNO值相同的)员工之间的SQL的差。该差值在当前员工及同部门内紧随其后的员工之间计算而来,(对最新聘用的员工这个差值是N/S,没看懂这句什么意思)

select A.DEPTNO,A.SAL, A.SAL-B.SAL as SAL1
from(
	select a.*,(@i := @i + 1) as ord_num 
	from EMP a,(select @i:= 0) d 
	order by DEPTNO,
	HIREDATE desc
) as A 
LEFT JOIN (
	select a.*,(@j := @j + 1) as ord_num 
	from EMP a,(select @j := 1) c 
	order by DEPTNO,
	HIREDATE desc
)as B on A.ord_num=B.ord_num and A.DEPTNO=B.DEPTNO

3)考虑以下数据库设计模式,orderstatus是记录订单状态的表,主键是oid和status的复合键,订单包含多种状态,同时某一订单可能会有某一状态多次出现的情况,比如换货的过程。
Customers(cid, cname, city)
Orders(oid, cid, date)
Orderstatus(oid, status, statusdate)
请完成查询,列出所有尚未标记为完成状态的订单的以下字段:oid,cname, 订单的最后状态status以及设置状态的时间 statusdate

select c.cname, oo.oid, oo.`status`, oo.statusdate
from Orderstatus oo
left join Orders o on o.oid = oo.oid
left join Customers c on c.cid = o.cid
where oo.statusdate in(
select max(statusdate) from Orderstatus t group by t.oid) and oo.status != '完成';
select c.cname, a.*
from Orderstatus a, (select oid, max(statusdate) as statusdate from Orderstatus group by
oid) b
left join Orders o on o.oid = b.oid
left join Customers c on c.cid = o.cid
where a.oid = b.oid and b.statusdate = a.statusdate and a.status != '完成';

某商场部分关系模式如下
店铺表store(store_id, store_name, store_ floor, room_no)
商品表commodity(com_id, com_name, com_price, store_id)
销售员表saler(saler_id, saler_name, saler__gender, saler__age, store_id)
流水账单表 bill(bill_id, saler_id, com_id, purchase_quantity, total_price, bill_time)
其中,店铺表记录了该商场入驻的店铺信息,商品为每个店铺中销售的商品信息,销售员为店铺中的工作人员,流水账单表为为商场收银台交易的纪录, bill time交易发生的时间,为 datetime类型,每个流水账单只包含了一种商品,不同类商品为不同的账单,purchase_ quantity数量为正整数
(1)在生成账单记录时, total_price是由传入的 com_ id和 purchase_quantity查询到相关的单价以及数量计算出来的,请完成这样一条插入

create procedure insert(saler_id_in int,com_ id_in int, purchase_quantity_in int)
begin
declare com_price float
declare total_price float
com_price=select com_price from commodity where com_id=com_ id_in
total_price=com_price*purchase_quantity_in

insert into bill(saler_id, com_id, purchase_quantity, total_price, bill_time) values(saler_id_in,com_ id_in, purchase_quantity_in, total_price,now())
end
set @saler_id_in=...
set @com_ id_in=...
ser @purchase_quantity_in=...
call insert(@saler_id_in, @com_ id_in, @purchase_quantity_in)

(2)A店铺的老板想要了解一下店铺员工每天的销售业绩,请查询 store_id为"MCSA"的店铺里的所有员工在2015年11月11日的完成的交易笔数,以及每个员工完成的总交易额

select count(total_price) as dealCount, sum(total_price) as sum from saler s
left join bill b on s.saler_id=b.saler_id
where store_id='MCSA' and date(bill_time)='2015-11-11'
select s.saler_id, s.saler_name, count(bill_id) as bill_count, sum(total_price) as bill_total from saler s, bill b
where s.store_id='MCSA' and s.saler_id=b.saler_id and date_format(bill_time, '%Y-%m-%d')='2015-11-11'
union
select saler_id, saler_name, 0 as bill_count, 0 as bill_total from saler
where store_id='MCSA' and saler_id  not in(
select saler_id from bill where date_format(bill_time, '%Y-%m-%d')='2015-11-11')

商场的管理人员想了解2015年11月11日哪个店铺的交易额最大,查询其店铺名称,店铺所在楼层,店铺编号以及当天的交易额。

select store_id, store_name, store_floor, room_no, sumPrice from 
(select t.store_id, store_name, t.store_floor, t.room_no, sum(total_price) as sumPrice
from store t, saler s, bill b
where t.store_id=s.store_id
and s.saler_id=b.saler_id
and date_format(bill_time, '%Y-%m-%d')='2015-11-11'
group by t.store_id) as T
where T.sumPrice=max(T.sumPrice)

四、(代码题。本题满分20分。)
教师表teacher(teacher_id, teacher_name, teacher_email, teacher_gender, teacher_title)
课程表course(course_id, course_name, teacher_id, term, year)
学生表student(student_id, student_name, student_grade, student_gender)
选课情况course_election(ce_id, course_id, student_id, marks)
(2)为了方便查询,希望创建一个课程视图,包括2015年第一学期的所有课程,包含课程表的所有字段,以及每门课的总选修人数。若没人选修,则选修人数为0

create view as
select c.course_id, c.course_name, c.teacher_id, c.term, c.year, count(ce_id) as sumPeople from course c
left join course_election ce on ce.course_id=c.course_id
group by c.course_id

(3)教务处现在进行了一些修改,当有不及格的成绩录入时,需要对成绩进行规范处理。对于低于60分的成绩按照60分算,使用触发器完成相应的要求

create trigger grade_trigger
before insert or update on course_election
for each row
begin
if new.marks<=60 then
new.marks=60
end if;
end;

设有一个公司内部信息管理数据库,其关系模式如下:
职工E(工号eno,姓名 ename,年薪 salary,部门编号dno)
项目P(项目编号pno,项目名称 pname,所在城市cy,负责部门编号dno)
工作W(职工工号eno,项目编号pno,工作时间 hours)
职工家属R(职工工号eno,家属的姓名name,家属的性别sex)
4)在每一个部门中查询其年薪收入最高的职工,结果返回部门编号和该部门中年薪收入最高职工的工号。

select t.eno from(
	select eno,ename,salary,dno 
	from e 
	order by salary desc
) t
GROUP BY t.dn
select eno from e where (eno,salary) in(

select eno , max(salary) as salary from e group by dno)

https://leetcode-cn.com/problems/department-highest-salary/

create view am_sum(aid, year, month, m_sum) as

select aid, year, month, sum(dols)
from O
group by aid, year, month

有一个船员租赁船只的系统,表结构如下:
Sailors(sid, sname, rating, age);
Boats(bid, bname, color);
Reaserves(sid, bid, day)
2)找出年龄在35岁以上,rating>5的,一个月内,同时预定了红色船和绿色船的水手姓名(8)

select sname from Sailors s, Boats b, Reaserves r
where s.sid=r.sid and b.bid=r.bid and sysdate-day<=30 and color='red' and rating>5
Intersect
select sname from Sailors s, Boats b, Reaserves r
where s.sid=r.sid and b.bid=r.bid and sysdate-day<=30 and color='green' and rating>5

3)找出预定了所有船的水手的名字(附加题5分)

select s.name from Sailors where s.sid in (
select distinct(r.sid) from Reaserves r group by r.sid 
having count(distinct(r.bid))=(select count(*) from Boats))

select s.sname from Sailor s
          where not exits (
          Select null from Reaserves r
             Where r.sid = s.sid and not exits(
                Select null from Boats b where b.bid = r.bid) )

六、(代码题。本题满分20分。)
假设: Circo是一款面向于大学生的群组类的社交应用,致力于让同学们能够体验到校园生活更加有趣有活力的一面,营造和谐自然的校园氛围。在这里,你可以关注与自己志同道合的小伙伴(User),发布实时动态( Moment),创建或者加入各种各样有趣的兴趣圈子( Group),在圈子内Po上自己的美丽心情(red),参与各种话题( Topic)的讨论

其中涉及到一些实体数据表和属性,包括
用户User 编号_id,昵称 nickname,头像 avatar,学校编号 schooled,创建时间 createdAt
学校 School 编号_id,学校名name
新鲜事 Moment 编号_id,发布者编号 author,文字内容 content,图片 Image,创建时间createdAt
新鲜事的点赞LikingMoment 用户编号 userid,新鲜事编号 momentId,创建时间 createdAt
话题 Topic 编号id,话题名称name,热度heat,创建时间 createdAt,更新时间 updated
话题关系表TopicRelation 话题编号 topica, moment编号 momentId

其中,话题热度根据时间推移按比例持续衰减,每24小时衰减10%,不足24小时则不进行衰减。(提示: power(xy),返回x的y次方)

1)选出当前热度前十的话题,包括话题的编号、名称、热度、参与的 moments数量,创建时间

select t._id, t.name, 
power(0.9, TIMESTAMPDIFF(SECOND, now(), t.createAt)/(24*3600))*heat as current_heart, 
count(tr.moment_id), t.createdAt from Topic t
join TopicRelation tr on t._id=tr.topicId
group bt t._id
order by current_heart limit 0,10

TIMESTAMPDIFF(单位,开始时间,结束时间)
8) 检索参加了所有项目的职工的工号;

select eno from E where NOT EXISTS(
select * from P where NOT EXISTS(
select * from W where W.eno=E.eno and W.pno=P.pno))
select eno from E where NOT EXISTS(
select * from P where P.pno NOT IN(
select W.pno from W where W.eno=E.eno))
  1. 检索全体 3 号部门的职工都参加了的项目的编号和名称;
select pno,pname from P where NOT EXISTS(
select * from E where E.dno=3 and NOT EXISTS(
select * from W where W.eno=E.eno and W.pno=P.pno))
select pno,pname from P where NOT EXISTS(
select * from E where E.dno=3 and E.eno NOT IN(
select W.eno from W where W.pno=P.pno))

顾 客 客C ( cid, cname, city, discnt )
供应商 A ( aid, aname, city )
商 品 品 P ( pid, pname, quantity, price )
订 单 单 O ( ordno, orddate, cid, aid, pid, qty, dols )
(SQL) 查询 每一个顾客的最近一份订单 , 结果返回顾客编号和最近一份订单的购买日期 , 并按照购买日期的降序输出查询结果。
(SQL )
参考答案 1 :

SELECT cid, orddate
FROM O O1
WHERE orddate >= ALL(
	SELECT O2.orddate
	FROM O O2 
	WHERE O2.cid=O1.cid
)
ORDER BY orddate DESC;

参考答案 2 :

SELECT cid, orddate
FROM O O1
WHERE NOT EXISTS ( 
	SELECT *
	FROM O O2
	WHERE O2.cid=O1.cid 
		and O2.orddate > O1.orddate 
)
ORDER BY orddate DESC;

参考答案 3 :

SELECT cid, orddate
FROM O, (
	SELECT cid, max(orddate) 
	FROM O GROUP BY cid
) AS X(cid, m_date)
WHERE O.cid=X.cid 
	and O.orddate=X.m_date
ORDER BY orddate DESC;

参考答案 4 :

SELECT cid, orddate
FROM O
WHERE ordno NOT IN ( 
	SELECT O1.ordno
	FROM O O1, O O2
	WHERE O1.cid=O2.cid and O1.orddate < O2.orddate
)
ORDER BY orddate DESC;

关系代数

S(SNO,SNAME,CITY,STATUS)//供应商编号,供应商名称,供应商城市,供货状态
P(PNO,PNAME,COLOR,QTY)//零件编号,零件名称,零件颜色,零件数量
J(JNO,JNAME)//工程号,工程号名称
SPJ (PNO,SNO,JNO,QTY ) //项目关系表,零件号,供应商号,工程号,数量

  1. 用关系代数写出求没有使用武汉供应商生产的黑色零件的工程号(6分)。
    (SPJ)[jno] - (SPJ join P join S where city=‘wuhan’ and color=‘black’)[jno]
  2. 用关系代数写出,求至少使用了所有上海供应商生产的零件的工程号(8分)。
    (SPJ)[PNO, SNO]÷(SPJ join S where city=‘shanghai’)[PNO]
    5.设有两个关系模式R(A,B,C)和S(C,D),请用关系代数中的笛卡尔乘积,选择和投影运算来实现它们两者之间的自然联接( natural join)
    R JOIN S=
    自然联接(naturaljoin)

两个关系R和S的自然联接操作具体计算过程如下:
① 计算R×S ;
② 设R和S的公共属性是A1,…,AK,挑选R×S中满足R.A1=S.A1,…,R.AK=S.AK
的那些元组;
③去掉S.A1,…,S.AK这些列。
((RXS) where A.C=S.C)[A,B,A.C,D]
P1:P P2:P
P[pid] - ((P1*P2) where P1.price>P2.price and P1.pid=P2.pid)[P1.pid]
(大于就是最小,小于就是最大,取左表)
关系代数讲解

模式分解

例1:U=(A,B,C,D,E,G) F={BG->C,BD->E,DG->C,ADG->BC,AG->B,B->D} 若R不是3NF,将R分解为无损且保持函数依赖的3NF。

解:

先要求出最小依赖集,由前面,候选键为AG,Fm={B->E,DG->C,AG->B,B->D}

第一步:左部相同原则分组:对Fm按具有相同左部的原则分组,然后左部∪右部。

U1=B∪DE=BDE U2=DGC U3=AGB

第二步:看有没有包含关系,有的话,合并吸收。

将R分解为ρ={ R1({B,D,E},{B->E,B->D}),

                   R2({C,D,G},{DG->C}),



                   R3({A,B,G},{AG->B}) }

第三步:看分的属性组里有没有包含码,包含了,就是无损且保持函数依赖的3NF,没有包含,就不是无损且保持函数依赖的3NF,就加一个分组,把码加进去。

因为候选键AG在U3中,所以所求分解ρ具有无损连接性,并保持函数依赖,且每个子模式为3NF。

例2:U=(A,B,C,D,E) F={AB->C,C->B,D->E,D->C} 若R不是3NF,将R分解为无损且保持函数依赖的3NF。

解:

求得,码是AD 属于1NF

第一步:U1=ABC U2=BC U3=DCE

第二步:

将R分解为ρ={ R1({A,B,C},{AB->C}),

                   R2({B,C},{C->B}),



                   R3({D,E},{D->E,D->C}) }

合并吸收:

ρ={ R1({A,B,C},{AB->C,C->B}),

   R2({D,E},{D->E,D->C}) }

第三步:不是无损连接,添加码。

R3({A,D},{∅})

所以ρ={ R1({A,B,C},{AB->C,C->B}),

          R2({D,E},{D->E,D->C}),



          R3({A,D},{∅}) }
  1. R=(A,B,C,D,E) F=(A->BC, CD->E, B->D, E->A)(12分)

  2. 求B的属性闭包(5分)

B

  1. 求R的候选码(7分)

A

(B,C)

(C,D)

E

  1. R=(A,B,C,D), F={B->D, AB->C}(12分)

  2. 该模型属于什么范式(4分)

1NF

  1. 如何分解到BCNF(8分)

(A,B,C)

(B,D)

A->B

DE->B

BC->E

E->A

E->B

B->D

A->B

BC->E

E->A

E->B

B->D

A->B

BC->E

E->AB

B->D

(A,C)

(B,C)

(C,E)

(B, C, E)

(B, D)

(A, B, E)

设有一个关系模式R(A, B, C, D, E, F, G, H, I, J), 其函数依赖集F是: { AB->C, A->DE, B->F, F->GH, D->IJ },请问:

1.关系模式R的关键字是什么?

(A,B)

2.请将F分解到满足2NF

R1(A,D,E,I,J), R2(B,F,G,H), R3(A,B,C)

3.请将F分解到满足3NF

R1(A,D,E), R4(F,G,H), R2(B,F), R3(A,B,C)

二、设有一个关系模式R(A, B, C, D),其函数依赖集是{A->B, C->B, D->AC, AC->D},请问:

1.关系模式R的关键字是什么?

(A,C) 和 D

2.该关系模式最高能够满足到第几范式?

1NF

3.请给出满足3NF的分解结果。

(答案1) R1(A,B) R2(A,C,D)

(答案2) R1(C,B) R2(A,C,D)

1.F = { BCD->A, BC->E, A->F, F->G, C->D, A->G }

1)计算 F 的最小函数依赖集

2)给出关系模式R的候选关键字

3)将关系模式R分解到满足3NF,并具有无损联接性和依赖保持性

4)上述的分解是否满足BCNF?如果不满足BCNF的要求,请将其进一步分解到满足BCNF

(1){ BC->AE, A->F, F->G, C->D }

(2)(B,C)

(3)R1(A,B,C,E) R2(A,F) R3(F,G) R4(C,D)

(4)步骤 (3) 的结果已经满足BCNF

2.F = { AB->CD, A->E, B->FH, C->G, D->B, G->C, H->I }

1)计算 F 的最小函数依赖集

2)给出关系模式R的候选关键字

3)将关系模式R分解到满足3NF,并具有无损联接性和依赖保持性

4)上述的分解是否满足BCNF?如果不满足BCNF的要求,请将其进一步分解到满足BCNF

(1)F 本身就已经是最小函数依赖集

(2)(A,B) 和 (A,D)

(3)R1(A,B,C,D) R2(A,E) R3(B,F,H) R4(C,G) R5(H,I)

(4)其中的R1不满足BCNF,可将其进一步分解为:

R11(B,D) R12(A,C,D)

索引

详细说明为什么系统的为外键构建索引是普遍的要求(3)

为确保数据的完整性,在对主表操作时,需要对参照表进行加锁操作。
如果外键没有索引,查找子记录就会很慢,且参照表被锁的时间很长,进而使很多更改操作阻塞,甚至可能发生死锁。
进行连接查询时,如果不对外键使用索引则会发现查询的速度大大降低。引起全表扫描

针对上题有没有例外情况?如果有请简要说明理由(3)

不从父表中删除记录
不更新父表中的主键的值
一般不进行父表和子表的连接查询
盲目为外键加索引还可能造成索引重复

  1. 索引与外键

a) 如果没有外键和引用的话,一次修改会导致多次修改
b) 大系统普遍取消外键的关联,取消参照完整性(降低在更新主表时候的过多引用)是提高数据库性能的一个措施。如果有大量的外键关联,则做一次主表查询可能会导致连接多个代码表
c) 如果有外键的话,则需要对外键加上索引,但是不一定,如果该外键不经常使用就不用添加索引,索引建立必须要有理由,无论是外键还是其他字段,并不是外键都要添加索引
d) 如果系统为外键自动添加索引,常常会导致同一字段属于多个索引,为每个外键建立索引,会导致多余索引

索引概念

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。是一种以原子粒度访问数据的手段,而不是为了大量数据的访问。是一种数据访问方式;索引是顺序存取

索引分类

聚簇索引:按照数据存放的物理位置为顺序的,索引的叶节点就是物理上的叶节点,聚簇索引能提高多行检索的速度
非聚簇索引: 索引顺序与数据物理排列顺序无关,叶节点仍然是索引节点,保留一个指针指向数据块, 非聚簇索引对于单行的检索很快。
一个表最多只能有一个聚簇索引
3. 索引结构:B 树
4. 索引目的:提高查询效率
5. 索引使用时的考虑
检索比率,一般适用于满足条件的数据量少的情况
磁盘访问,内存访问,记录存储

索引的优点

通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

索引的缺点

  1. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
  2. 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
  3. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

索引会带来的问题

  1. 索引有可能降低查询性能,带来磁盘空间的开销和处理开销等
  2. 太多的索引,让设计不稳定
  3. 对于大量数据检索,索引效率反而更低
  4. 创建索引会带来系统的维护和空间的开销
  5. 数据修改需求大于检索需求时,索引会降低性能

什么样的列应该建立索引

  1. 在经常需要搜索的列上,可以加快搜索的速度;
  2. 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
  3. 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
  4. 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;外键建索引由于连接加快还会减少死锁几率。
  5. 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
  6. 在在经常使用在 WHERE 子句中的列上面创建索引,加快条件的判断速度。

什么样的列不应该建立索引

  1. 对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
  2. 对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中, 结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
  3. 对于那些定义为 text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少,不利于使用索引。
  4. 修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

使用索引会降低查询效率的情况

i、在查询中索引列在自定义函数中时,这时候索引将不被使用。
ii、有隐式类型转化时,索引也不会被使用。
iii、对于修改较多的表中,使用索引会严重影响数据库更新操作的效率。
iv、当查询的结果集较大时,索引会影响效率。因为索引是针对点查询的,而不是针对某个范围查询的。一般结果集在10%以下可以考虑使用索引。

数据库没有用到索引的情况

主要是因为:使用索引反而得不到正确结果;或使查询效率变得更慢

  1. 情况 1 :我们在使用 B+树索引,而且谓词中没有使用索引的最前列
    表 T,T(X,Y)上有索引,做 SELECT * FROM T WHERE Y=5
    跳跃式索引(仅 CBO)
  2. 情况 2:使用 SELECT COUNT(*) FROM T,而且 T 上有索引,但是优化器仍然全表扫描,不带任何条件的 count 会引起全表扫描。
  3. 情况 3:对于一个有索引的列作出函数查询
    Select * from t where f(indexed_col) = value
  4. 情况 4 :隐形函数查询(主要是时间和类型变化这种隐形函数查询)
    不等于符”<>”会限制索引,引起全表扫描,如果改成 or 就可以使用索引了。
    is null 查询条件也会屏蔽索引。
  5. 情况 5 :此时如果用了索引,实际反而会更慢
    数据量本来不够大,oracle 自己计算后认为不用索引更合算,则 CBO 不会选择用索引
  6. 情况 6 :没有正确的统计信息,造成 CBO 无法做出正确的选择;
    如果查询优化器认为索引会使查询变慢,则不会使用索引
    表分析就是收集表和索引的信息,生成的统计信息会存在 user_tables 这个视图。CBO 根据这些信息决定 SQL 最佳的执行路径。
    其他:
  1. 对于两个公有字段的表,如果在做外表的表上对该字段建立索引,则该索引不会被使用。因为外表的数据访问方式是全表扫描。
  2. 查询使用了两个条件用 or 连接, 如果条件 1 中的字段有索引而条件 2 中字段没有,则仍会全表扫描。

系统生成键

  1. 系统生成键远好于寻找当前最大值并加 1;好于用一个专用表保存下一个值“且枷锁更新”
  2. 系统生成键是串行插入
  3. 如果插入并发性过高,在主键索引的创建操作上会发生严重的资源竞争
  4. 解决方案:反向键索引(逆向索引);哈希索引
  5. 系统生成键使用数字比使用字符串效率高
  6. 不使用系统生成键,可能会导致插入时主键取值不唯一,有利于主键的唯一性

B树索引的结构

由根指向子节点,B树将索引按顺序存储,在叶节点保存索引到字段及其对应数据在表中的位置指针。从根节点开始搜索,通过节点中的指针进入下一级节点,通过比较要查找的索引值和节点中的指针大小选择进入哪个子节点,最终要么找到对应叶节点,要么没找到。叶节点中有指向表中数据的指针。

什么时候使用 B 树索引

a、仅需要索引访问表中很少一部分行时,索引提供以原子粒度访问数据的功能,可以快速定位所查找数据的位置;
b、虽然查询行数比较多,当索引包含多个字段,而要访问的字段全部包含在索引中时,查找只需通过索引而不用访问全表时。

B/ B+ 树是一种多级索引组织方法,是适合于组织存放在外存的大型磁盘文件的一种树状索引结构。其中用得比较多的是B+树

B/ B+ 树的结点划分
叶结点: B/ B+ 树的最下一级索引是树的叶结点
内部结点: B/ B+ 树中的其它结点( ( 非叶结点) ) ,其中:
根结点: B/ B+ 树的最上一级索引是树的根结点

B+ 树的特点

平衡性:从树的根结点到每个叶子结点的路径都是等长的。
过半性:每个结点(除根结点外)所对应的磁盘块至少被占用一半的存储空间。
顺序性:既提供从根结点开始的随机查找关键字功能,也能根据索引关键字的值的排序进行顺序访问。
自适应性:自动保持与数据文件大小相适应的索引层次。

B+树与B树的比较

组织方式不一样
B+树:所有有效的索引关键字值都必须存储在叶结点中,其内部结点中的键值只用于索引项的查找定位
B树:有效的索引关键字值可以出现在B树的任意一个点中。
内部结点不同
B+树:关键字值+子树指针
B树:关键字值+记录指针+子树指针
因此B树结点的扇出(即一个结点可以拥有的最大子结点数目)较小,从而导致整个B树的高度大于B+树的高度
随机查找效率的区别
B+树:所有关键字的查找速度基本一致
B树:依赖于查找关键字所在结点的层次
在B树中没有提供对索引关键字的顺序扫描功能。B树的插入、删除操作较B+树复杂
B* 树
规则
B树是B+树的变种,相对于B+树他们的不同之处如下:
(1)首先是关键字个数限制问题,B+树初始化的关键字初始化个数是cei(m/2),b树的初始化个数为(cei(2/3m))
(2)分裂规则不同。B+树节点满时就会分裂,而B
树节点满时会检查兄弟节点是否满(因为每个节点都有指向兄弟的指针),如果兄弟节点未满则向兄弟节点转移关键字,如果兄弟节点已满,则从当前节点和兄弟节点各拿出1/3的数据创建一个新的节点出来;
特点
在B+树的基础上因其初始化的容量变大,使得节点空间使用率更高,而又存有兄弟节点的指针,可以向兄弟节点转移关键字的特性使得B*树额分解次数变得更少;

B/B+树: 用在磁盘文件组织,数据索引和数据库索引。
Trie树(字典树): 用在统计和排序大量字符串,如自动机。
红黑树: 平衡二叉树,广泛用在C++的STL中。如map和set都是用红黑树实现的。
B树索引的结构:由根指向子节点,B树将索引按顺序存储,在叶节点保存索引到字段及其对应数据在表中的位置指针。从根节点开始搜索,通过节点中的指针进入下一级节点,通过比较要查找的索引值和节点中的指针大小选择进入哪个子节点,最终要么找到对应叶节点,要么没找到。叶节点中有指向表中数据的指针。
何时使用:
a、仅需要索引访问表中很少一部分行时,索引提供以原子粒度访问数据的功能,可以快速定位所查找数据的位置;
b、虽然查询行数比较多,当索引包含多个字段,而要访问的字段全部包含在索引中时,查找只需通过索引而不用访问全表时。
高级数据结构中有些适用于内存,有些适用于磁盘,请举例说明哪些适用于内存,哪些适用于磁盘
二叉搜索树、多维数组、广义表、红黑树都适用于内存;
B+树,B-树适用于磁盘

九,一个n阶b+树,n为奇数,问一个k层的这样的b+树 最多。最少能索引多少记录(十分)
B+树的记录索引全部在叶子上,分支结点只有下层的索引,并且每个结点最多可以有n个关键字,因此如果是2层,则第1层1个根,第2层可以有n个结点,于是最多可存放的记录索引数量为n * n= n的平方

位图索引

主要针对大量相同值的列而创建(例如:类别,操作员,部门 ID,库房 ID 等),
索引块的一个索引行中存储键值和起止 Rowid,以及这些键值的位置编码,位置编码中的每一位表示键值对应的数据行的有无.一个块可能指向的是几十甚至成百上千行数据的位置.
这种方式存储数据,相对于 B*Tree 索引,占用的空间非常小,创建和使用非常快.
位图索引:
非常紧凑,块变得复杂,更新操作会导致整个块被锁住,不利于更新,所以创建位图索引的目的是为了查询而不是为了更新
B 树索引不能存控制,位图索引可以存空值

哈希索引

所谓 Hash 索引,实际上就是通过一定的 Hash 算法,将需要索引的键值进行 Hash 运算,然后将得到的 Hash 值存入一个 Hash 表中。每次需要检索的时候,都会将检索条件进行相同算法的 Hash 运算,再和 Hash 表中的 Hash 值进行比较,并得出相应的信息。HASH 索引在有限制条件(需要指定一个确定的值而不是一个值范围)的情况下非常有用。
HASH 的缺点
(1)Hash 索引仅仅能满足"=",“IN"和”<=>"查询,不能使用范围查询。由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和 Hash 运算前完全一样。
(2)Hash 索引无法被用来避免数据的排序操作。由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且 Hash 值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算;
(3)Hash 索引不能利用部分索引键查询。对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。
(4)Hash 索引在任何时候都不能避免表扫描。前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash 运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。
(5)Hash 索引遇到大量 Hash 值相等的情况后性能并不一定就会比 B-Tree 索引高。对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。

函数索引

基于函数的索引,类似于普通的索引,只是普通的索引是建立在列上,而它是建立在函数上。当然这会对插入数据有一定影响,因为需要通过函数计算一下,然后生成索引。但是插入数据一般都是少量插入,而查询数据一般数据量比较大。
函数索引还有一个功能,只对部分行建立索引。
原本对 X 构建索引,此时对 F(X)构建索引
在不修改应用程序逻辑的基础上提高查询效率
函数索引与通常 B*树索引的结构,存在很大相似性。区别就在于形成树结构的叶子节点上,保存的不是索引列的取值,而是经过特定的函数处理过的索引列值
但是函数索引的综合消耗大于普通的 B 树索引
适用范围有限,必须函数的使用和定义完全一样
函数索引的针对性很强,如果这个需求不属于关键需求,性价比略差

倒排索引

也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。
“ 倒排索引”是实现单词到文档映射关系的最佳实现方式和最有效的索引结构.
反向索引英文名叫做 Inverted index,顾名思义,是通常意义下索引的倒置。
举个例子: 我们用不同的数字索引不同的句子(比如以下三句在文本中是按照0,1,2的顺序排列的)
0 : “I love you”
1 : “I love you too "
2 : “I dislike you”
如果要用单词作为索引,而句子的位置作为被索引的元素,那么索引就发生了倒置:
“I” : {0,1,2}
“love” : {0, 1}
“you” : {0,1,2}
“dislike” : {2}
如果要检索 “I dislike you” 这句话,那么就可以这么计算 : {0,1,2} ^ {2} ^ {0,1,2} (这里”^"代表交集)
使用索引降低效率举例:
select count(*) from T,T上有索引,优化器仍然全表扫描
对一个有索引的列作出函数查询select * from where f(col)=value

其他

SQL执行步骤

语法检查:检查 SQL 拼写是否符合语法规范
语义检查:检查访问对象是否符合存在及用户是否具有相应权限
解析:在共享池中检查是否有完全相同的之前完全解析好的,如果存在,跳过选择执行计划和产生计划,直接运行
硬解析:就是对提交的 SQL 完全重新从头进行解析,创建解析树,生成执行计划对 SQL 的执行来说是开销昂贵的动作,在很多项目中对功能相同的代码要保持一致性,用绑定变量
软解析:在共享池(shared pool)中找到了与之完全相同的 SQL 解析好的结果会跳过硬解析后面的两个步骤
执行计划:以缩排列表的方式显示 SQL 语句的执行步骤

硬件优化:
1.存取路径:B+树索引存取方法、hash索引存取方法、聚簇存取方法
2.数据的物理布局:如何存储
3.可用内存
4.可用处理器
5.集中式存储与分布式存储。集中式存储是指将所有数据都存储在同一个节点上。这样有助于提高数据库查询和修改的效率。但是集中式存储有很大的风险,若节点出现不可逆破坏,将导致数据库崩溃。比如地震导致数据库损坏。
6.高效合理的操作算法:全表扫描、索引扫描、嵌套循环连接、排序-合并连接
7.固态存储
8.RAID

系统(设计)
1.代数优化-优化器的启发式规则
2.计数器表
3.汇总表
4.分表
5.范式与反范式。设计合理的逻辑模式
6.外键加索引
7.尽可能避免使用自定义函数。再写 SQL语句时应尽可能避免使用自定义函数,因为对于自定义函数,优化器无法做出优化,若过度滥用自定义函数将导致数据库性能下降。但是在某些必要情况下,只能使用自定义函数来实现特定查询。

查询优化器的启发式规则
1.选择运算应尽可能先做。最重要、最基本的一条。常常可以使执行代价节约几个数量级,使计算的中间结果大大变小
2.把投影运算和选择运算同时进行。如有若干投影和选择运算,并且它们都对同一个关系操作,则可以在扫描此关系的同时完成所有这些运算以避免重复扫描关系
3.把投影同其前或后的双目运算结合起来。没有必要为了去掉某些字段而扫描一遍关系
4.把某些选择同在它前面要执行的笛卡儿积结合起来成为一个连接运算。连接运算要比同样关系上的笛卡尔积省很多时间
5.找出公共子表达式

1)范式和反范式
第一范式:每一列都是一个不可分割的原子数据项。
第二范式:第一范式基础上消除部分依赖。
第三范式:第二范式基础上消除传递依赖。
反范式是针对第三范式来说的,通过添加冗余的方式破坏了第三范式,前两个范式还是要遵循的。

范式的优点:
a.写入快,因为不需要写冗余数据,所以减少了写的负担。
b.更新快,因为通常只需要更新更少的数据。
c.由于没有冗余,所以不会造成数据不一致。
d.更少的需要GROUP BY和DISTINCT。
缺点是:需要关联。

范式的缺点,就是反范式的优点,不需要关联,并且因为在同一个表中,可以设计合适的索引。
实际应用中通常不会采用完成的范式,而是放置一些冗余,以减少表与表的关联,加快查询速度。

2)分表
如果表中的数据有状态,比如完成态和运行态,那么可以考虑将表分为运行态和完成态数据,数据转换到完成态时可以将数据归档到完成态表中,由于数据总是要运转到完成态,所以这样无论系统运行多长时间,运行态表中的数据几乎都是恒定的,而且完成态的数据除了统计分析用外,几乎不不需要查询,这样就大大提高了系统运行的速度,表中的数据量得到了控制。
另外对于统计分析的场景,为了减少表的union 可以要求业务查询从运行态和完成态两种状态中二选一。

对于一些海量数据,也可以考虑根据某个字段的值做hash,来分表存储,当然这加大了应用的复杂度,这没办法,通常没有十全十美的办法,架构就是根据实际应用场景做权衡,正所谓忠孝不能两全,只是某种办法更合适而已。
另外可以通过分布式数据库解决分表的问题,由分布式数据库自动分表存储,查询时自动合并,由分布式数据库中间件类屏蔽复杂性,各种脏活、累活交给它就是了。

3)汇总表
对于一些大数据量的报表统计工作,如果不是要求实时的话,可以定期汇总,比如每小时汇总一次或者每天汇总一次,如果要求实时的话,由于各种大表,各种group by,不但统计非常慢,而且容易影响正常的业务操作。笔者之前待的公司,每天晚上都开各种各样的定时任务进行数据汇总,在数据库不太忙的晚上,从12点干到早上6点,定时任务排的满满的,真是累死它的节奏啊,还好计算机不会闹脾气,发飙。。当然这样报表统计的数据是截止到昨天的,每次都晚一天,通常这是允许的。

4)计数器表
web应用为了记录点击次数,可以设计一个点击次数表,
create table hit_counter(cnt int unsigned not null);

由于只有一条记录这样锁争用太严重,想到了什么解决方案,同concurrenthashmap一样做锁拆分。

表结构修改为:

create table hit_counter(slot tinyint unsigned not null primary key,cnt int unsigned not null);

预先放入100条数据,这样修改的时候可以使用如下语句,

update hit_counter set cnt = cnt+1 where slot = RAND()*100;

获取的时候求和就可以了,select sum(cnt) cnt from hit_counter;

系统(应用上)
1.使用合理高效的SQL语句及方法,暗示SQL优化器进行优化
好的查询条件
关注结果集和中间数据集的大小
2.关注用户数,并发量。并据此检查自己的物理设计,系统设计
3.优化服务器配置

使用 SQL 语句要考虑的因素

  1. 数据总量

Sql 考虑最重要的因素:必须访问的数据总量;没有确定目标容量之前,很难判断查询执行的效率

  1. 定义结果集的查询条件

好的查询条件:满足此条件的数据很少,可以过滤很多数据

Where 字句:特别在子查询或视图中可能有多个 where 字句

过滤的效率有高有低,受到其他因素的影响

影响因素:过滤条件,主要的 sql 语句,庞大的数据对查询影响

  1. 结果集的大小

查询所返回的数据量,重要而被忽略

取决于表的大小和过滤条件的细节

例外是若干个独立使用效率不高的条件结合起来效率非常高

从技术角度来看,查询结果集的大小并不重要,重要的是用户的感觉

熟练的开发者应该努力使响应时间与返回的记录数成比例

  1. 获得结果集所涉及的表的数量:表的数量会影响性能

连接:太多的表连接(八张)就该质疑设计的正确性了;对于优化器,随着表数量增加,复杂度指数增长;编写太多表的复杂查询时,多种方式连接的选择失误几率很高

视图:会掩盖多表连接的事实

减少复杂查询和复杂视图

  1. 并发的用户数(同时修改数据的用户数)

设计时要注意:数据块访问争用,阻塞,闩定,保证读取的一致性

一般而言,整体的吞吐量>个体响应时间

数据存贮采用固定大小的区块,可以存取多条记录,I/O 交互简单,在内存与缓冲中好处理;但是当修改后的数据太长,则会进行迁移到另一个 block 存储;数据块的太大,会带来数据块的访问争用的问题,影响并发性能

SQL 和优化器概念

优化器:借助关系理论(关系代数)提供的语义无误的原始查询进行有效的等价变换,寻找最优路径,产生新能最优的执行方案

优化:在数据处理的真正被执行的时候发生

影响优化的因素:索引,数据的物理布局,可用内存大小,可用处理器个数,直接或间接涉及的表和索引的数据量

Sql 语句先执行关系操作,再执行非关系操作(order by)

逻辑查询处理阶段简介(网上找的,理解一下)

FROM:对 FROM 子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表 VT1

ON:对 VT1 应用 ON 筛选器。只有那些使<join_condition>为真的行才被插入 VT2。

OUTER(JOIN):如 果指定了 OUTER JOIN(相对于 CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3.如果 FROM 子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤 1 到步骤 3,直到处理完所有的表为止。

WHERE:对 VT3 应用 WHERE 筛选器。只有使<where_condition>为 true 的行才被插入 VT4.

GROUP BY:按 GROUP BY 子句中的列列表对 VT4 中的行分组,生成 VT5.

CUBE|ROLLUP:把超组(Suppergroups)插入 VT5,生成 VT6.

HAVING:对 VT6 应用 HAVING 筛选器。只有使<having_condition>为 true 的组才会被插入

VT7.

SELECT:处理 SELECT 列表,产生 VT8.

DISTINCT:将重复的行从 VT8 中移除,产生 VT9.

ORDER BY:将 VT9 中的行按 ORDER BY 子句中的列列表排序,生成游标(VC10).

TOP:从 VC10 的开始处选择指定数量或比例的行,生成表 VT11,并返回调用者。

优化器的有效范围

优化器需要借助数据库中找到的信息

能够进行数学意义上的等价变换

优化器考虑整体响应时间

优化器改善的是独立的查询语句

策略是:如果是若干个小查询,优化器会个个优化;如果是一个大查询,优化器会将它作为一个整体优化

过滤

  1. 如何限定结果集时最为关键的因素,是使用 SQL 各种技巧的判定因素

  2. 过滤条件的含义:

Where 字句和 having 字句

Join 过滤条件

Select 过滤条件

  1. 过滤条件的好坏,取决于

最终需要的数据是什么,来自哪些表

哪些输入值会传递到 DBMS 引擎

能过滤掉不想要的数据的条件有哪些

高效过滤条件是查询的主要驱动力

SQL 查询优化总结

  1. 暗示查询优化器如何优化

使用 join 来暗示表连接顺序,当有多表连接操作时,考虑使用 exists 和 in 操作来优化;如果不使用 join 则是让查询优化器自己优化,自己确定表连接顺序(先小表,再大表),效率可能较低

  1. 将多维度的查询进行降维处理,一次连接的表不要超过 3 张,超过了就将非关联子查询变成内嵌视图,降维处理

  2. 考虑取出的数据在表中的比例,当查询返回记录超过数据总量 10%就不使用索引,查询结果集少于 10%是好的查询条件

  3. 避免在高层使用 distinct,使用 exists 和 in 来处理

  4. 避免在高层使用 select *,这样会产生冗余的结果集,降低性能

大数据量查询原则

原则:越快踢出不要的数据,查询的后续阶段必须处理的数据量就缺少,查询效率越高

应用:

集合操作,如 union 语句,但是不要 cut-and-paste

Group by&having 字句

所有影响聚合函数的结果条件都应该放在hanving字句中

任何无关聚合条件都应该放在 where 子句中

减少 group by 必须执行排序操作所处理的数据量

非关联子查询变成内嵌视图— 降低查询维度

例子:

‘’

映像语句的处理顺序

  1. 合并FROM 子句中的表 ( 笛卡儿乘积)

  2. 利用WHERE子句中的条件进行元组选择,抛弃不满足子句中的条件进行元组选择,抛弃不满足WHERE条件的那些元组

  3. 根据GROUP BY子句对保留下来的元组进行分组

  4. 利用HAVING子句中的条件对分组后的元组集合 子句中的条件对分组后的元组集合(group) 进行选择,抛弃不满足HAVING条件的那些元组

  5. 根据SELECT子句进行统计计算,生成结果关系中的元组子句进行统计计算,生成结果关系中的元组

  6. 根据ORDER BY子句对查询结果进行排序

SQL目录

学生表:Student(Sno,Sname,Ssex,Sage,Sdept)
课程表:Course(Cno,Cname,Cpno,Ccredit)
学生选课表:SC(Sno.Cno,Grade)

模式

1.定义模式

create schema "S-T" authorization wang;

create schema S-T authorization wang
create table tab(
	col1 smallint,
	col2 int,
	col3 char(20),
	col4 numeric(10,3),
	col5 decimal(5,2)
);

2.删除模式

drop schema S-T cascade;

1.定义基本表

create table Student(
	Sno char(9) primary key,
	Sname char(20) unique,
	Ssex char(2),
	Sage smallint,
	Sdept cha(20)
);
create table Course(
	Cno char(4) primary key,
	Cname char(40) not null,
	Cpno char(4),
	Ccredit smallint,
	foreign key(Cpno) references Course(Cno)
);
create table SC(
	Sno char(9),
	Cno char(4),
	Grade smallint,
	primary key(Sno,Cno),
	foreign key(Sno) references Student(Sno),
	foreign key(Cno) references Course(Cno)
);

2.修改基本表

alter table Student
add S_entrance date;

alter table Student
alter column Sage int;

alter table Course
add unique(Cname);

3.删除基本表

drop table Student cascade;

索引

1.建立索引

create unique index Stusno on Student(Sno);
create unique index Coucno on Course(Cno);
create unique index SCno on SC(Sno asc,Cno desc);

2.修改索引

alter index SCno rename to SCSno;

3.删除索引

drop index Stusname;

查询

1.单表查询

//查询指定列
select Sno,Sname
from Student;
//列的顺序自定
select Sname,Sno,Sdept
from Student;
//查询全部列
select *
from Student;
//查询计算后的列
select Sname,2014-Sage
from Student;
//查询含常量的列
select Sname,'Year of Birth:',2014-Sage,lower(Sdept)
from Student;
//查询中对列的别名
select Sname name,'Year of Birth:',2014-Sage birthday,lower(Sdept) depart
from Student;
//消除重复元组
select distinct Sno
from SC;
//查询满足条件的元组
select Sname
from Student
where Sdept='CS';	//=

select Sname,Sage
from Student
where Sage<20;		//<

select distinct Sno
from Sc
where Grade<60;

select Sname,Sdept,Sage
from Student
where Sage between 20 and 23;	//between and

select Sname,Sdept,Sage
from Student
where Sage not between 20 and 23;//not between and

select Sname,Ssex
from Student
where Sdept in('CS','MA','IS');	//in

select Sname
from Student
where Sname like '%欧阳%';		//like

select Sname
from Student
where Sname like '_阳%';

select Cno,Ccredit
from Course
where Cname like 'DB\_%Design' escape "\";

select Sno,Cno
from SC
where Grade is null;//空值

select Sno,Cno
from SC
where Grade is not null;//非空

select Sname,Ssex
from Student
where Sdept='CS' or Sdept='MA' or Sdept='IS';//多条件

select Sno,Grade
from SC
where Cno='3'
order by Grade desc;//降序排序

select count(*)
from Student;				//count

select count(distinct Sno)
from SC;

select avg(Grade)
from SC
where Cno='1';				//avg

select max(Grade)
from SC
where Cno='1';				//max

select sum(Ccredit)
from SC,Course
where Sno='201215012' and Sc.Cno=Course.Cno;//sum

//注意:where子句中不能使用聚集函数
//聚集函数只能使用于select子句,以及group by中的having子句

select Cno,count(Sno)
from SC
group by Cno;//分组后聚集函数将作用于每一个组

select Sno
from SC
group by Sno
having count(*)>3;

2.多表查询

select Student.*,SC.*
from Student,SC
where Student.Sno=SC.Sno;//等值连接

select Student.Sno,Sname
from Student,SC
where Student.Sno=SC.Sno
	and SC.Cno='2' 
	and SC.Grade>90;//连接谓词和选择谓词

select first.Cno,second.Cpno
from Course first,Course second
where first.Cpno=second.Cno;//自身连接

select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
from Student
left outer join SC
	on(Student.Sno=SC.Sno);//左外连接

select Student,Sno,Sname,Cname,Grade
from Student,SC,Course
where Student.Sno=SC.Sno
	and Sc.Cno=Course.Cno;//多表连接

3.嵌套查询

select Sname
from Student
where Sno in(
	select Sno
	from SC
	where Cno='2'
);
//select语句中不能使用order by子句
//order by子句只能对最终查询结果排序

//查询与“刘晨”在同一个系学习的学生
select Sno,Sname,Sdept
from Student
where Sdept in(
	select Sdept
	from Student
	where Sname='刘晨'
);//不相关子查询
select Sno,Sname,Sdept
from Student first,Student second
where second.Sname='刘晨'
	and first.Sdept=second.Sdept;//自身连接查询

//查询选修了课程名为“信息系统”的学生学号和姓名
select Sno,Sname
from Student
where Sno in(
	select Sno
	from SC
	where Cno in(//课程名为“信息系统”的课程
		select Cno
		from Course
		where Cname='信息系统';
	)
);
select Student.Sno,Student.Sname
from Student,SC,Course
where Cname='信息系统'
	and SC.Cno=Course.Cno
	and SC.Sno=Course.Sno;


1.数据库的四个基本概念

数据:符号记录
数据库:数据的集合
数据库管理系统:数据管理软件
数据库系统:存储、管理、处理、维护数据的系统
数据模型:数据特征的抽象
实体:相互区别的事物
实体型:实体的抽象
实体集:实体的集合

英语

一、自我介绍

self-introduction

汉语:

   Good morning, respected professors.
   It is a privilege to be speaking to you today.

   我叫王振华,毕业于华北电力大学软件工程专业。
   我来自江苏丰县,刘邦和道教创始人张道陵都出生在这里。
   我梦想能像它们那样。
   
   我比较喜欢编程。
   从网上了解到软件工程专业有很多作业而且每个人都需要加班完成老师布置的编程任务,所以大一结束我转到了软件工程专业。
   虽然结果不是很理想,我本校的软件工程专业相对轻松,然后我就慢慢松懈了。
   但是我确实喜欢编程,它会给人成就感。
   我最喜欢的编程语言是Java,Java可以实现很多东西,包括做网站服务器以及开发Android应用。
   本科毕业设计我做了一个前后端分离的网站项目,并获得了优秀的评价。
      
   因为生活在江苏,所以从高中就敬佩能考上南京大学的同学,我也梦想能考上南大;
   而且很多亲人都在南京,南京大学对我确实是个理想的选择。
   If I'm lucky enough to be accepted, I will devote all my efforts and energy to my graduate study.
   Thanks for your attention.

翻译:

   Good morning, respected professors.
   It is a privilege to be speaking to you today.
   
   My name is Wang Zhenhua. 
   I graduated from North China Electric Power University majoring in Software Engineering.
   I come from Fengxian County, Jiangsu Province, where both Liu Bang and Zhang Daoling, the founder of Taoism, were born.
   I dream of being like them.

   I prefer programming.
   I learned from the Internet that software engineering had a lot of homework and everyone had to work overtime to complete the programming tasks assigned by the teacher, so I transferred to software engineering at the end of my freshman year.
   Although the results were not very good, my software engineering major was relatively easy, and then I slowly relaxed.
   But I do like programming. It gives a sense of accomplishment.
   My favorite programming language is Java, which can do a lot of things, including making web servers and developing Android applications.
   In my undergraduate graduation design, I did a website project with front and back ends separated, which received excellent evaluation.

   Since I live in Jiangsu Province, I have admired those students who have been admitted to Nanjing University since high school. I also dream of being admitted to Nanjing University.
   Besides, many of my relatives are in Nanjing, so Nanjing University is really an ideal choice for me.
   If I'm lucky enough to be accepted, I will devote all my efforts and energy to my graduate study.
   Thanks for your attention.

二、问答

Excuse me,would you please repeat your question again?

数据结构

1.你都学过什么数据结构

我学过数组(静态数组、动态数组)、线性表、链表(单向链表、双向链表、循环链表)、队列、栈、树(二叉树、查找树、平衡树、线索树、堆)、图。

I’ve learned about array(static array, dynamic array), linear list,
linked list (unidirectional list, bidirectional list, circular list),
queue, stack, tree (binary tree, search tree, balance tree, clue tree,
heat), graph

2.can you explain quick sort algorithm?

快速排序就是从数组中任意取一个元素,将其他的元素与它进行比较,把小于它的元素放在它左边,大于或者等于它的元素放在它右边,重复上述操作有限次后,我们便可以看到一个有序的数组
Quicksort is to take an arbitrary element from an array, compare other elements with it, put the elements less than it to the left, and the elements greater than or equal to it to the right, repeat this operation a finite number of times, we will see an ordered array.

软件工程

1.什么是软件工程?

软件工程就是将系统的、规范的、可量化的方法应用到软件的开发、运行、 维护,即将工程应用到软件,它也包括对上述方法的研究。

2.软件工程师的职责

3.Why do people divide into three layers?(MVC)

4.How do you think software?

5.Why do you learn SE and why do we need SE?

计算机网络

1.HTML5 advantage of use it

2.TCP/IP,the responsibility of both?

操作系统

1.What is the definition of dead lock?

2.What is OS?

Java

1.解释一下封装(Encapsulation)?

2.透明

3.继承

4.多态(Polymorphism)

5.JVM的优点和缺点

个人历程

1.为什么考研

2.考研感触

3.如何证明你进入研究生后也愿意学习

4.对什么研究方向感兴趣

5.你对接下来两年的研究生生活有什么规划?

6.你有什么兴趣爱好

7.Where is your university

8.What course do you major?

9.college life?

10.项目中遇到的困难是什么

11.三句话介绍下自己

12.项目

13.考研中遇到的困难是什么

三、阅读期刊

1.给一篇文章,阅读,并进行总结

九、通用型问题

1.喜欢读哪些书,介绍其中一本书的内容

2.用英语介绍我的本科学校

3.用英语介绍一个给我印象最深的人

4.对XX(学校所在地)的看法

5.对XX(学校)的看法

6.为什么考我们学校?

7.What can you tell me about yourself?

8.What would you like to be doing five years after graduation?

9.What is your greatest strength?

10.What is your greatest weakness?

11.How do you feel about your progress to date?“(对于你至今所取得的进步你是怎样看的?)

12.Why did you choose your major

13.What has been your greatest accomplishment?

14.What have you learned from the jobs you have held?

15.Describe the best/worst team of which you have been a member.

16.Tell me about a time when your course load was heaviest. How did you get all of your work done?

17.Give me a specific example of a time when you sold someone on an idea or concept.

18.Tell me about a time when you were creative in solving a problem.

19.Describe a time when you got co-workers or classmates who dislike each other to work together.

20.Tell me about a time when you made a bad decision.

21.What kinds of people do you find it difficult to work with?

22.What are some of the things you find difficult to do?

23.How would you evaluate me as an interviewer?

24.What interests you least about your major

25.How do you handle rejection?

26.What is the worst thing you have heard about our school?

27.Describe your best friend and what he or she does for a living.

28.In what ways are you similar or different from your best friend?

29.What are your career‘s strengths and how do you capitalize on them?

30.If you failed this time what will you do in the near future?

31.Why do you think you are qualified for ……(专业名称) program?

32.Do you have a study plan if you were accepted as a ……(专业名称) student?

33.What‘s your opinion about the requirement that a ……(专业名称) student must have working experience?

34.Do you think English is quite important in ……(专业名称) study? Why?

35.Do you think ……(专业名称) training courses will help you a lot in your future life? Why?

36.What do you want to do after your ……(专业名称) study?

37.What is the most important qualification that a ……(专业名称) student should have?

38.Say a little about teamwork.

39.Say a little about management.

40.How communication works in organizations?

41.Tell me the relationship between the management and management theory.

42.What kinds of opportunities are you looking for?

43.What joy did you enjoy the most and why?

44.What would your former boss say about you?

45.Why did you leave your last job?

四、演讲

题目

开放思维题

Java原理

操作系统

个人经历

行业前沿

基本问题

计算机网络

计算机组成原理

软件工程

数据结构

数据库

智力题

数学题(或者你本科学过的某些课程)

1.请你设计个unix文件系统

一个文件系统的结构包括引导块(boot block)、超级块(super block)、索引节点表(inode list)以及数据块(data blocks)(如下图所示)。

引导块:在文件系统的开头,典型地一般为一个扇区。如果操作系统装在该文件系统中,则该块包含了引导或初启操作系统的引导代码。如果没该文件系统没安装操作系统,则这个块的内容可能是空的。

超级块:相当于是保存了文件系统的元数据信息,描述文件系统的状态,比如它有多大,何处有空闲空间以及其他一些信息等等。(可通过 $ tune2fs -l 文件系统来查看文件系统的超级块的内容,需要root权限)

索引节点表:相当于是索引节点的一个数组,内核所引用的索引节点号即是索引节点在该数组中的下标大小。类似于文件的元数据信息。每个文件都有一个索引节点,但是一个索引节点可以对应几个文件名字,每个名字被称为一个链接(link)。内核实现文件名到索引节点的解析。

数据块:真正存放数据的地方。目录(PS:也是一个文件)在数据块中保存的数据是一系列的索引节点 <-> 文件名的 item。

2.借书问题

图书馆有一本书,m个人要去借这本书,但是这本书只能被一个人借阅,则对于某个人,他去图书馆的次数与他借到该书的概率是成正比的,设计一个算法,是人们跑的次数和借到的概率之间实现一个平衡,即不能让某个人跑的次数太多,也不能让他借到该书的概率太小。

参考操作系统里进程调度中的高响应比优先算法。随着跑腿的次数提高优先级,同一优先级里的人有相同的概率借到这本书

3.求只出现一次的数,或者只出现两次的数

一个数组中,只有一个数字出现了一次,其他都出现了两次,找出这个出现一次的数字?

一个N+1长度的数组中,存放的都是1到N的数字,只有一个数字重复,找出重复的数字?

异或

4.异常是怎么产生的

用户输入了非法数据。
要打开的文件不存在。
网络通信时连接中断
或者JVM内存溢出memory overflow。

异常类有两个主要的子类:IOException 类和 RuntimeException 类。

5.C++和java的区别

1.解释对编译:Java是一种解释性语言,意味着其在执行时会被“翻译”为二进制形式,也就是java跑得时候必须有人(jvm)去解释它(现在的Java语言,其执行方式已经不仅仅是解释执行方式了,即时编译器(JITC、just-in-time compiler)技术和原型编译技术的出现大大提高了JAVA的运行效率)。而C++则是编译语言,意味着程序只能在特定操作系统上编译并在特定系统上运行,也就是说C++一步到位成机器语言的。

Compiled language and interpreted language

C Primer Plus

Primer[ˈpraɪmə®]

2、内存安全:Java是一种内存安全型语言,意味着大家可以为给定数组分配任意参数,即使超出范围也只会返回错误提示。C++更为灵活,但代价是一旦分配的参数超出资源范围,则会引起错误甚至严重崩溃。

Memory security

3、性能:Java人气极高,但其代码由于需要在运行前进行解释因此性能表现更差。C++会被编译为二进制形式,因此其能够立即运行且速度更快。如果你写一个c++的程序和做同样事情的java程序,可能你感觉两者速度差不多。但如果这两个程序都足够大、而且c++的代码经过过优化,两者的速度差就会变得很显著甚至很惊人,C++会比java快很多。

performance

4、指针:指针是一种C++结构,允许您直接在内存空间中进行值管理。Java不支持指针,因此您可能使用值引用的方式进行值传递。

pointer

5、重载:重载是指对某种方法或者运算符的功能进行“重新定义”。Java允许方法重载,而C++则允许进行运算符重载。

overload

6.java侧重于大型企业级应用开发,C++侧重于底层应用开发。Java是Android开发领域的王者,因此移动开发者无疑应该选择它作为项目基础。另外,Java也常见于Web及桌面应用乃至服务器端应用。

C++更接近机器语言,因此其软件运行速度更快且能够直接与计算机内存、磁盘、CPU或者其它设备进行协作。另外,C++也能为游戏提供良好的运行性能。

java face to enterprise development

7.Java是纯面向对象的语言,所有代码(包括函数、变量)都必须在类中定义。而C++中还有面向过程的东西,比如是全局变量和全局函数

8.C++支持多继承,Java中类都是单继承的

multiple inheritance

single inheritance

inheritance

[ɪnˈherɪtəns]

6.C#和java的区别

c#设计者更注重一线开发人员的感受,java设计者则不同,他们的关注点在于java应用系统本身,更好的降低耦合,保持OOP是其始终坚持的。

没有JDK文档的情况下,我没法写Java,但是没有MSDN的情况下,我照样写.Net的程序。

你要在代码中获取系统当前时间。你会去哪里找?至少我的第一想法是去Date类、Time类或者DateTime类里找。我在Java里找了好久,最后发现在Calendar类里。。。

在C#下,你直接去DateTime类里,就能找到。DateTime类里有个属性叫Now。而且C#的DateTime类,可以很方便的获取小时、分钟什么的。

微软专门请过1000个程序员,给他们n小时,写一个读写文件的程序。结束之后,经过微软统计发现,这1000人里大部分人首先想到去找File这个类。于是微软就在它的C#里,把File做成了个静态类,专门提供各种用于读写文件的方法。

7.委托(Delegate)

委托用于将方法作为参数传递给其他方法

虽然Java可以依靠接口,匿名内部类这些特性实现委托一样的功能,但却要麻烦许多,如果涉及到N个委托实例相加的情况,那么一个C#里面简单的"+"号,在Java里就只能用FilterChain,InterceptorStack这种概念了。

泛型(Generics)[dʒɪˈnɛrɪks]

特性(Attribute):unsafe

IDE

参数传递(parameter) ref out

LINQ

8.java构造(construction)方法跟析构Deconstruction

构造方法:

public class Rectangle {
	public Rectangle(int w, int h) {
		width = w;
		height = h;
	}
	public Rectangle() {}
}

当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数

9.static的用法

static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途

在 JVM 加载一个类的时候,若该类存在 static 修饰的成员变量和成员方法,则会为这些成员变量和成员方法在固定的位置开辟一个固定大小的内存区域,有了这些“固定”的特性,那么 JVM 就可以非常方便地访问他们。

它在内存中仅有一个,且 JVM 也只会为它分配一次内存,同时类所有的实例都共享静态变量,可以直接通过类名来访问它。

10.Error和Exception的区别

Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。

Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

11.C# MVC

模型(Model) 用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“ Model ”有对数据直接访问的权力,例如对数据库的访问。

视图(View)能够实现数据有目的的显示

控制器(Controller)起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据 Model 上的改变。

优点:

同一个 Model 可以被不同的 View 重用,所以大大提高了代码的可重用性。
Controller 是自包含(self-contained,指高独立内聚)的对象,与 Model 和 View 保持相对独立,所以可以方便的改变应用程序的数据层和业务规则。

12.类和对象的区别

类是对象的抽象,对象是类的具体实例。
class is the abstract of object, object is the specific instance of class

类是抽象的,不占用内存,而对象是具体的,占有内存空间。
class is abstract, object is concrete thing

例如:类就是水果,对象就是苹果

13.Java多态体现在哪里

接口
重载和重写

抽象类,接口,父类定义子类
abstract class, interface, parent class defince the children class

方法重载和重写

同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;
the functions with same names have different parameter list

重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!

循环与递归一定可以相互转化么

理论上是的
但实际上栈底不可预见的时候,递归是无法有效地化为循环的。

强类型与弱类型、动态类型与静态类型的区别

强类型:偏向于不容忍隐式类型转换。譬如说haskell的int就不能变成double
strongly typed, don’t tolerate the implicit type exchange

弱类型:偏向于容忍隐式类型转换。譬如说C语言的int可以变成double
weakly-typed tolerate the implicit type exchange

静态类型:编译的时候就知道每一个变量的类型,因为类型错误而不能做的事情是语法错误。
static type, know every variable[ˈveəriəbl] type when it compile

动态类型:编译的时候不知道每一个变量的类型,因为类型错误而不能做的事情是运行时错误
dynamic type, don’t know every variable[ˈveəriəbl] type when it compile

编译器与解释器

C++,直接编译成可以执行的程序再跑
compile to a program that can be running directly

解释程序是运行一条解释一条
when it run to this code then explian one

继承

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

鸟,狗,猫,都是动物

泛型genericity:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型

如何实现一个操作系统

其实就是操作系统实现了什么,操作系统的目录的6个章节背下来

操作系统

操作系统的作用:(接口与服务,进程调度,虚拟机,管理资源)

用户接口与公共服务:改善人机界面,提供各种服务

进程执行的控制者和协调者:控制程序运行,组织工作流程

扩展机与虚拟机

资源的管理者和控制者:管理系统资源

the role of OS(interface and services, process management, virtual machine, resource management

分布式系统能够“握手”,机制和协议

三个机制:

单一全局性的进程通信机制

process communication

单一全局性的进程管理和安全保护机制

process management and security protection

同步机制

总线锁

两段锁

单一全局性的资源管理机制

resource management

多处理器调度设计要点

静态分配与动态分配

static distribution and dynamic distribution

主从式结构与分布式结构

Master-slave structure and distributed architecture

算法《操作系统》P427

负载共享调度算法:一个处理器空闲就选择一个就绪线程占有处理器运行

load balancing

群调度算法:把同一个进程的多个相关线程同时调度到一组处理器上运行

Group scheduling algorithm

处理器专派调度算法

Processor-specific algorithm

动态调度算法

Dynamic scheduling algorithm

PV 操作

PV 操作与信号量的处理相关,P 表示获取的意思,V 表示释放的意思。PV 信号量机制可以用来解决进程的同步与互斥的问题。一般来说,信号量 S>=0 时,S 表示可用资源的数量。执行一次 P 操作意味着请求分配一个单位资源,因此 S 的值减 1;当 S<0 时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个 V 操作意味着释放一个单位资源,因此 S 的值加 1;若 S<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。

透明

告诉我干啥就行,这个事你别管我咋做到的

面包店算法

该算法的基本思想源于顾客在面包店中购买面包时的排队原理. 顾客在进入面包店前, 首先抓一个号, 然后按照号码由小到大的次序依次进入面包店购买面包.

这里, 面包店发放的号码是由小到大的, 但是两个或两个以上的顾客却有可能得到相同的号码(使所抓号码不同需要互斥), 如果多个顾客抓到相同的号码, 则规定按照顾客名字的字典次序进行排序, 这里假定顾客是没有重名的.

在计算机系统中, 顾客就相当于进程, 每个进程有一个唯一的标识,我们用 P 的下面加一个下标来表示. 例如: 对于 Pi 和 Pj, 如果有 i<j, 则先为 Pi 服务, 即 Pi先进入临界区

内存泄露

由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。

进程和线程的区别,然后提到了一个切换的时候的栈的问题

进程是系统进行资源分配和调度的一个独立单位。程序在系统内的执行是停停走走的,并不是连续的,使用进程来描述一个程序在一个时间段内在某个数据集上的一种行为。

线程:轻量级进程。线程是进程中能够并发执行的实体,是进程的组成部分,也是处理器调度和分派的基本单位。

线程状态:运行,就绪,等待,终止

没有挂起:线程不是资源拥有单位。对换出内存的是其所属的进程

优点:

快速线程切换
通信易于实现
减少管理开销
并发程序提高

为什么引入线程:

开销:减少程序并发执行时所付出的时空开销
并发性:使得并发粒度更细,并发性更好
分离“独立分配资源”与“被调度分派执行”

操作系统里面的进程的“三态”“五态”“七态”是什么

三态模型
七态模型

死锁

一个进程集合内每个进程都在等待只能由此集合中的其他进程才能引发的事件,而无限期僵持的现象

死锁产生的原因

进程推进顺序不当(Improper sequence of process advancement)
PV使用不妥(Improper use of PV operation)
资源分配不均(Uneven distribution of resources)
资源使用不加限制(Unrestricted use of resources)

死锁的条件

互斥(mutually exclusive)
占有和等待(Possession and waiting)
不剥夺(non-deprivation)
循环等待(wait in a loop)

解决死锁

死锁防止,死锁避免,死锁检测和恢复

死锁预防(Deadlock prevention)

静态分配(static distribution)——破坏条件占有和等待
按序分配,层次分配(Sequential distribution, hierarchical distribution)——破坏循环等待

死锁避免(deadlock avoidance)

银行家算法——循环等待(Banker’s Algorithm - Loop Waiting)

死锁检测和恢复(Deadlock detection and recovery)

资源剥夺(Deprivation of resources)
进程回退(process regression)
进程撤销(Revocation process)
系统重启(system reboot)

“目态”和“管态”

特权指令(privileged order):仅在内核态下才能使用的指令
非特权指令(non-privileged order):目态与管态皆可。应用程序只能使用非特权指令

内核态与用户态:Kernel[ˈkɜːnl] state and user state

内核态:全部机器指令允许运行

用户态转变为内核态的情况:

系统调用(system call)

中断(interruption)(如I/O操作完成)

异常事件

解释系统调用syscall和库函数的区别

系统调用:使用系统服务

作用:保证系统安全性,提供一致性接口

系统调用的分类:

1.进程管理(Process management)
2.文件管理(Document management)
3.设备管理(Equipment management)
4.存储管理(Storage Management)
5.进程通信(Process communication)
6.信息维护(Information maintenance):系统信息

文件管理

文件组织有(文件的逻辑结构):有结构的记录文件(Recorded documents)和无结构的流文件(streaming documents)

还可以分为:顺序文件,索引文件,索引顺序文件(Sequential[sɪˈkwenʃl] file, index file, index Sequential[sɪˈkwenʃl] file)

操作系统的文件管理(物理结构):

  1. 顺序结构:一种简单的物理结构,将一个逻辑文件存储在外存连续的物理块中
    Sequential[sɪˈkwenʃl] structure: a simple physical structure that stores a logical file in a continuous physical block of external memory

  2. 链接结构(link structure):将逻辑上连续的文件存放在外存不连续的区域上。通过链表的方式将同一个文件串成一个链表。
    Store logically contiguous files on areas where the external memory is not contiguous.

  3. 索引结构:索引结构将一个逻辑文件的信息存放在外存的若干个物理块中,并为每个文件建立一个索引表,索引表中的每个表目存放文件信息所在的逻辑块号中和与之对应信息存放在的逻辑结构和与之对应的物理块号中,以索引结构存放的文件称为索引文件。
    Index structure: the index structure stores the information of a logical file in several physical blocks in an external memory and creates an index table for each file

文件的存储空间管理:空闲表和空闲链表,还有位示图(bit diagram)

页表(page table)

页表是一种特殊的数据结构,放在系统空间的页表区,存放逻辑页与物理页帧的对应关系。
A page-table is a special data structure that is placed in the page-table area of the system space and houses the correspondence between logical pages and physical page frames

每一个进程都拥有一个自己的页表,PCB 表中有指针指向页表
页表里面存放的是物理页号,有效位,脏位等

虚存,内存

虚存:外存当内存使用,对于用户而言,好像有着比实际内存更大的内存空间
Use the external memory as memory. To the user, it seems that there is more memory space than the actual memory.

使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上
It makes the application think it has continuously available memory

内存:内存(Memory)也被称为内存储器和主存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据
It temporarily stores computing data in the CPU.

个人经历部分

万年基本功-自我介绍
1分钟版的
2分钟版的
3分钟版的

毕业设计(Graduation project)
最喜欢的一门课程
做过的项目
项目中印象很深的事情

专业课的学习情况
为什么要考研
谈谈你的一个程序设计的感想

HTML5

HTML5指的是包括HTML、CSS和JavaScript在内的一套技术组合。
优点:
1、网络标准统一、HTML5本身是由W3C推荐出来的。
2、多设备、跨平台
3、即时更新。
4、提高可用性和改进用户的友好体验;
5、有几个新的标签,这将有助于开发人员定义重要的内容;
6、可以给站点带来更多的多媒体元素(视频和音频);
7、可以很好的替代Flash和Silverlight;
8、涉及到网站的抓取和索引的时候,对于SEO很友好;
9、被大量应用于移动应用程序和游戏。
缺点:(总结来讲就是目前客观环境对它的支持还不够,开发者,用户与各种浏览器)
a)安全:像之前Firefox4的web socket和透明代理的实现存在严重的安全问题,同时web storage、web socket 这样的功能很容易被黑客利用,来盗取用户的信息和资料。
b)完善性:许多特性各浏览器的支持程度也不一样。
c)技术门槛:HTML5简化开发者工作的同时代表了有许多新的属性和API需要开发者学习,像web worker、web socket、web storage 等新特性,后台甚至浏览器原理的知识,机遇的同时也是巨大的挑战
d)性能:某些平台上的引擎问题导致HTML5性能低下。
e)浏览器兼容性:最大缺点,IE9以下浏览器几乎全军覆没。

问一些大数据的知识,不让你说定义,问大数据的特征,举一个例子说明什么是大数据,具体是怎么实现的

注重个体,从整体的地方发现一些特定的规律,比如很著名的啤酒和尿布的故事

Focusing on the individual, Discover some specific laws.

网易云音乐的推荐功能。
NetEase Cloud Music’s recommendation function

1.给音乐进行归类并建立评分规则
这是我们前面说到的给内容分类,是每个平台推荐前要做好的准备。简单说就是把音乐贴标签,把相同/相似标签的音乐归到一块,所以一首歌可能会被归到多个类别里,比如说同一个歌手的歌、同种曲风或者表达某一个情绪等等。
其次对用户听音乐行为建立评分规则有助于更好分析用户的喜好从而进行更精确的推荐,比如以下行为:

2.建立用户模型
制定评分规则后,就可以得到每个用户和该用户相关的每首歌的一个得分,那么根据这些数据就可以给用户建立相应的模型从而为其做精确推荐。

3.寻找相似的用户
常用的计算相似度评价值的体系有两种:欧几里得距离和皮尔逊相关度

云盘用过没?说说优缺点?

百度云盘。
Baidu Cloud

优点:
多端同步,减少冗余
Consistency across platforms, can use it in mobilephone, ipad or PC

自己不用操心
It doesn’t take much effort.

利于分享
Easy to share

缺点:

成本太贵
Cost is too high

受限于网速
Limited by network speed

有泄露风险
There is a risk of a leak.

受限于实际政策
Subject to actual policy

用户还不愿意付钱
Users aren’t willing to pay yet.

专家系统

专家系统是一个智能计算机程序系统,其内部含有大量的某个领域专家水平的知识与经验,能够利用人类专家的知识和解决问题的方法来处理该领域问题。

也就是说,专家系统是一个具有大量的专门知识与经验的程序系统,它应用人工智能技术和计算机技术,根据某领域一个或多个专家提供的知识和经验,进行推理和判断,模拟人类专家的决策过程,以便解决那些需要人类专家处理的复杂问题。

简而言之,专家系统是一种模拟人类专家解决领域问题的计算机程序系统。
Expert system, Contains a significant amount of expert-level knowledge and experience in a field

知识库用来存放专家提供的知识。专家系统的问题求解过程是通过知识库中的知识来模拟专家的思维方式的,因此,知识库是专家系统质量是否优越的关键所在,即知识库中知识的质量和数量决定着专家系统的质量水平。
Knowledge database used to house knowledge

图灵测试

Turing test

提出了一种测试机器是不是具备人类智能的方法
Proposed a way to test whether machines have human intelligence.

提出一假想:即一个人在不接触对方的情况下,通过一种特殊的方式,和对方进行一系列的问答,如果在相当长时间内,他无法根据这些问题判断对方是人还是计算机,那么,就可以认为这个计算机具有同人相当的智力,即这台计算机是能思维的。这就是著名的“图灵测试”(Turing Testing)

One person without touching the other, take series of questions and answers with each other. If, for a considerable period of time, he is unable to tell whether the other person is a human being or a computer, then the computer can be considered to have the intelligence of a human being equivalent

服务器怎么利用最大化,盈利模式
google关于云申请了哪些专利

“是这样的张总,你在家里的电脑上按了CTRL-C,然后在公司的电脑上再按CTRL-V是肯定不行的……不不,多贵的电脑都不行。”

这个经典笑话终于要终结了,Google已经将其Cloudboard云剪贴板技术申请专利,未来大家可以在不同的电脑之间复制Gmail、Google Docs和其它Google服务里的内容,如果复制的内容是带有格式的一系列表格,那么复制到文本编辑器里,所有格式也会通过HTML表格保持一致。
Mr. Zhang, if you press CTRL-C on your home computer, and then press CTRL-V on your company computer, it will definitely not work.

云打印服务
Cloud Printing Services

解释一下平台无关性

就是在不同的系统上面都可以运行了
windows
linux
unix

java 程序都是跑在虚拟机上面的,sun 给不同的系统都作了虚拟机
Java 主要靠 Java 虚拟机(JVM)在目标码级实现平台无关性

网格和云计算是什么

网格(Grid),在信息学中,网格是一种用于集成或共享地理上分布的各种资源(包括计算机系统、存储系统、通信系统、文件、数据库、程序等),使之成为有机的整体,共同完成各种所需任务的机制。

云计算(cloud computing)是分布式计算的一种,指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序,然后,通过多部服务器组成的系统进行处理和分析这些小程序得到结果并返回给用户。

The grid takes resources from different places and brings them together so that they appear to be one

现阶段所说的云服务(Cloud services)已经不单单是一种分布式计算(distributed computing),而是分布式计算(distributed computing)、效用计算、负载均衡(load balancing)、并行计算(parallel computing)、网络存储(network storage)、热备份冗杂和虚拟化(virtualization)等计算机技术混合演进并跃升的结果

Cloud services at this stage are no longer just a form of distributed computing, but are the result of the hybrid evolution and leap forward of distributed computing, utility computing, load balancing, parallel computing, network storage, hot backup redundancy and virtualization, among other computer technologies

特点
虚拟化技术(virtualization technology)
动态可扩展
灵活性高(High flexibility)
可靠性高(High reliability)
经济(save money)

微信与 QQ 的区别
ACM 的全称

ACM (Association for Computing Machinery ) 中文:国际计算机学会

图灵机的停机问题

判断任意一个程序是否能在有限的时间之内结束运行的问题
whether any one program can be terminated within a limited period of time

什么是透明计算

透明计算是一种用户无需感知计算机操作系统、中间件、应用程序和通信网络的具体所在;只需根据自己的需求,通过网络从所使用的各种终端设备(包括固定、移动、以及家庭中的各类终端设备)中选择并使用相应服务(例如计算、电话、电视、上网和娱乐等)的计算模式。
transparent calculation, Simply select and use the appropriate service according to your needs

强调两点:
跨平台cross-platform
云计算cloud computing

谈谈慕课对教育方式的影响
关于Google

全美乃至于全球大学生最希望进入的公司
The companies that college students across America and the world want to get into the most

行业领先的技术公司
Industry-leading technology company

拥有的业务:
Google
youtube
gmail
chrome
google map
andriod
google play

Windows 系统为什么容易受到攻击

1.在微软的 Windows 系统中,自动更新程序只会升级那些由微软公司官方所提供的组件。而第三方的应用程序却不会得到修补。从而,第三方的应用程序可能会给你的系统带来大量的安全隐患。
Third-party apps that don’t get fixed.

2.window 系统用户人多,攻击的人也多
window system has a large number of users, and a large number of attacker

3.windows 代码的不公开,很多安全问题都被掩盖起来
windows is closed source and many security issues are covered up

关系数据库和NoSql的区别的应用场景

Nosql的全称是Not Only Sql
1.存储方式:关系型数据库是表格式。而Nosql数据库则与其相反,通常存储在数据集中
2.存储结构:关系型数据库对应的是结构化数据,但是修改这些数据比较困难。而Nosql数据库基于动态结构,可以很容易适应数据类型和结构的变化。
Structured vs. Unstructured
3.存储规范:关系型数据库的数据存储为了更高的规范性,把数据分割为最小的关系表以避免重复,获得精简的空间利用。虽然管理起来很清晰,但是单个操作设计到多张表的时候,数据管理就显得有点麻烦。而Nosql数据存储在平面数据集中,数据经常可能会重复。单个数据库很少被分隔开,而是存储成了一个整体,这样整块数据更加便于读写
4.存储扩展:关系型数据库是纵向扩展,也就是说想要提高处理能力,要使用速度更快的计算机。而Nosql数据库是横向扩展的,它的存储天然就是分布式的,可以通过给资源池添加更多的普通数据库服务器来分担负载。

横向扩展是已扩展服务器的数量进行高并发的处理(增强处理业务的能力)

根据配置nginx的反向代理,转发服务器(配置的ip)进行轮换处理业务(可加入负载均衡器进行分发请求)

纵向扩展,是增加单机的处理能力,一般增加cpu的处理能力

Easy to expand vs. diffcult to expand

5.查询方式:关系型数据库通过结构化查询语言来操作数据库(就是我们通常说的SQL)。SQL支持数据库CURD操作的功能非常强大,是业界的标准用法。而Nosql查询以块为单元操作数据,使用的是非结构化查询语言(UnQl),它是没有标准的。

SQL(Structured Query Language) vs. unstructured query language

6.事务

关系型数据库遵循ACID规则,而Nosql数据库遵循BASE原则(基本可用(Basically Availble)、软/柔性事务(Soft-state )、最终一致性(Eventual Consistency))。由于关系型数据库的数据强一致性,所以对事务的支持很好。关系型数据库支持对事务原子性细粒度控制,并且易于回滚事务。而Nosql数据库是在CAP(一致性、可用性、分区容忍度)中任选两项,因为基于节点的分布式系统中,很难全部满足,所以对事务的支持不是很好,虽然也可以使用事务,但是并不是Nosql的闪光点。

Relational databases follow ACID rules, while Nosql databases follow BASE principles

7.性能
关系型数据库为了维护数据的一致性付出了巨大的代价,读写性能比较差。在面对高并发读写性能非常差,面对海量数据的时候效率非常低。而Nosql存储的格式都是key-value类型的,并且存储在内存中,非常容易存储,而且对于数据的一致性是弱要求。Nosql无需sql的解析,提高了读写性能。
In the face of high concurrent reading and writing, the performance of relational databases is poor. Nosql is better than relational databases

8.授权方式
关系型数据库通常有SQL Server,Mysql,Oracle。主流的Nosql数据库有redis,memcache,MongoDb。大多数的关系型数据库都是付费的并且价格昂贵,成本较大,而Nosql数据库通常都是开源的。
free and high cost

记忆起点:ACID(事务)->结构
结构->性能

关系型数据库

优点:
1.事务处理—保持数据的一致性
2.由于以标准化为前提,数据更新的开销很小(相同的字段基本上只有一处);
3.可以进行Join等复杂查询。
4.基于严格的数学
5.标准化SQL
6.事务

缺点
1.性能
2.纵向扩展
3.贵

nosql
优点

  1. 简单的扩展(集群)
  2. 高性能(它们可以处理超大量的数据):主要例子有Redis,由于其逻辑简单,而且纯内存操作,使得其性能非常出色,单节点每秒可以处理超过10万次读写操作;
  3. 低廉的成本:这是大多数分布式数据库共有的特点,因为主要都是开源软件,没有昂贵的License成本;
    4.灵活的数据模型。不需要事先对存储数据建立字段。
    5.高可用。

缺点:
1.不提供对SQL的支持:如果不支持SQL这样的工业标准,将会对用户产生一定的学习和应用迁移成本;
2.不支持事务
3.现有产品的不够成熟:大多数产品都还处于初创期,和关系型数据库几十年的完善不可同日而语;
4.很难保证数据一致性
5.不能支持比较复杂的计算
6.NoSQL 并不完全安全稳定,由于它基于内存,一旦停电或者机器故障数据就很容易丢失数据,其持久化能力也是有限的,而基于磁盘的数据库则不会出现这样的问题

数据量大和高并发的优化策略,从硬件,系统和应用层面分析

硬件

物理存储(physical storage):分表存储

锁机制(locking mechanism)

横向扩展(Horizontal [ˌhɒrɪˈzɒntl] expansion)

纵向拓展(Vertical expansion):CPU,硬件,内存,网络

分布式(distributed)

RAID

缓存(cache)

系统

nosql

redis

读写分离(read-write separation)

合理的设计,根据访问量(Reasonable design)

静态资源(static resource)

负载均衡(load balancing)

前后端分离(Front and back end separation)

MQ消息队列

应用

合理的SQL(reasonable SQL)

限流: 令牌桶、漏桶(Restricted flow: token buckets, leaky buckets)

熔断降级(Fuse downgrade)

控制合法请求(Control of legitimate requests)

DevOps /de’vɒps/

DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。

在很多企业中,应用程序发布是一项涉及多个团队、压力很大、风险很高的活动。然而在具备DevOps能力的组织中,应用程序发布的风险很低,原因如下:

(1)减少变更范围
与传统的瀑布模式模型相比,采用敏捷或迭代式开发意味着更频繁的发布、每次发布包含的变化更少。由于部署经常进行,因此每次部署不会对生产系统造成巨大影响,应用程序会以平滑的速率逐渐生长。

(2)加强发布协调
靠强有力的发布协调人来弥合开发与运营之间的技能鸿沟和沟通鸿沟;采用电子数据表、电话会议和企业门户(wiki、sharepoint)等协作工具来确保所有相关人员理解变更的内容并全力合作。

(3)自动化
强大的部署自动化手段确保部署任务的可重复性、减少部署出错的可能性。

与传统开发方法那种大规模的、不频繁的发布(通常以“季度”或“年”为单位)相比,敏捷方法大大提升了发布频率(通常以“天”或“周”为单位)。

实现DevOps需要什么?

硬性要求:工具上的准备

上文提到了工具链的打通,那么工具自然就需要做好准备。现将工具类型及对应的不完全列举整理如下:
代码管理(SCM):GitHub、GitLab、BitBucket、SubVersion
构建工具:Ant、Gradle、maven
自动部署:Capistrano、CodeDeploy
持续集成(CI):Bamboo、Hudson、Jenkins
配置管理:Ansible、Chef、Puppet、SaltStack、ScriptRock GuardRail
容器:Docker、LXC、第三方厂商如AWS
编排:Kubernetes、Core、Apache Mesos、DC/OS
服务注册与发现:Zookeeper、etcd、Consul
脚本语言:python、ruby、shell
日志管理:ELK、Logentries
系统监控:Datadog、Graphite、Icinga、Nagios
性能监控:AppDynamics、New Relic、Splunk
压力测试:JMeter、Blaze Meter、loader.io
预警:PagerDuty、pingdom、厂商自带如AWS SNS
HTTP加速器:Varnish
消息总线:ActiveMQ、SQS
应用服务器:Tomcat、JBoss
Web服务器:Apache、Nginx、IIS
数据库:MySQL、Oracle、PostgreSQL等关系型数据库;cassandra、mongoDB、redis等NoSQL数据库
项目管理(PM):Jira、Asana、Taiga、Trello、Basecamp、Pivotal Tracker
在工具的选择上,需要结合公司业务需求和技术团队情况而定。(注:更多关于工具的详细介绍可以参见此文:51 Best DevOps Tools for #DevOps Engineers)

软性需求:文化和人

DevOps成功与否,公司组织是否利于协作是关键。开发人员和运维人员可以良好沟通互相学习,从而拥有高生产力。并且协作也存在于业务人员与开发人员之间。
出席了2016年伦敦企业级DevOps峰会的ITV公司在2012年就开始落地DevOps,其通用平台主管Clark在接受了InfoQ的采访,在谈及成功时表示,业务人员非常清楚他们希望在最小化可行产品中实现什么,工程师们就按需交付,不做多余工作。
这样,工程师们使用通用的平台(即打通的工具链)得到更好的一致性和更高的质量。此外,DevOps对工程师个人的要求也提高了,很多专家也认为招募到优秀的人才也是一个挑战。

大数据和BI数据分析有什么不同,应用大数据的场景、来源、技术架构

BI(商业智能)
中文翻译是商务智能,是一套完整的解决方案,用来将组织中现有的数据进行有效的整合, 快速准确的提供报表并提出决策依据,帮助组织做出明智的业务经营决策。

大数据
是从收集的海量数据中,通过算法将这些来自不同渠道、格式的数据进行直接分析, 从中寻找到数据之间的相关性。 简单而言, 大数据更偏重于发现,以及猜测并印证的循环逼近过程。

1.结构化VS非结构化(Structured vs. Unstructured)

2.整体VS个体(Whole vs. Individual)
大数据对于传统 BI,既有继承,也有发展,从”道”的角度讲, BI 与大数据区别在于前者更倾向于决策, 对事实描述更多是基于群体共性, 帮助决策者掌握宏观统计趋势, 适合经营运营指标支撑类问题, 大数据则内涵更广, 倾向于刻画个体,更多的在于个性化的决策。

3.传统数据库VSHadoop。(Traditional database VS Hadoop)
传统 BI 使用的是 ETL、数据仓库、 OLAP、可视化报表技术,ERP,属于应用和展示层技术,目前都处于淘汰的边缘,因为它解决不了海量数据 ( 包括结构化与非结构化)的处理问题。而大数据应用的是一个完整的技术体系,包括用 Hadoop、流处理等技术解决海量的结构化、 非结构化数据的 ETL问题,用 Hadoop、MPP等技术计算海量数据的计算问题, 用 redis 、HBASE等方式解决高效读的问题, 用 Impala等技术实现在线分析等问题。因此是个全新的行业。

4.集中式存储VS分布式存储(Centralized Storage vs. Distributed Storage)
在大数据环境中,数据存储在分布式文件系统(例如HDFS)上,而不是存储在中央服务器上。数据将分布在工作节点上,以便于处理。分布式文件系统更加安全和灵活。

5.报表式分析VS探索式发现与分析:(Report analysis vs Exploratory Discovery)
个人理解:一个是已经有了条条框框的模型,往里面放东西,然后得出结果。一个是像牛顿一样,苹果砸在你头上,你想探究这个现象

大数据的应用场景:
零售(retail)
电子商务(e-commerce)
快递(express delivery industry)

基本问题

谈谈你的缺点

举一个人生中最失败的经历

我们为什么要录用你

谈谈你的家庭情况

你最崇拜谁

你的座右铭是什么

你的学习成绩如何

你谈恋爱了吗?你如何看待大学生谈恋爱?

假如你流落荒岛,可以拥有一本书,你会选择哪一本?为什么?

外语水平?

你喜欢你的本科学校吗?你的老师怎么样?

请问你还有问题要问吗?

谈一谈你在过去事情中生活中遇到的问题,以及如何解决。

你最大的长处和弱点分别是什么?这些长处和弱点对你在读研过程中会有什么样的影响?

是否有教授或者咨询师曾经让你处于尴尬境地,还让你感到不自信?在这种情况下,你是怎样回应的?

你是否曾经得到过低于自己预期的成绩?如果得到过,你是怎样处理这件事情的?

出于个人发展的考虑,硕士毕业之后你打算继续深造吗,比如读博或出国留学?

你曾经参加过哪些竞争活动?这些活动值得吗?

你怎样影响其他人接受你的看法?

在做口头表达方面你有哪些经验?你怎样评价自己的口头表达能力?

你怎样比较自己的口头技能和写作技能?

在写专业论文时你最不喜欢哪些方面?

你的好友怎样评价你?

你和同学怎样相处?

你认为自己最显著的成就是什么?为什么?

在什么情况下你的事情或学习最为成功?

竞争对你的成就有什么积极或者消极的影响?是怎样影响的?

如果重新开始读大学的话,你的做法会有什么不同?

你个人的长期和短期目标分别是什么?你是如何确定这些目标的?你准备怎样实现这些目标?

什么样的情形会让你感到沮丧?

你确信自己是正确的,但是其他人却不赞同你时,你会怎样做?

你能够在压力状态下事情得很好吗?

你认为你能通过复试么

“你对你自己的本科成绩是否满意?”

你如何评价你的大学生活?

你是否有出国的打算,你对出国有什么看法?

谈谈你对国内外研究生制度的看法,有什么建设性的意见?

你在大学里的学习成绩不敢恭维,你如何解释呢?

你怎样对待自己的失敗?

你和别人发生过争执吗?你是怎样解决的?

你做过的哪件事最令自己感到骄傲?

说说你对行业、技术发展趋势的看法?

你认为你在学校属于好学生吗?

通信基站能定位吗?答能,讲原理,又问能精确定位吗?

基站定位 , 就是靠从用户手机上获得基站(base station)的信息 , 然后将基站信息上传给基站定位提供商的服务器 , 服务器拥有这些基站所在地的经纬度信息 , 返回给用户 , 用户就知道了自己的大概位置

计算机网络

计算机网络是一个将分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统
computer network, Connected by hardware, A system for resource sharing and information transfer by software

http与https的区别

HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
transmit the infromation from the server to the client

HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
more safer HTTP protocol[ˈprəʊtəkɒl]
HTTPS协议可以理解为HTTP协议的升级,就是在HTTP的基础上增加了数据加密。在数据进行传输之前,对数据进行加密,然后再发送到服务器。这样,就算数据被第三者所截获,但是由于数据是加密的,所以你的个人信息让然是安全的。这就是HTTP和HTTPS的最大区别。

计算机网络的各层

OSI模型

物理层:在物理媒体上透明地传输比特流
Physical layer: transparent transmission of bit streams over physical media

数据链路层:点到点通信。成帧,差错控制,流量控制,传输管理
Data link layer: point-to-point communication. Framing, Error Control, Traffic Control, Transmission Management

网络层:为不同主机提供通信服务
Network layer: communication services for different hosts
流量控制(flow control)
拥塞控制(congestion control)
差错控制(error control)
网际交互(Internet interaction)

传输层:主机间进程间的通信。提供端到端的可靠的传输服务。流量控制,差错控制,服务质量,数据传输管理
Transport layer: communication between processes between hosts. Provides end-to-end reliable transmission services. Traffic control, error control, quality of service, data transfer management

会话层:不同主机之间的进程进行会话
Session layer: Processes between different hosts to have a session

表示层:交换信息的表示方式
Representation layer: a representation of the information exchanged

应用层:用户与网络的界面
Application layer: user interface to the network

TCP/IP模型

网际接口层
网际层
传输层
应用层

TCP/IP协议
TCP/IP模型
网际接口层
网际层
传输层
应用层

播放视频流
边下载边播放的流式
实时传输协议

路由协议

IGP:内部网关协议(Internal gateway protocol),域内路由选择。一个自治系统内部额所使用的路由选择协议。RIP,OSPF
EGP:外部网关协议(External Gateway Protocol),域间路由选择。自治系统之间所使用的路由选择协议。用于不同自治系统之间的路由器交换路由信息。BGP

OSPF(Open Shortest Path First):

IGP的一种,使用迪杰斯特拉算法
LSA(链路状态通告)来在网络中的路由器之间交换网络拓扑信息
基本特点:
向本自治系统中所有路由器发送信息,使用洪泛法
Sending information to all routers in this autonomous system

发送的信息是与路由器相邻的所有路由器的链路状态
The message sent is the link status of all routers adjacent to the router

只有链路状态发生变化时,路由器才向所有路由器发送此信息
The router sends this information to all routers only when the link status changes

OSPF是网络层协议,直接用IP数据报发送
OSPF is a network layer protocol that sends directly over IP datagram

能适用于规模很大的自治系统中
Can be applied to large autonomous systems

全网范围内是一致的
It’s consistent across the board.

灵活
flexible

多路径间的负载平衡
load balancing

子网划分与CIDR
Subnet segmentation and CIDR

虽然能算出完整的最优路径,但路由表中不会存储完整路径。只存储“下一跳”能将一个自治系统再划分为更小的范围
subdivide an autonomous system into smaller areas

RIP(Routing Information Protocol)

IGP的一种。应用层协议,传输层使用UDP
Application layer protocol, transport layer using UDP

使用跳数,每经过一个路由器,跳数加1
一条路径最多15个路由器。距离16不可达
There are up to 15 routers in a single path. Distance 16 is inaccessible.

特点
仅和相邻路由器交换信息
Exchange information only with adjacent routers

交换的是当前路由器所知道的全部信息,即自己的路由表
What is exchanged is all the information that the current router knows, its own routing table

选择最小跳数路由
缺点
限制了网络的规模
Limiting the size of the network

开销大,交换的是完整的路由表
High cost, full routing tables are exchanged.

慢收敛,需要较长时间才能将此信息传送到所有路由器
It takes a long time to transfer this information to all routers

RIP比较OSPF

RIP发送整个路由表,OSPF发送路由表的一部分
RIP sends the entire routing table, OSPF sends part of the routing table

带冲突检测的载波侦听的英文全称,还有什么指数回退的原因

CSMA/CD(载波侦听多路访问/碰撞检测):

CSMA的改进,适用于总线型网络或者半双工环境。不太可能全双工通信

应用于有线连接的局域网
Local Area Network (LAN) for wired connections

先听后发,边听边发(区别于CSMA协议),冲突停发,随机重发(二进制退避算法)
Listen before send, listen while send (different from CSMA protocol), conflict stop, random retransmission (binary backspace algorithm)

二进制指数退避算法等待一段时间
争用期(冲突窗口或碰撞窗口):2*单程传播时延
最小帧长:以太网规定64B,太短了无法判断是否会冲突,发出此帧的时候,前期发送的侦听帧还没回来

二进制退避算法:最多重传16次

解释下FTP、HTTP全称及其原理

FTP(文件传输协议):异构网络中任意计算机之间传送文件。提供交互式的访问,允许客户指明文件的类型与格式,允许文件具有存取权限

提供的功能:
不同种类主机系统之间的文件传输能力
以用户权限方式提供用户对远程FTP服务器上的文件管理能力
以匿名FTP的方式提供公用文件共享的能力
C/S工作方式,FTP。由主进程与若干从属进程构成
控制连接(端口21)与数据连接(端口20)
Control connection (port 21) and data connection (port 20)

HTTP(超文本传送协议):为了实现万维网上各种链接,万维网客户程序与万维网服务器程序之间的交互必须严格遵守的协议。HTTP是一个应用层协议,它使用TCP连接进行可靠的传送
面向事务,无状态(我不记得你),HTTP本身是无连接的,面向文本(每个字段都是一些ASCII码串)

HTTP的两类报文:请求报文,响应报文
持久连接:服务器发送响应后仍保持这个连接。
非持久连接:每个元素都单独用TCP连接
流水线:每遇到一个对象引用就发出一个请求
非流水线:收到一个响应才能发下一个

电子邮件发送到接收的过程

UA用SMTP推送到发送端服务器,发送端服务器用SMTP推送到接收端服务器,收件人用POP从服务器拉邮件到本地UA

SMTP POP协议

P2P技术,具体的实现机制

中继(Relaying)

这是最可靠但也是最低效的一种P2P通信实现。其原理是通过一个有公网IP的服务器中间人对两个内网客户端的通信数据进行中继和转发。如下图所示:

客户端A和客户端B不直接通信,而是先都与服务端S建立链接,然后再通过S和对方建立的通路来中继传递的数据。这钟方法的缺陷很明显,当链接的客户端变多之后,会显著增加服务器的负担,完全没体现出P2P的优势。

逆向链接(Connection reversal)

第二种方法在当两个端点中有一个不存在中间件的时候有效。例如,客户端A在NAT之后而客户端B拥有全局IP地址,如下图:

客户端A内网地址为10.0.0.1,且应用程序正在使用TCP端口1234。A和服务器S建立了一个链接,服务器的IP地址为18.181.0.31,监听1235端口。NAT A给客户端A分配了TCP端口62000,地址为NAT的公网IP地址155.99.25.11,作为客户端A对外当前会话的临时IP和端口。因此S认为客户端A就是155.99.25.11:62000。而B由于有公网地址,所以对S来说B就是138.76.29.7:1234。

当客户端B想要发起一个对客户端A的P2P链接时,要么链接A的外网地址155.99.25.11:62000,要么链接A的内网地址10.0.0.1:1234,然而两种方式链接都会失败。链接10.0.0.1:1234失败自不用说,为什么链接155.99.25.11:62000也会失败呢?来自B的TCP SYN握手请求到达NAT A的时候会被拒绝,因为对NAT A来说只有外出的链接才是允许的。

在直接链接A失败之后,B可以通过S向A中继一个链接请求,从而从A方向“逆向“地建立起A-B之间的点对点链接。

很多当前的P2P系统都实现了这种技术,但其局限性也是很明显的,只有当其中一方有公网IP时链接才能建立。越来越多的情况下,通信的双方都在NAT之后,因此就要用到我们下面介绍的第三种技术了。

UDP打洞(UDP hole punching)

第三种P2P通信技术,被广泛采用的,名为“P2P打洞“。P2P打洞技术依赖于通常防火墙和cone NAT允许正当的P2P应用程序在中间件中打洞且与对方建立直接链接的特性。以下主要考虑两种常见的场景,以及应用程序如何设计去完美地处理这些情况。第一种场景代表了大多数情况,即两个需要直接链接的客户端处在两个不同的NAT之后;第二种场景是两个客户端在同一个NAT之后,但客户端自己并不需要知道。

IEEE(Institute of Electrical and Electronics Engineers)

国际电气电子工程师协会:世界上最大的专业技术团队。致力于电气、电子、计算机工程和与科学有关的领域的开发和研究

握手

https://blog.csdn.net/qq_38950316/article/details/81087809

无状态路由

无状态路由就不需要流表这些,就单纯根据每个报文头部的字段处理,不关心报文对应流的历史状态

计算机中如何表示数据

使用二进制来表示数据,有原码,补码,反码,移码
Using binary to represent data, There is original code, complementary code, reverse code, shift code

定点数

固定小数点的位置来表示小数点。定点整数小数点在最后一位,定点小数在符号位的后面

浮点数(floating point)

通过阶码,位数,符号位来表示浮点数
Floating-point numbers by order code, bits, symbolic bits

a = m × b^e

我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd…ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。

冯诺依曼体系结构(Von Neumann architecture)

input device
output device
memory
operator(calculator)
controller

TLB

TLB就是页表的Cache,其中存储了当前最可能被访问到的页表项,其内容是部分页表项的一个副本。只有在TLB无法完成地址翻译任务时,才会到内存中查询页表,这样就减少了页表查询导致的处理器性能下降。
cache for page table, which stores the current page table items most likely to be accessed

什么是计算机,计算,语法,语义,语用

计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能。是能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。由硬件系统和软件系统所组成
It use to compute, and now it was a machine with many functions, such as store data, run the process, deal with big data.

语法(grammar):一种规范,在那种语言中什么样的字符串被认为是有效程序
A specification, what kind of string is considered a valid program in that language

Java:boolean表示布尔量
C#:写成bool

语义:语法的表意,做了什么。i++这个操作具体做了什么
semantic, the mean of this operation
semantic[sɪˈmæntɪk]

语用:研究句子的言外之意。比如女朋友跟你说,我今天发烧39度了。表意是事实,但是基于她与你的关系,她想说的是让你关心照顾一下她
Semantic use: studying the meaning of sentences

Cache的两种更新策略

回写法和直写法
1〉 write through:CPU 向 cache 写入数据时,同时向 memory 也写一份,使 cache 和 memory的数据保持一致。
优点是简单,缺点是每次都要访问 memory,速度比较慢。

2〉write back:CPU更新cache时,只是把更新的cache区标记一下,并不同步更新memory。
只是在 cache 区要被新进入的数据取代时,才更新 memory。
这样做的原因是考虑到很多时候 cache 存入的是中间结果,没有必要同步更新 memory。
优点是 CPU 执行的效率提高,缺点是实现起来技术比较复杂。

Cache

Cache 是一种小容量的高速缓冲存储器,由快速的 SRAM 组成,直接制作在 CPU 芯片中。其根据程序访问的局部性(localized principle),将主存中活跃的程序块和数据块复制到 cache 中,CPU 直接从 cache中读取数据,而不必访问低速的内存
store the data that will be visited frequently

Cache 的评价标准:命中率,访存时间

改进方案:选用较好的替换算法,扩大 cache 的容量,采用多级 cache 和数据和指令 cache分类策略。

用到 cache 的思想的有:
基地址寄存器,将经常使用的基地址放在一个高速寄存器中,存储器的分层结构。

软件工程

软件工程定义

①将系统的、规范的、可量化(成体系,有步骤,量化的的方法)的方法应用于软件的开发、运行和维护,即将工程化应用于软件;
②对①中所述方法的研究

瀑布模型的缺点

瀑布模型(Waterfall Model):按照一个阶段到另一个阶段的有序的转换序列。要求每一个活动必须进行验证。

允许出现迭代,每个活动的结果必须验证,“文档驱动”
需求工程→软件设计→软件实现→软件测试→软件交付→软件维护(可以迭代反复)。

缺点:对文档的高期望、对开发活动的线性预设、客户用户参与不够、里程碑粒度过粗。

适用范围:需求非常成熟稳定、技术可靠、复杂度适中的工程。

如何做需求分析

需求获取,需求分析,建模,给出解决方案
Requirements acquisition, requirements analysis, modeling, solutions

Object-oriented analysis methods
Use case diagram, class diagram, sequence diagram, state diagram

Structured analysis methods
Data Flow Diagram
Entity Relationship Diagram

开闭原则的缺点

当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
add the code to realize change. Not to modify the code

缺点:类特别多
too much class

软件生命周期

软件生命周期模型:需求工程→软件设计→软件实现→软件测试→软件交付→软件维护

Software Life Cycle Model:
Requirements Engineering → Software Design → Software Implementation → Software Testing → Software Delivery → Software Maintenance

观察者模式
软件工程是什么,需要哪些文档

用例文档,软件需求规格说明文档
Use case documentation, software requirements specification documentation

内聚和耦合

耦合:描述了两个模块之间的复杂程度。
Coupling: describes the level of complexity between two modules.

内聚:表达了一个模块内部联系的紧密型。
Cohesion: expresses the tightness of connection within a module.

什么是质量高的软件,你觉得软件质量如何提高
软件测试(黑白盒)

黑盒测试:把测试对象看做一个黑盒子,完全基于输入和输出来判断测试对象的正确性

优点 :

  1. 比较简单,不需要了解程序的内部的代码及实现
  2. 与软件的内部实现无关
  3. 从用户的角度出发,能很容易的知道用户会用到哪些功能,会遇到哪些问题
  4. 基于软件开发文档,所以也能知道软件实现了文档中的哪些功能
  5. 在做软件自动化测试时较为方便

缺点:不可能覆盖所有的代码

常见方法:
1)等价类划分
2)边界值分析
3)决策表
4)状态转换

白盒测试:把测试对象看做透明的,按照测试对象内部的程序结构来设计测试用例进行测试工作

优点:帮助软件测试人员增大代码的覆盖率

缺点:
测试基于代码,只能测试开发人员做的对不对,而不能知道设计是否正确,可能会漏掉一些功能需求

系统庞大时,测试开销会非常大

(能解释并区别白盒测试三种不同的方法)

常见方法:
1)语句覆盖:保证每一行代码都至少执行一次。
2)分支覆盖:保证每个判断结果都至少满足一次。
3)路径覆盖:保证每条独立的执行路径都至少执行一次。

说说设计模式

观察者模式
设计模式(Design Pattern):P263

策略模式:
抽象Strategy,实现不同的ConcreteStrategy方法,Context拥有Strategy的一个引用。
优点
减少算法类与使用算法类之间的耦合
提供可重用方法
简化单元测试
扩展性好
缺点
策略类增多
策略需要对外暴露

抽象工厂模式:
AbstractFactory声明接口,ConcreteFactory实现对产品的创建。
AbstractProduct定义产品接口,ConcreteProduct实现具体工厂创建出来的产品,实现接口。
Client使用AbstractFactory和AbstractProduct来创建。

优点
易于交换产品系列
具体的创建实例过程与客户端分离(不知道用的到底是SQL还是mysql)
符合OCP
缺点
扩充困难

单件模式:
Singleton提供访问单件的接口,负责实现单件。
Client通过getInstance使用单件。

迭代器模式:
Iterator定义访问和遍历的接口,ConcreteIterator实现接口。
Aggregate定义创建相应迭代器对象的接口,ConcreteAggregate实现接口。

怎样提高代码可读性。那现在让你写个软件,给程序的可读性打分1–10分你怎么处理?

高内聚低耦合
封装
使用合理的变量名
合理添加注释

以得分点为基准,
达到控制耦合以上的得1分,达到时间内聚以上的得一分

变量名不使用一些简单a,b的得一分

体系结构与设计模式的区别是什么,举例说明

体系结构说的是整个项目的结构,比如使用MVC开发
The architecture describes the structure of the entire project, such as using MVC

设计模式说的是部分模块功能的一个设计
design pattern describes a design of some modules

数据结构

线性表

线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
The relationship between data elements in a linear table is a one-to-one relationship

在数据结构逻辑层次上细分,线性表可分为一般线性表和受限线性表。
一般线性表也就是我们通常所说的“线性表”,可以自由的删除或添加结点。
受限线性表主要包括栈和队列,受限表示对结点的操作受限制。

用到了栈的机制

函数的调用,每调用一次,将程序现场入栈保存。
Calling of functions

程序的递归调用。
Recursive call of the program

ADT

抽象数据类型(Abstract Data Type 简称ADT)是指一个数学模型以及定义在此数学模型上的一组操作。ADT 包括数据数据元素,数据关系以及相关的操作。
A mathematical model and the set of operations defined on it
ADT includes data data elements, data relationships and related operations.

即 ADT

{
	数据对象:(数据元素集合)
	数据关系:(数据关系二元组结合)
	基本操作:(操作函数的罗列)
}

这使得只研究和使用它的结构而不用考虑它的实现细节成为可能。
This makes it possible to study and use only its structure without considering the details of its implementation

b树

由根指向子节点,B树将索引按顺序存储,在叶节点保存索引到字段及其对应数据在表中的位置指针。从根节点开始搜索,通过节点中的指针进入下一级节点,通过比较要查找的索引值和节点中的指针大小选择进入哪个子节点,最终要么找到对应叶节点,要么没找到。叶节点中有指向表中数据的指针。
The B-tree stores the indexes sequentially from the root to the child node, Saving pointers at the leaf node.
Start the search from the root node and go to the next level of the node via the pointer in the node

贪心算法greedy algorithm

单次求解取最优,不考虑整体
Consider only the best case at a time, not the whole

操作系统哪种数据结构用的最多?

红黑树用于内存
B树用于磁盘

动态规划,时间空间复杂度要求

把原问题分解成子问题进行求解,也就是分治的思想。其实就像一个企业一样,一个老板,对应总监,总监下面有主管,主管下面管着组员
Break down big problems into small ones, partition. One boss manages 10 directors, One director manages ten department managers, department managers manage the deparment

动态规划问题,大致可以通过以下四部进行解决。
1.划分状态,即划分子问题,例如上面的例子,我们可以认为每个组下面、每个部门、每个中心下面最优秀的3个人,都是全公司最优秀的3个人的子问题
2.状态表示,即如何让计算机理解子问题。上述例子,我们可以实用f[i][3]表示第i个人,他手下最优秀的3个人是谁。
3.状态转移,即父问题是如何由子问题推导出来的。上述例子,每个人大Leader下面最优秀的人等于他下面的小Leader中最优秀的人中最优秀的几个。
4.确定边界,确定初始状态是什么?最小的子问题?最终状态又是什么。例如上述问题,最小的子问题就是每个小组长下面最优秀的人,最终状态是整个企业,初始状态为每个领导下面都没有最优名单,但是小组长下面拥有每个人的评分。

三类模型

区间
线性
树状

实现的套路
自底向上
自顶向下
https://baijiahao.baidu.com/s?id=1631319141857419948&wfr=spider&for=pc

红黑树与AVL树的区别

红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。

既然你了解数据结构,那我就问一个数据结构问题,有一个excel表格,里面有许多公式,如果出现A=B+C,B=A+D(差不多就是循环调用的意思),如何避免?
找一列数的第K大的数
快速排序(Quick Sort)
怎样把二维的图像重新构建成三维的模型
一群数里面每个数出现两次,只有一个数出现一次,怎样用N的复杂度找到只出现一次的数

空间换时间,数组计数
异或操作

Hash

通过一定的散列算法,将元素散列到地址上相对分散的空间上
By a definite hashing algorithm, elements are scattered over a relatively dispersed space on the address

解释:元素,树,图。并各举一例

图:由顶点和边结构组成的一种数据结构。可以分有向图和无向图
Graphs: A data structure consisting of a vertex and side structure
oriented graph
undirected graph

树:特殊的无回路的图
Trees: special circuitless diagrams

计算机中如何表示数据

最底层就是0和1,原码,反码,补码,移码
计算机组成原理上用定点数(fixed-point),浮点数(floating point)这些来表示

如何表示知识,谈谈数据结构

实际上,知识很难用结构化的方式来表示出来
In fact, knowledge is difficult to represent in a structured way

给定序列123,通过栈操作和打印操作,不给其他的存储器,能都打印123的任何一种排列。(全排列问题)

可以通过递归实现。每次交换元素的位置,然后递归调用自己
This can be done recursively.

数据结构-Chapter9-南大算法题

解释“优先队列”这一抽象数据类型及其实现方法

大的先出来,小的后出来
1.使用数组排序的方法实现,有大小限制
sort
2.二叉排序树来实现
binary search tree
3.堆来实现
heap

在计算机领域有很多典型问题,比如在操作系统中的“生产者消费者问题”,你能不能列举一下在其他领域的典型问题,比如在人工智能方面、图形学、算法等等。

数据结构:二叉树遍历,图的遍历,找k大,大数据量下找前N个数
Binary tree traversal, graph traversal, find the k th large num

计算机网络:TCP连接释放
TCP connection and disconnection

软件工程:瀑布模型
SE: waterfall model

数据库:customer order orderitem catagory supplier commodity

数据结构中的线性表,栈是不是线性表,还有什么用到了栈的机制

链表,顺序表,队列,栈
Chain Tables, Sequential Tables, Queues, Stacks

函数调用,递归

分治策略

分治策略是对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解

快速排序

图表示的办法,遍历图的策略,不同策略的时间复杂度

邻接矩阵。O(n*n)
adjacency matrix

邻接表。顶点表和边表。深度和广度,O(n+e)
adjacency list

谈一谈你在软件开发过程中所遇到最难的数学问题
百度地图实现计算两地公交路线最短距离适合实现

迪杰斯特拉算法

排序

选择排序,插入排序,冒泡排序,快速排序,堆排序,归并排序,基数排序。
Select sort, insert sort, bubble sort, quick sort, heap sort, merge sort, base sort.
快速排序平均时间效率最高。

数据库

数据库的事务性,就是 ACID

A原子性
C一致性
I隔离性
D持久性

数据库的恢复方法

1.根据日志进行恢复
2.通过备份进行恢复

数据库接口
使用数据库连接字

数据库范式的概念

1NF:一个关系模式R的所有属性都是不可分的基本数据项
插入异常:未选课学生不能插入
删除异常:放弃修一门课,只选修这一门课的学生被删除
错误例子:四川省成都市
正确:四川省,成都市
如关系模式S-L-C(Sno, Sdept, Sloc, Cno, Grade)

第二范式P182
R满足第一范式,且每一个非主属性完全函数依赖于任何一个候选码,则R满足第二范式
第二范式就是每一行被码唯一标识
不满足2NF:
学生信息表:学号,姓名,系名,系主任,课程名称,分数。
(正确:学号–》姓名,学号–系名,学号–》系主任,)
问题:部分依赖 分数 --依赖–》 (课程名称+学号)
正确,拆分表:
学生表:学号,姓名,系名,系主任;
学生成绩:学号,课程名称,成绩;
不满足第二范式的问题:
插入异常:
删除异常
修改复杂
S-L-C(Sno,Sdept,Sloc,Cno,Grade)
应该改为SC(Sno,Cno,Grade)和S-L(Sno,Sdept,Sloc)

3NF P184
R符合第三范式,则每一个非主属性既不传递依赖于码,也不部分依赖于码
3NF要求一个数据库表中不能包含其他表中已包含的非码信息
不满足3NF:
学生信息表:学号(主键),姓名,系名,系主任。
问题: 学号 --》 系名,系名–》系主任;存在传递依赖
拆分表:
学生信息表:学号(主键),姓名,系名;
学校系: 系名,系主任;
仍然不能完全消除关系模式中的各种异常情况和数据冗余

***BCNF(Boyce Codd Normal Form)修正的第三范式,扩充的第三范式 P184
每一个决定因素都包含码,消除任何属性对码的部分和传递函数依赖
不符合的例子:STJ,S学生,T教师,J表示课程
符合BCNF的关系模式:
所有非主属性对每一个码都是完整函数依赖
所有主属性对每一个不包含它的码也是完全函数依赖
没有任何属性完全函数依赖于非码的任何一组属性

1NF->2NF 消除非主属性对码的部分函数依赖
2NF->3NF 消除非主属性对码的传递函数依赖
3NF->BCNF 消除主属性对码的部分和传递函数依赖

数据库的查询优化有哪些?

1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
3.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
5. 任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

一个方格,从左上角走到右下角,只能向下后者向右,问有几种走法

假设从 (1,1) 走到 (m,n) ,则向下走 m-1格, 向右走 n-1格,根据全排列,有 [(m-1)+(n-1)]!种走法,再去重复计算,有 [(m-1)+(n-1)]!/[(m-1)!*(n-1)!] 种不同走法。

解释一下函数的连续
智力测验:有两柱不同的且质地均匀的香,但烧完都要用 1小时。问如何用这两柱香来表示15 分钟?

把一支香点燃一端 同时把另一支香点燃两端 当第二支香先烧完时也就是过了半小时 那么再把第一支香没点燃的那端点燃 当第一支香烧完时正好 15 分钟

数据库理论

一.

1.解释数据库中的约束

Chapter5-数据库完整性

完整性约束条件也称为完整性规则,是数据库中的数据必须满足的语义约束条件。(它表达了给定数据模型中数据及其联系所具有的制约和依存规则,用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确,有效和相容)

实体完整性Pirmary key P158

关系模型中的实体完整性在create table中用primary key定义(对单属性构成的码可以定义为列级约束条件,也可定义为表级约束条件,而对于多属性构成的码只有一种说明方法,即定义为表级约束条件)

检查与违约处理:

检查主码是否唯一,如果不唯一则拒绝插入或修改

检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改

参照完整性Foreign key P160

定义:关系模型的参照完整性在create table中用foreign key短语定义哪些列为外码,用reference短语指明这些外码参照哪些表的主码

检查:对被参照表和参照表进行增加、删除、修改操作时有可能会破坏参照完整性,必须检查以保证这两个表的相容性

不一致的处理方法

拒绝执行

级联(CASCADE)操作

设置为空值

用户定义的完整性P163

属性上的约束条件

不允许取空值

列值唯一

用CHECK短语指定列值应该满足的条件

元组上的约束条件

元组级的限制可以设置不同属性之间的取值的相互约束条件

2.描述(身份证、生日)可以达到的范式等级

任何一个二元关系都满足BCNF

3.简述SQL执行的过程

SQL的执行步骤与优化策略

SQL执行步骤

语法检查:检查 SQL 拼写是否符合语法规范

语义检查:检查访问对象是否符合存在及用户是否具有相应权限

解析:在共享池中检查是否有完全相同的之前完全解析好的,如果存在,跳过选择执行计划和产生计划,直接运行

硬解析:就是对提交的 SQL 完全重新从头进行解析,创建解析树,生成执行计划对 SQL 的执行来说是开销昂贵的动作,在很多项目中对功能相同的代码要保持一致性,用绑定变量

软解析:在共享池(shared pool)中找到了与之完全相同的 SQL 解析好的结果会跳过硬解析后面的两个步骤

执行计划:以缩排列表的方式显示 SQL 语句的执行步骤

4.描述堆结构,存储、修改的过程

IOT与堆文件

堆文件是最简单、最基本的文件结构

结构:

数据库的最小单位是块,堆文件的读取是按照块进行读取到内存的,然后再在内存中寻找具体的记录

堆文件的读取是需要遍历整个堆文件数据的

堆文件块记录的更新可能会造成行迁移,行迁移会造成读取单一记录需要读取两个块(2次I/O操作)

表是无组织的

读取/ 访问方式:

没有明确的先后之分,在进行全表扫描时,并不是先插入的数据就先获取。数据的存放是随机的

无组织,堆文件对块的插入是随机

只要有空间,数据可以被放在任何地方

数据库有很多其他的文件组织形式,比如在Oracle中的IOT,及其他很多数据库中的聚簇文件等,堆文件的随机性使其插入更新删除查询效率都很均衡,而其他的文件形式大多是顺序文件,会造成某一种类型的查询效率很高但是其他的操作效率大幅度下降

5.解释空值的含义以及它们在不同数据库中的实现

数据库中,空值表示值未知。空值不同于空白或零值。没有两个相等的空值。比较两个空值或将空值与任何其他值相比均返回未知,这是因为每个空值均为未知。

mysql

is null

IS NOT NULL

<=>: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true

sql server(oracle)

is null

is not null

二.

某商场部分关系模式如下

店铺表store(store_id, store_name, store_ floor, room_no)

商品表commodity(com_id, com_name, com_price, store_id)

销售员表saler(saler_id, saler_name, saler__gender, saler__age, store_id)

流水账单表 bill(bill_id, saler_id, com_id, purchase_quantity, total_price, bill_time)

其中,店铺表记录了该商场入驻的店铺信息,商品为每个店铺中销售的商品信息,销售员为店铺中的工作人员,流水账单表为为商场收银台交易的纪录, bill time交易发生的时间,为 datetime类型,每个流水账单只包含了一种商品,不同类商品为不同的账单,purchase_ quantity数量为正整数

(1)在生成账单记录时, total_price是由传入的 com_ id和 purchase_quantity查询到相关的单价以及数量计算出来的,请完成这样一条插入

create procedure insert(saler_id_in int,com_ id_in int, purchase_quantity_in int)

begin

declare com_price float

declare total_price float

com_price=select com_price from commodity where com_id=com_ id_in

total_price=com_price*purchase_quantity_in

insert into bill(saler_id, com_id, purchase_quantity, total_price, bill_time) values(saler_id_in,com_ id_in, purchase_quantity_in, total_price,now())

end

set @saler_id_in=…

set @com_ id_in=…

ser @purchase_quantity_in=…

call insert(@saler_id_in, @com_ id_in, @purchase_quantity_in)

(2)A店铺的老板想要了解一下店铺员工每天的销售业绩,请查询 store_id为"MCSA"的店铺里的所有员工在2015年11月11日的完成的交易笔数,以及每个员工完成的总交易额

select count(total_price) as dealCount, sum(total_price) as sum from saler s

left join bill b on s.saler_id=b.saler_id

where store_id=‘MCSA’ and date(bill_time)=‘2015-11-11’

商场的管理人员想了解2015年11月11日哪个店铺的交易额最大,查询其店铺名称,店铺所在楼层,店铺编号以及当天的交易额。

select s.store_name, s.store_ floor, s.room_no , sum(s.total_price) as sumPrice from store s

join commodity c on s.store_id= c.store_id

join bill b on b.com_id=c.com_id

where date(bill_time)=‘2015-11-11’

group by store_id

order by sumPrice desc

limit 0,1

四、(代码题。本题满分20分。)

教师表teacher(teacher_id, teacher_name, teacher_email, teacher_gender, teacher_title)

课程表course(course_id, course_name, teacher_id, term, year)

学生表student(student_id, student_name, student_grade, student_gender)

选课情况course_election(ce_id, course_id, student_id, marks)

其中,教师表中 teacher_title为教师的职称,课程表中term为学期,year为年份,如2015年第一学期,则term为1,year为2015,学生表中 student_grade为所在年级

(1)辅导员想了解其所在年级学生的课程选修数量是否合理,请查询该院系每个三年级学生2015年第一学期的选修课程数量,查询学生的 student id, student name,student grade,以及选修的课程数量。

select s.student_id, s.student_name, student_grade, count(course_id) as sumCount

from student s

left join course c on c.course_id=ce.course_id

left join course_election ce on s.student_id=ce.student_id

where s.student_grade=3 and c.term=1 and c.year=2015

(2)为了方便查询,希望创建一个课程视图,包括2015年第一学期的所有课程,包含课程表的所有字段,以及每门课的总选修人数。若没人选修,则选修人数为0

create view as

select c.course_id, c.course_name, c.teacher_id, c.term, c.year, count(*) as sumPeople from course c

left join course_election ce on ce.course_id=c.course_id

group by c.course_id

(3)教务处现在进行了一些修改,当有不及格的成绩录入时,需要对成绩进行规范处理。对于低于60分的成绩按照60分算,使用触发器完成相应的要求

create trigger grade_trigger

before insert or update on course_election

for each row

begin

if new.marks<=60 then

new.marks=60

end if;

end;

三.

1.解释SQL优化原理及背后的逻辑

SQL的执行步骤与优化策略

硬件优化:

1.存取路径:B+树索引存取方法、hash索引存取方法、聚簇存取方法

2.数据的物理布局:如何存储

3.可用内存

4.可用处理器

5.集中式存储与分布式存储。集中式存储是指将所有数据都存储在同一个节点上。这样有助于提高数据库查询和修改的效率。但是集中式存储有很大的风险,若节点出现不可逆破坏,将导致数据库崩溃。比如地震导致数据库损坏。

6.高效合理的操作算法:全表扫描、索引扫描、嵌套循环连接、排序-合并连接

7.固态存储

8.RAID

索引

索引的 5 种优点

通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

在使用分组和排序子句进行数据检索时,同样可以显着减少查询中分组和排序的时间。

通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

应该建立索引的条件

  1. 在经常需要搜索的列上,可以加快搜索的速度;

  2. 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;

  3. 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;

  4. 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;外键建索引由于连接加快还会减少死锁几率。

  5. 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;

  6. 在在经常使用在 WHERE 子句中的列上面创建索引,加快条件的判断速度。

系统(设计)

1.代数优化-优化器的启发式规则

2.计数器表

3.汇总表

4.分表

5.范式与反范式。设计合理的逻辑模式

6.外键加索引

7.尽可能避免使用自定义函数。再写 SQL语句时应尽可能避免使用自定义函数,因为对于自定义函数,优化器无法做出优化,若过度滥用自定义函数将导致数据库性能下降。但是在某些必要情况下,只能使用自定义函数来实现特定查询。

查询优化器的启发式规则

1.选择运算应尽可能先做。最重要、最基本的一条。常常可以使执行代价节约几个数量级,使计算的中间结果大大变小

2.把投影运算和选择运算同时进行。如有若干投影和选择运算,并且它们都对同一个关系操作,则可以在扫描此关系的同时完成所有这些运算以避免重复扫描关系

3.把投影同其前或后的双目运算结合起来。没有必要为了去掉某些字段而扫描一遍关系

4.把某些选择同在它前面要执行的笛卡儿积结合起来成为一个连接运算。连接运算要比同样关系上的笛卡尔积省很多时间

5.找出公共子表达式

系统(应用上)

1.使用合理高效的SQL语句及方法,暗示SQL优化器进行优化

好的查询条件

关注结果集和中间数据集的大小

2.关注用户数,并发量。并据此检查自己的物理设计,系统设计

3.优化服务器配置

  1. a. B*结构应用有哪些类型?

数据库中的B,B+,B*

B* 树

规则

B*树是B+树的变种,相对于B+树他们的不同之处如下:

(1)首先是关键字个数限制问题,B+树初始化的关键字初始化个数是cei(m/2),b树的初始化个数为(cei(2/3m))

(2)分裂规则不同。B+树节点满时就会分裂,而B*树节点满时会检查兄弟节点是否满(因为每个节点都有指向兄弟的指针),如果兄弟节点未满则向兄弟节点转移关键字,如果兄弟节点已满,则从当前节点和兄弟节点各拿出1/3的数据创建一个新的节点出来;

特点

在B+树的基础上因其初始化的容量变大,使得节点空间使用率更高,而又存有兄弟节点的指针,可以向兄弟节点转移关键字的特性使得B*树额分解次数变得更少;

B/B+树: 用在磁盘文件组织,数据索引和数据库索引。

B树索引的结构:由根指向子节点,B树将索引按顺序存储,在叶节点保存索引到字段及其对应数据在表中的位置指针。从根节点开始搜索,通过节点中的指针进入下一级节点,通过比较要查找的索引值和节点中的指针大小选择进入哪个子节点,最终要么找到对应叶节点,要么没找到。叶节点中有指向表中数据的指针。

何时使用:

a、仅需要索引访问表中很少一部分行时,索引提供以原子粒度访问数据的功能,可以快速定位所查找数据的位置;

b、虽然查询行数比较多,当索引包含多个字段,而要访问的字段全部包含在索引中时,查找只需通过索引而不用访问全表时。

b. 当要通过索引访问表中很少一部分行,如果要处理表中多行,可以使用索引而不使用表,谈谈对以上两点的理解。

a、仅需要索引访问表中很少一部分行时,索引提供以原子粒度访问数据的功能,可以快速定位所查找数据的位置;

b、虽然查询行数比较多,当索引包含多个字段,而要访问的字段全部包含在索引中时,查找只需通过索引而不用访问全表时。

c.对上述结构常见的优化有哪些?

6.2 索引组织表 IOT

  1. IOT (index organized table )索引组织表,oracle 提供数据存储存储方式

当索引中增加额外的字段(一个或多个,它们本身与实际搜索条件无关,但包含查询所需的数据),能提高某个频繁运行的查询的速度。

IOT 存储在索引结构中的表,所有字段纳入索引,不存在主键的空间开销,允许在主键索引中存储所有数据,这个表本身就是索引

  1. 存取方式/ 访问方式

数据的存放是严格规定的, 记录的存放是排序的,查询效率非常高。数据插入以前其实就已经确定了其位置,所以不管插入的先后顺序,它在那个物理上的哪个位置与插入的先后顺序无关。这样在进行查询的时候就可以少访问很多 blocks,但是插入的时候,速度就比普通的表要慢一些。

  1. 优点

记录排序,查询效率惊人(最大的优点)

提高缓冲区缓存效率,因为给定查询在缓存中需要的 block 更少。

减少缓冲区缓存访问,提高可扩展性(每个缓冲区缓存获取都需要缓冲区缓存的多个闩 shuan,而闩是串行化设备,会限制应用的扩展能力)。

获取数据的工作总量更少,因为获取数据更快。

每个查询完成的物理 I/O 更少。

节约磁盘空间的占用,主键没有空间开销,索引就是数据

  1. 缺点

插入效率也许低于堆文件;

对于经常更新的表不适合用 IOT,因为维护索引的开销较大,何况是多字段索引

  1. 适用情况

全索引表:完全由主键组成的表。这样的表如果采用堆组织表,则表本身完全是多余的开销,因为所有的数据全部同样也保存在索引里,此时,堆表是没用的。

代码查找表。如果你只会通过一个主键来访问一个表,这个表就非常适合实现为 IOT.

如果你想保证数据存储在某个位置上,或者希望数据以某种特定的顺序物理存储,IOT 就是一种合适的结构 。

高频度的一组关联数据查询:经常在一个主键或唯一键上使用 between 查询

  1. a.反范式打破范式的模式有哪些?

反范式是通过增加冗余数据或数据分组来提高数据库读性能的过程。在某些情况下,反范式有助于掩盖关系型数据库软件的低效。

b.描述树状结构的存储,并分析它们的查询效率。

树状关系模式

7.2.1 邻接模型

  1. 邻接模型:id,parent_id(指向上级)

自顶向下查询,假设兄弟节点无序,主要用于单父节点。Connect by 相当容易实现

  1. 特性:

a) 插入、移动、删除节点快捷

b) 只支持单父节点,不支持多父节点

c) Connect by 容易实现

d) 递归实现,用 oracle 的 with,表示出树的层次

e) 删除子树较难

f) 三种模型中性能最高,每秒返回的查询记录数最多,遍历一次,不是基于关系的处理,性能最好

7.2.2 物化路径

  1. 物化模型:PathID(1,1.1,1.2,1.1.1,1.2.1,…),使用层次式的路径明确地标识出来,一般用字符串存路径。每一个节点都存储在树中的位置信息,它允许节点之间有顺序(因为路径的标识有顺序),比如家族族谱

  2. 特性:

a) 查询编写不困难,找出适当的记录并缩排显示算容易

b) 计算由路径导出的层次不方便。

c) 查询复杂度主要在路径字符串的处理

d) 树的的深度要自己写函数计算,可以计算“.”的数目或者去掉“.”后字符串的长度

e) 子节点有顺序,但不应该暗示任何兄弟节点的排序

f) 会产生重复记录的问题

g) 物化路径 path 不应该是 KEY,即使他们有唯一性

h) 所选择的编码方式不需要完全中立

i) 三种模型中性能中等

7.2.3 嵌套集合模型

  1. 嵌套集合模型:每一个节点都有一个左编号,都有一个右编号,left_num,right_num,某节点后代的 left_num 和 right_num 都会在该节点的 left_num 和 right_num 范围内

  2. 特性

a) 易理解,查找某一个节点的子节点很容易,但是对结果集排序不好操作,缩排无法处理

b) 适合深度优先遍历

c) 动态计算深度困难,不要显示人造根节点,为了缩排显示要硬编码最大深度,缩排处理会降低查询性能

d) 数据元素之间不再是点和线的关系,而是以容纳和被容纳的方式

e) 计算量大,对存储程序要求高。它是基于指针的解决方案。

f) 数据更新,删除,插入开销很大,较少使用

g) 三种模型中,查询的性能最低

  1. 简述数据库的发展历史及其原因。

Chapter1-绪论

数据管理技术的产生和发展

人工管理阶段

背景:计算机用于科学计算,硬件没有磁盘;软件没有操作系统,没有专门管理数据的软件;数据处理方式是批处理

特点:

数据不保存

应用程序管理数据:应用程序需要规定数据的逻辑结构,设计物理结构

数据不共享:一组数据只对应一个程序

数据不具有独立性:数据逻辑结构或物理结构改变,应用程序必须改变

文件系统

背景:硬件已经有了磁盘;软件,操作系统中有了专门的数据管理软件(文件系统);处理方式有了联机实时处理

特点:

数据可以长期保存

文件系统管理数据

缺点

共享性差,冗余度大:文件仍然是面向应用的。数据必须重复存储,容易不一致

独立性差

数据库系统

背景:文件系统的管理手段不能满足应用要求

应用范围越来越广

数据量增长

特点

数据结构化:数据库系统与文件系统的本质区别。

“整体”结构化:数据库中的数据不再仅仅针对某一个应用,而是面向整个组织或企业;不仅数据内部是结构化的,整体是结构化的,数据之间是有联系的

数据的共享性高、冗余度低且易扩充:避免数据之间的不相容性与不一致性

数据独立性高:

物理独立性:用户不关心数据在数据库中怎样存储

逻辑独立性:数据的逻辑结构改变,用户程序可以不变

数据由DBMS统一管理和控制

安全性:保护数据以防止不合法使用造成的数据泄露和破坏

完整性:数据的正确性、有效性和相容性

并发控制

数据库恢复

数据库概念

名词及概念简答

1.关系数据库(Relational DataBase)中的关系(Relational)的具体含义是什么?
2.对表的外键构建索引的做法非常普遍,已被认为是常识,这样做会避免出现哪些问题?

在主从表设计中,常常使用外键在这两个表之间建立关联。当从主表中删除一行数据时,数据库便会检查从表中是否有相同外键的行存在。如果从表没有包含外键列的索引,数据库需要扫描整个从表。可以想象:从表越大,删除的时间越长。更新主表时的情况也是一样。

因为主表有唯一聚集或非聚集的索引,所以在从表中插入或修改时,能利用主表的索引快速定位。
参考

3.什么是分区(Partition)?根据分区键(Partition Key)的类型分类,分区有哪几种类型?

参考

4.数据库的第一范式、第二范式、第三范式各是什么含义?还有哪些范式,请描述其含义?

第一范式:数据库表中的列不可再分
第二范式:满足第一的条件下,某个字段由主键的所有列决定,而不是一部分列
第三范式:满足第二,且每一列数据都和主键直接相关,而不能间接相关
参考

5.什么是索引?很多数据库使用B树索引,这种索引的结构是怎样的?能适合怎样的查询?

数据库索引是一种数据结构。通过增加额外的写操作和存储空间来维护数据库索引,可以提高从数据库中读取数据的速度。通过索引,不需要搜索数据库的每一条记录,就可以快速地定位到特定的数据。索引可以建在在表中某一个字段或多个字段之上。总而言之:数据库索引是一种数据结构
参考

论述题

1.集中式数据库和分布式数据库,谁的效率更高?它们各有怎样的特征和应用场景?适合的不同应用有哪些?
2.对树状结构的数据构建关系模型,有哪些方式,请举例说明?
3.请描述锁机制和多种锁类型(至少三种),并举例说明以及描述其应用场景?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值