一、数据结构
线性存储和链式存储优缺点比较
1.1. 线性表的存储结构,优缺点
顺序存储结构可以直接存取数据元素,方便灵活、效率高,但插入、删除操作时将会引起元素的大量移动,因而降低效率。
链接存储结构中内存采用动态分配,利用率高,但需增设指示结点之间关系的指针域,存取数据元素不如顺序存储方便,但结点的插入、删除操作较简单。
1.2. 数据结构的存储结构(3个)和对应的存储模式(1对1 1对多 多对多)
线性表:1对1
图:1对多
树:多对多
最小生成树两种算法优缺点比较
1.普里姆(Prim)算法
特点:时间复杂度为O(n2).适合于求边稠密的最小生成树。
2.克鲁斯卡尔(Kruskal)算法
特点:时间复杂度为O(eloge)(e为网中边数),适合于求稀疏的网的最小生成树。
hash函数的特点以及如何处理冲突
3.1. 散列表的建立方法
1、直接定址法
关键码本身和地址之间存在某个线性函数关系时,散列函数取为关键码的线性函数,即:H(key)=a*key+b,a、b均为常数。
2、数字分析法
假设关键码完全已知,且每个关键码都是以某个数r为基数(例以10为基数的十进制数)的值,则关键码中若干位恰能构成分布比较均匀的散列地址空间时,可取关键码的若干位的组合作为散列地址。
3、除留余数法
通过选择适当的正整数p,按计算公式H(K)=Kmodp来计算关键码K的散列地址。
若关键码个数为n,散列表表长为m(一般m>=n),通常选p为小于或等于表长m的最大素数或不包含小于20的质因子的合数,一般也要求p>=n。
4、平方取中法
将关键码K平方,取K^2中间几位作为其散列地址H(K)的值。
假如有以下关键字序列{421,423,436},平方之后的结果为{177241,178929,190096},那么可以取{72,89,00}作为Hash地址。
5、折叠法
将关键码从低位到高位(或从高位到低位)分割成位数相等的几段,最后一段可以短些,然后将这些段构成的数值按照某种叠加方法求和。最后,在散列地址范围限制下,取求和结果的最后几位作为关键码的散列函数值。
6、随机数法
采用随机函数作为散列函数H(Key)=random(Key),其中random为随机函数。
3.2. hash适合存储什么样的数据
表示的自然数太大,或是表示的自然数不连续,或者是不是自然数
3.3. 影响hash表平均查找长度的因素
● 哈希函数
● 哈希表的大小
● 碰撞处理方法
排序算法有哪些,及其时间复杂度
4.1. 排序最优和最差相同的排序算法
归并排序、堆排序,选择排序
4.2. 最差和平均算法复杂度一样的排序算法
归并排序、堆排序,选择排序、冒泡排序、希尔排序
4.3. 最好最坏平均都一样的排序算法
归并排序、堆排序

怎么确定图是一个环
如果存在回路,则必存在一个子图,是一个环路。环路中所有顶点的度>=2。
算法:
第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一。
第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一。
如果最后还有未删除顶点,则存在环,否则没有环。
有向图是否有环的判定算法,主要有深度优先和拓扑排序方法。
拓扑排序,如果能够用拓扑排序完成对图中所有节点的排序的话,就说明这个图中没有环,而如果不能完成,则说明有环。
简述线索二叉树
● 若无左子树,则将左指针指向其前驱结点;
● 若无右子树,则将右指针指向其后继结点。
汉罗塔
Hn=Hn-1 x 2 + 1.
8.图的存储
1、邻接矩阵

2、邻接表

遍历:每个点只会被遍历一次。无需刻意从某个点开始遍历,因为树是无环连通图
1.深度优先遍历。
尽可能往深了搜,当触底时回溯,直到把所有点全部搜过一遍。
2.广度优先遍历。
从根节点开始广搜,每次搜索把所有一层的点全部搜过一遍。
10. 两个最短路径算法有什么不同,用于什么情况
Floyd算法是按顺序逐渐允许每个顶点作为中间节点,按照这个中间节点的变化去进行松弛。
Dijsktra算法是根据当前离开始节点最近为标准来确定当前扩展节点,按照这个起始节点的变化去进行松弛。
11. 拓扑排序中使用了哪些数据结构
栈
12. 简述二叉排序树
二叉树和度为二的树的区别
1、度不同
度为2的树要求每个节点最多只能有两棵子树,并且至少有一个节点有两棵子树。二叉树的要求是度不超过2,节点最多有两个叉,可以是1或者0。
2、分支不同
度为2的树有两个分支,但分支没有左右之分;一棵二叉树也有两个分支,但有左右之分,左右子树的次序不能随意颠倒。
3、次序不同
度为2的树从形式上看与二叉树很相似,但它的子树是无序的,而二叉树是有序的。即,在一般树中若某结点只有一个孩子,就无需区分其左右次序,而在二叉树中即使是一个孩子也有左右之分。
程序和软件的区别
计算机软件是计算机系统中程序和文档的总称
解释下关键路径和关键活动,什么情况下才有关键路径
简述背包问题
f[v]=max{f[v],f[v-w[i]]+v[i]}
这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-w[i]的背包中”,此时能获得的最大价值就是f [i-1][v-w[i]]再加上通过放入第i件物品获得的价值v[i]。
二、软件工程
软件生命周期
软件生命周期又称为软件生存周期或系统开发生命周期,是软件的产生直到报废的生命周期。软件生存周期包括:
(1)问题定义:弄清"用户需要计算机解决什么样的问题”,提出"系统目标和范围的说明“,提交用户审查和确认。
(2)可行性分析:把待开发系统的目标以明确的语言描述出来,并从经济、技术、法律等多个方面进行可行性分析。
(3)需求分析:弄清用户对软件系统的全部需求,编写需求规格说明书和初步的用户手册,提交评审。
(4)开发阶段:设计、实现(完成源程序的编码)、测试
(5)维护:改正性维护(由于开发测试的不彻底、不完全),适应性维护(适应环境变化),完善性维护(使用过程中提出的一些建设性意见),预防性维护(改善软件系统的可维护性和可靠性)。
瀑布模型
将软件生命周期中的各个活动规定为线性连接的模型,包括需求分析、设计、编码、测试、运行与维护,由前至后、相互衔接的固定顺序,如同瀑布流水逐级下落。

瀑布模型是以文档作为驱动、适合于软件需求很明确的软件项目的模型。
3. 模块的概念
3.1. 模块间耦合度
模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。
模块间联系越多,其耦合性越强,同时表明其独立性越差。
3.2. 区分模块的要素是什么
功能、逻辑和状态
4. 软件的设计模式

使用增量模型,第1个增量往往是核心的产品。客户对每个增量的使用和评估都作为下一个增量发布的新特征和功能,这个过程在每一个增量发布后不断重复,直到产生了最终的完善产品。增量模型强调每一个增量均发布一个可操作的产品。
增量模型的优点:1)容易理解,管理成本低;2)强调开发的阶段性早期计划及需求调查和产品测试;3)第一个可交付版本所需要的成本和时间很少;4)开发由增量表示的小系统所承担的风险不大;5)减少用户需求的变更;6)运行增量投资,即在项目开始时,可以仅对一个或两个增量投资。
增量模型的缺点:1)如果没有对用户的变更需求进行规划,那么产生的初始增量可能会造成后来增量的不稳定;2)如果需求不想早期思考的那样稳定和完整,那么一些增量就可能需要重新开发,重新发布;3)管理发生的成本、进度和配置的复杂性可能会超出组织的能力。
6. 喷泉模型
一种以用户需求为动力,以对象作为驱动的模型,适合于面向对象的开发方法。它克服了瀑布模型不支持软件重用和多项开发活动集成的局限性,喷泉模型使开发过程具有迭代性和无间隙性。


1.1. TCP/IP 有几层,为什么没有物理层

1.2. TCP和UDP有什么区别
1.3. TCP怎么实现可靠传输
带重传的肯定确认
1.4. TCP怎么解决拥塞控制
慢开始
快重传
快恢复

1.5. 怎么判断是不是拥塞了,拥塞了怎么办
发送方接受到的报文段小于自身发送的报文时,报文中途丢失了,重传计时器超时
2. UDP有哪些应用
QQ语音、QQ视频、实时语音
3. 计算机网络中有哪些流量控制,缓存满了怎么调度
滑动窗口
后退N帧
停止等待
选择重传
4. 子网掩码的作用
同一个IP地址根据不同子网掩码,会划分出不同的网络号和机器号。
子网掩码就是用来遮掩IP地址并划分网段的工具,根据遮掩的位数不同来划分不同的网段
5. 交换机、路由器和集线器的区别
交换机(Switch)意为“开关”是一种用于电(光)信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机
6. 交换机能不能用在大型网络中
7. IP地址和MAC地址的区别
1、两者地址使用不同。
IP地址是指Internet协议使用的地址,而MAC地址是Ethernet协议使用的地址。当存在一个附加层的地址寻址时,设备更易于移动和维修。

2、分配依据不同。IP地址的分配是基于网络拓朴,MAC地址的分配是基于制造商。
IP地址是可以自动分配的,MAC地址在每个网卡出场的时候就有一个全球唯一的MAC地址,所以很多的验证软件就是验证mac地址的。

3、地址能否更改不同。
IP是可以更改的,mac地址虽然也可以更改,但是一般用不上,除非要用来绕过一些验证软件的。网卡在通讯的时候通过mac地址相互识别。

4、 长度不同。
IP地址为32位,MAC地址为48位。

5、寻址协议层不同。
IP地址应用于OSI第三层,即网络层,而MAC地址应用在OSI第二层,即数据链路层。

7.1. 网络层的设备有哪些
路由器,三层交换机,防火墙
7.2 计算机网络中各层和网络中的地址对应关系
7.3. IP地址的组成,有几位
网络地址
主机地址
8. OSI模型有几层
8.1·传输层的作用
8.2. 传输层有什么协议
8.3 各层作用
8.4. OSI模型和五层协议和TCP/IP模型
8.5. 五层上有什么协议
9. 内部网关协议有哪些,各有什么特点
9.1 距离-向量路由算法(RIP)
在距离-向量路由算法中,所有结点都定期地将它们的整个路由选择表传送给所有与之直接相邻的结点。这种路由选择表包含:1.每条路径的目的地(另一结点)。2.路径的代价(也称距离)。在这种算法中,所有结点都必须参与距离向量交换,以保证路由的有效性和一致性,也就是说,所有的结点都监听从其他结点传来的路由选择更新信息,并在下列情况下更新它们的路由选择表:
路由表有哪些字段
10.1. 路由表表项
目的地址:用来标识IP包的目的地址或者目的网络。
mask:网络掩码,与目的地址一起标识目的主机或者路由器所在的网段的地址。
pre:标识路由加入IP路由表的优先级。
nexthop:下一跳IP地址,说明IP包所经过的下一个路由器。
10.2. 路由器内部有哪些协议
RIP OSPF
10.3. 你把家里的路由器看成什么设备
10.4. 路由器的作用和功能
第一,网络互连:路由器支持各种局域网和广域网接口,主要用于互连局域网和广域网,实现不同网络互相通信;
第二,数据处理:提供包括分组过滤、分组转发、优先级、复用、加密、压缩和防火墙等功能;
第三,网络管理:路由器提供包括路由器配置管理、性能管理、容错管理和流量控制等功能。
10.5. 路由的定义
计算机网络的地址
11.1. 有哪些地址
12.1. mac和IP怎么相关转换
ARP协议
ARP 工作在网络层,其工作原理如下:主机A 欲向本局域网上的某台主机B 发送IP 数据报时,先在其ARP 高速缓存中查看有无主机B 的IP 地址。如有,就可查出其对应的硬件地址,再将此硬件地址写入MAC 帧,然后通过局域网将该MAC 帧发往此硬件地址。如果没有,那么就通过使用目的MAC 地址为FF-FF-FF-FF-FF-FF 的帧来封装并广播ARP 请求分组,使同一个局域网里的所有主机收到ARP 请求。主机B 收到该ARP 请求后,向主机A 发出响应ARP 分组,分组中包含主机B 的IP与MAC 地址的映射关系,主机A 在收到后将此映射写入ARP 缓存,然后按查询到的硬件地址发送MAC 帧。ARP 由于“看到了"IP 地址,所以它工作在网络层,而NAT路由器由于“看到了“端口,所以它工作在传输层。
13.1. MAC地址是什么地址,为什么要有MAC地址
通俗一点来说就是有了IP地址,就只通过路由器找到目的主机,屏蔽了下层网络的异构型,由MAC地址完成下层的实际转发。
路由算法
12.1. OSPF和RIP
计算机网络的拓扑结构

计算机网络按照覆盖范围可以划分成什么
1、局域网。局域网是一种在小区域内使用的,由多台计算机组成的网络,覆盖范围通常局限在10 千米范围之内,属于一个单位或部门组建的小范围网。
2、城域网。城域网是作用范围在广域网与局域网之间的网络,其网络覆盖范围通常可以延伸到整个城市,借助通信光纤将多个局域网联通公用城市网络形成大型网络,使得不仅局域网内的资源可以共享,局域网之间的资源也可以共享。
3、广域网。广城网是一种远程网,涉及长距离的通信,覆盖范围可以是个国家或多个国家,甚至整个世界。由于广域网地理上的距离可以超过几千千米,所以信息衰减非常严重,这种网络一般要租用专线,通过接口信息处理协议和线路连接起来,构成网状结构,解决寻径问题。
你认为计算机网络的定义是什么
网关是什么
“网关又称为协议转换器。网关的功能是实现网络之间的相互连接。网关不仅可以让广域网之间相互连接,也可以让局域网之间相互连接。网关在计算机和设备之间起转换的作用,相当于一个翻译器,可以使不同的协议、语言、数据在不同的系统之间进行转换
数据链路层的三个基本问题和解决办法
封装成帧:
数据链路层的发送方应当让接收方的数据链路层知道,所发送的帧是从什么地方开始到什么地方结束。
封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,然后就构成了一个帧。
透明传输:
数据链路层传送的比特组合必须是不受限制的。
发送端的数据链路层在数据中出现控制字符”SOH”和”EOT”的前面插入一个转义字符”ESC”
差错检验:
数据链路层必须有差错检测功能。
使用循环冗余检验CRC的检测技术
传输层端口号和http、ftp、web的端口号
http:80
ftp:20(传输数据), 21(控制)
dns:53
已经有交换机了,还需要CSMA/CD协议吗
不需要
IPv4的地址是不够用的,怎么处理这个问题
ipv6
四、计算机组成原理
中断有几种
1.1. 中断的过程,描述一下中断

1.2. 断点的概念
断点是CPU中断响应的一个返回点(或状态点)
1.3. 中断的类型
1.4. 中断向量表
1.5. 中断向量
中断向量:每个中断源都有对应的处理程序,这个处理程序称为中断服务程序,其入口地址称为中断向量。
所有中断的中断服务程序入口地址构成一个表,称为中断向量表;
2. b/s和c/s的区别
3. 五种CPU与外设交换方式

5.1. cache是什么,为很么要采用cache,原理是什么


5.2. 分别解释下两个局部性
(1)程序直接控制方式:就是由用户进程直接控制内存或CPU和外围设备之间的信息传送。这种方式控制者都是用户进程。
(2)中断控制方式:被用来控制外围设备和内存与CPU之间的数据传送。这种方式要求CPU与设备(或控制器)之间有相应的中断请求线,而且在设备控制器的控制状态寄存器的相应的中断允许位。
(3)DMA方式:又称直接存取方式。其基本思想是在外围设备和内存之间开辟直接的数据交换通道。
(4)通道方式:与DMA方式相类似,也是一种以内存为中心,实现设备和内存直接交换数据控制方式。
6.1 DMA方式与通道方式的主要区别
①与DMA控制方式相加,通道控制方式所需的CPU干预更少,并且一个通道可以控制多台设备,进一步减轻了CPU的负担。
②对通道来说,可以使用一些指令来灵活改变通道程序,这一点DMA控制方式却无法做到。
③DMA方式需要CPU来控制传输数据块的大小、传输的内存位置,而通道方式中这些信息是由通道控制的。
7. 并行通信和串行通信
1、发送数据数量不同
串行通信用一根线在不同的时刻发送8位数据;并行通信在同一时刻发送多位数据。
2、优点不同
串行通信优点是传输距离远、占用资源少,并行通信优点是发送速度快。
3、缺点不同
串行通信缺点是发送速度慢,并行通信缺点是传输距离短、资源占用多。
8. 什么是RISC和CISC,他们的区别和特点

CPU和外设的通信方式,其中输入输出处理机的方式和其作用再哪些地方,
并行接口和串行接口
五、操作系统
什么是内组件、什么是外组件
内组件:
外组件
简述处理机管理、文件管理
处理机管理(进程控制、进程同步、进程通信、死锁处理、处理机调度)
存储器管理(提高内存利用率,内存的分配与回收、地址映射、内存保护与共享、内存扩充)
文件管理(计算机中的信息都是以文件的形式存在的)
设备管理(完成用户的I/O请求,方便用户使用设备、并提高设备的利用率)
介绍一下实时操作系统和分时操作系统
分时(Time Sharing)操作系统的工作方式是:一台主机连接了若干个终端,每个终端有一个用户在使用;
实时操作系统(RealTimeOperatingSystem,RTOS)是指使计算机能及时响应外部事件的请求,在规定的严格时间内完成对该事件的处理,并控制所有实时设备和实时任务协调一致地工作。
说一下并行和串行
1、数据传送方式不同:串行口传输方式为数据排成一行、一位一位送出接收也一样,并行口传输8位数据一次送出.
2、针脚不同:串行口针脚少、并行口针脚多.
3、用途不同:串行口现在只用作控制接口、并行口多用作打印机、扫描仪等接口。
六、编译原理
编译的过程分为哪些阶段,其中哪些阶段是必不可少的
词法分析、语法分析、语义分析与中间代码产生、优化和目标代码生成。
C的编译过程
● 预处理(Preprocessing)
● 编译(Compilation)
● 汇编(Assembly)
● 链接(Linking)
七、数据库
ER图转换原则

数据库并发机制
在线程并发处理中, Synchronized内置锁 就是悲观锁的一种,也称之为 独占锁,加了synchronized关键字的代码基本上就只能以单线程的形式去执行了,它会导致其他需要该资源的线程挂起,直到前面的线程执行完毕释放所资源;而 乐观锁是一种更高效的机制,它的原理就是每次不加锁去执行某项操作,如果发生冲突则失败并重试,直到成功为止,其实本质上不算锁,所以很多地方也称之为自旋。
乐观锁的理念是:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性;而悲观锁的理念是假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。针对于不同的业务场景,应该选用不同的并发控制方式。所以,不要把乐观并发控制和悲观并发控制狭义的理解为DBMS中的概念,更不要把他们和数据中提供的锁机制(行锁、表锁、排他锁、共享锁)混为一谈。需要指出的是,在DBMS中,悲观锁正是利用数据库本身提供的锁机制来实现的。
建立数据的流程
数据库范式
1NF
作为一个二维表,关系要符合一个最基本的区间,每个分量必须是不可分的数据项,即具有原子性。
1NF强调的是列的原子性,即列的属性不可再拆分。比如下表包含「姓名」、「性别」、「电话」字段。
但是在实际应用场景中,「电话」是可以被拆分为「家庭电话」以及「工作电话」的。所以我们说,「电话」这一列不符合原子性原则,也就是说这个表不符合1NF。
正确的做法应该是将「电话」拆分为「家庭电话」和「工作电话」。
(总结:就是一个表中的属性,不能拆分成多个就说这个表符合第一范式)。
2NF
在第一范式的基础上,没有非主属性对于码的部分函数依赖。即每个非主属性完全依赖于任何一个候选码。
举例学生成绩表(学号,姓名,科目,成绩,所属院系,系主任)
此表中由于成绩是由科目和学号共同确定的,只有当学号确定,科目确定,才能知道成绩。
所以这个表的码就是(学号,科目)这两个组成的。然后就是说主属性是学号和科目,非主属性是姓名,成绩,所属院系,系主任。
因为姓名可以不需要科目只由学号单独就能确定出来,所以说非主属性(姓名)部分函数依赖于码(学号,科目)。所以此表不符合第二范式,要想他符合2NF必须将此表分成两个表:学生表(学号,姓名,所属院系,系主任),成绩表(学号,科目,成绩)。
3NF
不存在非主属性对码的部分函数依赖和传递函数依赖。
举例学生表(学号,姓名,所属院系,系主任)
在这个表中,主属性是学号,由学号可以确定其他的属性,
但是由以下情况 学号–>所属院系,所属院系–>系主任,学号–>系主任
学号可以确定所属院系,所属院系可以确定系主任,学号又可以确定系主任
具有传递关系,即存在非主属性(系主任)对码(学号)的传递函数依赖,所以不符合第三范式。
要想符合3NF就拆分表:学生表(学号,姓名,所属院系) ,院系表(院系,系主任)。
5. 数据库完整性
1、实体完整性
实体完整性是对关系中的记录唯一性,也就是主键的约束。准确地说,实体完整性是指关系中的主属性值不能为Null且不能有相同值。定义表中的所有行能唯一的标识,一般用主键,唯一索引 unique关键字,及identity属性比如说我们的身份证号码,可以唯一标识一个人。
2、域完整性
域完整性是对数据表中字段属性的约束,通常指数据的有效性,它包括字段的值域、字段的类型及字段的有效规则等约束,它是由确定关系结构时所定义的字段的属性决定的。限制数据类型,缺省值,规则,约束,是否可以为空,域完整性可以确保不会输入无效的值。
3、参照完整性
参照完整性是对关系数据库中建立关联关系的数据表间数据参照引用的约束,也就是对外键的约束。准确地说,参照完整性是指关系中的外键必须是另一个关系的主键有效值,或者是NULL。参考完整性维护表间数据的有效性,完整性,通常通过建立外部键联系另一表的主键实现,还可以用触发器来维护参考完整性
6. 数据库的索引
6.1 概念
数据库索引好比是一本书前面的目录,能加快数据库的查询速度。索引是对数据库表中一个或多个列的值进行排序的结构。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息
常见的查询算法:顺序查找、二分查找、二叉排序树查找、哈希散列法、分块查找、平衡多路搜索树B树(B-tree)
索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现
6.2 优缺点
优点:
1.大大加快数据的检索速度;
2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点:
1.索引需要占用数据表以外的物理存储空间
2.创建索引和维护索引要花费一定的时间
3.当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。
6.3 索引的类型
唯一索引: UNIQUE 例如:create unique index stusno on student(sno);
表明此索引的每一个索引值只对应唯一的数据记录,对于单列唯一性索引,这保证单列不包含重复的值。对于多列唯一性索引,保证多个值的组合不重复。
主键索引: primary key
数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。
聚集索引(也叫聚簇索引):cluster
在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。 如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。
6.4 索引的实现方式
1.B+Tree 索引
MyISAM和InnoDB存储引擎的默认创建的是B+tree索引,Memory存储引擎也可以为B+tree索引(或者Hash索引)InnoDB 的 B+Tree 索引分为主索引和辅助索引。
主索引的叶子节点 data 域记录着完整的数据记录,这种索引方式被称为聚簇索引。因为无法把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。
辅助索引 的叶子节点的 data 域记录着主键的值,因此在使用辅助索引进行查找时,需要先查找到主键值,然后再到主索引中进行查找
哈希索引
哈希索引能以 O(1) 时间进行查找,但是失去了有序性:无法用于排序与分组;只支持精确查找,无法用于部分查找和范围查找。
InnoDB 存储引擎有一个特殊的功能叫“自适应哈希索引”,当某个索引值被使用的非常频繁时,会在 B+Tree 索引之上再创建一个哈希索引,这样就让 B+Tree 索引具有哈希索引的一些优点,比如快速的哈希查找
全文索引
MyISAM 存储引擎支持全文索引,用于查找文本中的关键词,而不是直接比较是否相等。查找条件使用 MATCH AGAINST,而不是普通的 WHERE。
全文索引使用倒排索引实现,它记录着关键词到其所在文档的映射。InnoDB 存储引擎在 MySQL 5.6.4 版本中也开始支持全文索引
空间数据索引
MyISAM 存储引擎支持空间数据索引(R-Tree),可以用于地理数据存储。空间数据索引会从所有维度来索引数据,可以有效地使用任意维度来进行组合查询。
数据库的视图

数据库delete和drop的作用
数据库触发器
● 可在写入数据表前,强制检验或转换数据。
● 触发器发生错误时,异动的结果会被撤销。
● 部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。
● 可依照特定的情况,替换异动的指令 (INSTEAD OF)。
数据库的三级模式和两级映像

数据库死锁
活锁
活锁:如果事务T1封锁了数据R,事务T2又请求封锁数据R,于是T2等待;T3也请求封锁数据R,当T1释放了R上的锁之后,系统首先批准了T3的请求,T2任然等待;然后T4又请求封锁R,当T3释放R上的锁之后,系统又批准了T4的请求……T2有可能永远等待,这就是活锁的情况。
解决办法
避免活锁的简单方法是:采用先来先服务策略
死锁
死锁:如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因T2封锁了R2,于是T1等待T2释放R2上的锁;接着T2又请求封锁R1,因T1封锁了R1,于是T2等待T1释放R1上的锁。这样就出现了T1在等待T2,而T2又在等待T1,的局面,T1、T2两个事务永远不能结束,形成死锁。
解决办法
解决死锁的方法:有两种思路
预防死锁的发生
① 一次封锁法:一次性将所有要使用的数据全部加锁,否则就不能继续执行
存在的问题:扩大了封锁范围,降低了系统的并发度;
② 顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务都按照这个顺序实施封锁。
存在的问题:
1.数据库在动态地不断变化,要维护这样的资源的封锁顺序非常困难,成本很高。
2.事务的封锁请求可以随着事务的执行而动态地决定,很难实现确定每一个事务要封锁哪些对象,因此很难按规定的顺序去施加封锁。
死锁的诊断与解除(普遍采用的方法)
① 超时法:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁
存在的问题:
1.时间设置太短,有可能误判死锁
2.时间设置太长,死锁发生后不能及时发现
② 等待图法:事务等待图是一个有向图G=(T,U),T为结点的集合,每个结点表示正在运行的事务;U为边的集合,表示事务等待情况,若事务T1等待T2,则在T1、T2之间画一条有向边,从T1指向T2。
主键和外键
数据库DBA、DBMS的作用
带有数据库的计算机系统,除具备一般的硬件、软件外,必须有用以存储大量数据的直接存取存储设备、管理并控制数据库的软件——数据库管理系统(DBMS)、管理数据库的人员——数据库管理员 (DBA)。
13.1. 用户能不能对数据库进行增删改查
数据库的存储程序
一组存储和执行在数据库服务器端的程序。存储程序总是在服务器的进程或线程的内存中执行的。
存储程序分为3类,分别是:
● 存储过程:有输入和输出参数,可以执行一组sql语句。
● 存储函数:有一个返回值,可以执行一组sql语句,可以传递参数。
● 触发器:执行一组sql语句,由事件驱动自动执行,不能传递参数。
数据库的事务
15.1. sql server中事务的语句有哪些
数据库中怎么消除冗余,举个例子
数据库的ACID特性,什么是数据库一致性
(1)原子性 (Atomicity):事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。回滚可以用回滚日志来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。
(2)一致性 (Consistency):数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。
(3)隔离性 (Isolation):一个事务所做的修改在最终提交以前,对其它事务是不可见的。
(4)持久性 (Durability):一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。使用重做日志来保证持久性
数据库有哪些操作
数据库了解哪些系统
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in
给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at
Ruby中如何“一般地”计算以下格式(有根、无根)的JSON对象的数量?一般来说,我的意思是元素可能不同(例如“标题”被称为其他东西)。没有根:{[{"title":"Post1","body":"Hello!"},{"title":"Post2","body":"Goodbye!"}]}根包裹:{"posts":[{"title":"Post1","body":"Hello!"},{"title":"Post2","body":"Goodbye!"}]} 最佳答案 首先,withoutroot代码不是有效的json格式。它将没有包
目标我正在尝试计算自给定日期以来周的距离,而无需跳过任何步骤。我更喜欢用普通的Ruby来做,但ActiveSupport无疑是一个可以接受的选择。我的代码我写了以下内容,这似乎可行,但对我来说似乎还有很长的路要走。require'date'DAYS_IN_WEEK=7.0defweeks_sincedate_stringdate=Date.parsedate_stringdays=Date.today-dateweeks=days/DAYS_IN_WEEKweeks.round2endweeks_since'2015-06-15'#=>32.57ActiveSupport的#weeks
技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进
如何计算两个字符串之间的字符交集?例如(假设我们有一个名为String.intersection的方法):"abc".intersection("ab")=2"hello".intersection("hallo")=4好的,男孩女孩们,感谢你们的大量反馈。更多示例:"aaa".intersection("a")=1"foo".intersection("bar")=0"abc".intersection("bc")=2"abc".intersection("ac")=2"abba".intersection("aa")=2一些补充说明:维基百科定义intersection如下:Int