数据库数据结构面试题.docx
《数据库数据结构面试题.docx》由会员分享,可在线阅读,更多相关《数据库数据结构面试题.docx(12页珍藏版)》请在冰豆网上搜索。
数据库数据结构面试题
常见的数据库基础面试题大全
1.数据抽象:
物理抽象、概念抽象、视图级抽象,模式、模式、外模式
2.SQL语言包括数据定义、数据操纵(DataManipulation),数据控制(DataControl)
数据定义:
CreateTable,AlterTable,DropTable,Craete/DropIndex等
数据操纵:
Select,insert,update,delete,
数据控制:
grant,revoke
3.SQL常用命令:
CREATETABLEStudent(
IDNUMBERPRIMARYKEY,
NAMEVARCHAR2(50)NOTNULL);//建表
CREATEVIEWview_nameAS
Select*FROMTable_name;//建视图
CreateUNIQUEINDEXindex_nameONTableName(col_name);//建索引
INSERTINTOtablename{column1,column2,…}values(exp1,exp2,…);//插入
INSERTINTOViewname{column1,column2,…}values(exp1,exp2,…);//插入视图实际影响表
UPDATEtablenameSETname=’zang3’condition;//更新数据
DELETEFROMTablenameWHEREcondition;//删除
GRANT(Select,delete,…)ON(对象)TOUSER_NAME[WITHGRANTOPTION];//授权
REVOKE(权限表)ON(对象)FROMUSER_NAME[WITHREVOKEOPTION]//撤权
列出工作人员及其领导的名字:
SelectE.NAME,S.NAMEFROMEMPLOYEEES
WHEREE.SUPERName=S.Name
4.视图:
5.完整性约束:
实体完整性、参照完整性、用户定义完整性
6.第三式:
1NF:
每个属性是不可分的。
2NF:
若关系R是1NF,且每个非主属性都完全函数依赖于R的键。
例SLC(SID#,CourceID#,SNAME,Grade),则不是2NF;3NF:
若R是2NF,且它的任何非键属性都不传递依赖于任何候选键。
7.ER(实体/联系)模型
8.索引作用
9.事务:
是一系列的数据库操作,是数据库应用的基本逻辑单位。
事务性质:
原子性、
原子性。
即不可分割性,事务要么全部被执行,要么就全部不被执行。
一致性或可串性。
事务的执行使得数据库从一种正确状态转换成另一种正确状态
隔离性。
在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,
持久性。
事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。
10.锁:
共享锁、互斥锁
两段锁协议:
阶段1:
加锁阶段阶段2:
解锁阶段
11.死锁及处理:
事务循环等待数据锁,则会死锁。
死锁处理:
预防死锁协议,死锁恢复机制
12.存储过程:
存储过程就是编译好了的一些sql语句。
1.存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快。
2.可保证数据的安全性和完整性。
通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。
通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
3.可以降低网络的通信量。
存储过程主要是在服务器上运行,减少对客户机的压力。
4:
存储过程可以接受参数、输出参数、返回单个或多个结果集以及返回值。
可以向程序返回错误原因
5:
存储过程可以包含程序流、逻辑以及对数据库的查询。
同时可以实体封装和隐藏了数据逻辑。
13.触发器:
当满足触发器条件,则系统自动执行触发器的触发体。
触发时间:
有before,after.触发事件:
有insert,update,delete三种。
触发类型:
有行触发、语句触发
14.联接,外联接区别?
连接是保证两个表中所有的行都要满足连接条件,而外连接则不然。
在外连接中,某些不满条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行。
分左连接、右连接、全连接三种
² 简要叙述一下SQLServer2000中使用的一些数据库对象
表格、视图、用户定义的函数,存储过程,触发器等。
² NULL是什么意思
NULL这个值表示UNKNOWN(未知):
它不表示“”(空字符串)。
假设您的SQLServer数据库里有ANSI_NULLS,当然在默认情况下会有,对NULL这个值的任何比较都会生产一个NULL值。
您不能把任何值与一个 UNKNOWN值进行比较,并在逻辑上希望获得一个答案。
您必须使用ISNULL操作符。
使用ISNULL(var,value)来进行NULL判断:
当var为NULL的时候,var=value,并且返回value
² 什么是索引?
SQLServer2000里有什么类型的索引?
索引是一个数据结构,用来快速访问数据库表格或者视图里的数据。
在SQLServer里,它们有两种形式:
聚集索引和非聚集索引。
聚集索引在索引的叶级保存数据。
这意味着不论聚集索引里有表格的哪个(或哪些)字段,这些字段都会按顺序被保存在表格,物理顺序和逻辑顺序一致。
由于存在这种排序,所以每个表格只会有一个聚集索引。
非聚集索引在索引的叶级有一个行标识符。
它允许每个表格有多个非聚集索引。
² 什么是主键?
什么是外键?
主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。
外键是一个用来建立两个表格之间关系的约束。
这种关系一般都涉及一个表格里的主键字段与另外一个表(可能是同一表)里的字段。
那么这些相连的字段就是外键。
² 什么是触发器?
SQLServer2000有什么不同类型的触发器?
有INSTEAD-OF和AFTER两种触发器。
触发器是一种专用类型的存储过程,它被捆绑到表格或者视图上。
INSTEAD-OF触发器是替代数据操控语言(DML)语句对表格执行语句的存储过程。
例如,如果我有一个用于TableA的INSTEAD-OF-UPDATE触发器,同时对这个表格执行一个更新语句,那么INSTEAD-OF-UPDATE触发器里的代码会执行,而不是我执行的更新语句则不会执行操作。
AFTER触发器要在DML语句在数据库里使用之后才执行。
这些类型的触发器对于监视发生在数据库表格里的数据变化十分好用。
² 您如何确一个带有名为Fld1字段的TableB表格里只具有Fld1字段里的那些值,而这些值同时在名为TableA的表格的Fld1字段里?
第一个答案(而且是您希望听到的答案)是使用外键限制。
外键限制用来维护引用的完整性integrity。
它被用来确保表格里的字段只保存有已经在不同的(或者相同的)表格里的另一个字段里定义了的值。
这个字段就是候选键(通常是另外一个表格的主键)。
另外一种答案是触发器。
触发器可以被用来保证以另外一种方式实现与限制相同的作用,但是它非常难设置与维护,而且性能一般都很糟糕。
由于这个原因,微软建议开发人员使用外键限制而不是触发器来维护引用的完整性。
² 对一个投入使用的在线事务处理表格(OLTP)有过多索引需要有什么样的性能考虑?
对一个表格的索引越多,数据库引擎用来更新、插入或者删除数据所需要的时间就越多,因为在数据操控发生的时候索引也必须要维护。
² 你可以用什么来确保表格里的字段只接受特定围里的值?
Check限制,它在数据库表格里被定义,用来限制输入该列的值。
触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,这可能会在某些情况下影响到性能。
² 返回参数总是由存储过程返回,它用来表示存储过程是成功还是失败。
返回参数总是INT数据类型。
OUTPUT参数明确要求由开发人员来指定,它可以返回其他类型的数据,例如字符型和数值型的值。
(可以用作输出参数的数据类型是有一些限制的。
)您可以在一个存储过程里使用多个OUTPUT参数,而您只能够使用一个返回参数。
² 什么是相关子查询?
如何使用这些查询?
相关子查询是一种包含子查询的特殊类型的查询。
查询里包含的子查询会真正请求外部查询的值,从而形成一个类似于循环的状况。
11. 某一列允许NULL值,但希望确保所有的非空(Non-NULL)值都是唯一的
SQLServer没有实现非NULL值唯一性的建机制,因此需要通过自定义的trigger:
算法题目
概述
有过面试经历的企业(BAT、小米、宜信、猿题库、FreeWheel等)当中,还没有谁问过我需要复杂算法(比方说此中的很多知识点)才能解决的问题。
我遇到的算法题目大致可以分为两类:
∙经典算法实现题快速排序、归并排序、堆排序、KMP算法等都是重点,重要的是代码的正确性,其次是复杂度分析,当然,人家也不都是直接问你怎么实现这个具体算法,而是包装到情境里;
∙思维益智题考察你分析问题的能力,大部分可以归结到二分、动态规划、递归上,重要的是思路,其次是尽量低的复杂度,再次是代码的正确性。
第一章数据结构与算法
一.算法的基本概念
计算机解题的过程实际上是在实施某种算法,这种算法称为计算机算法。
1.算法的基本特征:
可行性,确定性,有穷性,拥有足够的情报。
2.算法的基本要素:
算法中对数据的运算和操作、算法的控制结构。
3.算法设计的基本方法:
列举法、归纳法、递推、递归、减半递推技术、回溯法。
4.算法设计的要求:
正确性、可读性、健壮性、效率与低存储量需求
二.算法的复杂度
1.算法的时间复杂度:
指执行算法所需要的计算工作量
2.算法的空间复杂度:
执行这个算法所需要的存空间
三.数据结构的定义
1.数据的逻辑结构:
反映数据元素之间的关系的数据元素集合的表示。
数据的逻辑结构包括集合、线形结构、树形结构和图形结构四种。
2.数据的存储结构:
数据的逻辑结构在计算机存储空间种的存放形式称为数据的存储结构。
常用的存储结构有顺序、、索引等存储结构。
四.数据结构的图形表示:
在数据结构中,没有前件的结点称为根结点;没有后件的结点成为终端结点。
插入和删除是对数据结构的两种基本运算。
还有查找、分类、合并、分解、复制和修改等。
五.线性结构和非线性结构
根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为两大类型:
线性结构和非线性结构。
线性结构:
非空数据结构满足:
有且只有一个根结点;每个结点最多有一个前件,最多只有一个后件。
非线性结构:
如果一个数据结构不是线性结构,称之为非线性结构。
常见的线性结构:
线性表、栈、队列
六.线性表的定义
线性表是n个元素构成的有限序列(A1,A2,A3……)。
表中的每一个数据元素,除了第一个以外,有且只有一个前件。
除了最后一个以外有且只有一个后件。
即线性表是一个空表,或可以表示为(a1,a2,……an),其中ai(I=1,2,……n)是属于数据对象的元素,通常也称其为线性表中的一个结点。
非空线性表有如下一些特征:
(1)有且只有一个根结点a1,它无前件;
(2)有且只有一个终端结点an,它无后件;
(3)除根结点与终端结点外,其他所有结点有且只有一个前件,也有且只有一个后件。
线性表中结点的个数n称为线性表的长度。
当n=0时称为空表。
七.线性表的顺序存储结构
线性表的顺序表指的是用一组地址连续的存储单元依次存储线性表的数据元素。
线性表的顺序存储结构具备如下两个基本特征:
1.线性表中的所有元素所占的存储空间是连续的;
2.线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。
即线性表逻辑上相邻、物理也相邻,则已知第一个元素首地址和每个元素所占字节数,则可求出任一个元素首地址。
假设线性表的每个元素需占用K个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储位置。
则线性表中第i+1个数据元素的存储位置LOC(ai+1)和第i个数据元素的存储位置LOC(ai)之间满足下列关系:
LOC(ai+1)=LOC(ai)+K
LOC(ai)=LOC(a1)+(i-1)*K ①
其中,LOC(a1)是线性表的第一个数据元素a1的存储位置,通常称做线性表的起始位置或基地址。
因为在顺序存储结构中,每个数据元素地址可以通过公式①计算得到,所以线性表的顺序存储结构是随机存取的存储结构。
在线性表的顺序存储结构下,可以对线性表做以下运算:
插入、删除、查找、排序、分解、合并、复制、逆转
八.顺序表的插入运算
线性表的插入运算是指在表的第I个位置上,插入一个新结点x,使长度为n的线性表(a1,a2…ai…an)变成长度为n+1的线性表(a1,a2…x,ai…an).
该算法的时间主要花费在循环的结点后移语句上,执行次数是n-I+1。
当I=n+1,最好情况,时间复杂度o
(1)当I=1,最坏情况,时间复杂度o(n)
算法的平均时间复杂度为o(n)
九.顺序表的删除运算
线性表的删除运算是指在表的第I个位置上,删除一个新结点x,使长度为n的线性表(a1,a2…ai…an)变成长度为n-1的线性表(a1,a2…ai-1,ai+1…an).
当I=n,时间复杂度o
(1),当I=1,时间复杂度o(n),平均时间复杂度为o(n)
十.栈及其基本运算
1.什么是栈?
栈实际上也是一个线性表,只不过是一种特殊的线性表。
栈是只能在表的一端进行插入和删除运算的线性表,通常称插入、删除这一端为栈顶(TOP),另一端为栈底(BOTTOM)。
当表中没有元素时称为空栈。
栈顶元素总是后被插入的元素,从而也是最先被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。
假设栈S=(a1,a2,a3,……an),则a1称为栈底元素,an称为栈顶元素。
栈中元素按a1,a2,a3……an的次序进栈,退栈的第一个元素应该是栈顶元素。
即后进先出。
2.栈的顺序存储及其运算
用S(1:
M)作为栈的顺序存储空间。
M为栈的最大容量。
栈的基本运算有三种:
入栈、退栈与读栈顶元素。
入栈运算:
在栈顶位置插入一个新元素。
首先将栈顶指针进一(TOP+1),然后将新元素插入到栈顶指针指向的位置。
退栈运算:
指取出栈顶元素并赋给一个指定的变量。
首先将栈顶元素赋给一个指定的变量,然后将栈顶指针退一(TOP-1)
读栈顶元素:
将栈顶元素赋给一个指定的变量。
栈顶指针不会改变。
十一.队列及其基本运算
1.什么是队列
队列是只允许在一端删除,在另一端插入的顺序表,允许删除的一端叫做对头,允许插入的一端叫做对尾。
队列的修改是先进先出。
往队尾插入一个元素成为入队运算。
从对头删除一个元素称为退队运算。
2.循环队列及其运算
在实际应用中,队列的顺序存储结构一般采用循环队列的形式。
所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间。
在循环队列中,,用队尾指针rear指向队列中的队尾元素,用排头指针front指向排头元素的前一个位置,因此,从排头指针front指向的后一个位置直到队尾指针rear指向的位置之间所有的元素均为队列中的元素。
在实际使用循环队列时,为了能区分队满还是队列空,通常需要增加一个标志S:
队列空,则S=0,rear=front=m 队列满,则S=1,rear=front=m
循环队列主要有两种基本运算:
入队运算和退队运算
n 入队运算
指在循环队列的队尾加入一个新元素,首先rear=rear+1,当rear=m+1时,置rear=1,然后将新元素插入到队尾指针指向的位置。
当S=1,rear=front,说明队列已满,不能进行入队运算,称为“上溢”。
n 退队运算
指在循环队列的排头位置退出一个元素并赋给指定的变量。
首先front=front+1,并当front=m+1时,置front=1,然后将排头指针指向的元素赋给指定的变量。
当循环队列为空S=0,不能进行退队运算,这种情况成为“下溢”。
十二.线性单链表的结构及其基本运算
1.线性单链表的基本概念
一组任意的存储单元存储线性表的数据元素,因此,为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。
这两部分信息组成数据元素ai的存储映象,成为结点。
它包括两个域:
其中存储数据元素信息的域称为数据域,存储直接后继存储位置的域称为指针域。
指针域中存储的信息称做指针或链。
N个结点链结成一个链表,即为线性表(a1,a2,……,an)的链式存储结构。
又由于此链表的每个结点中只包含一个指针域,故又称线性链表或单链表。
有时,我们在单链表的第一个结点之前附设一个结点,称之为头结点,它指向表中第一个结点。
头结点的数据域可以不存储任何信息,也可存储如线性表的长度等类的附加信息,头结点的指针域存储指向第一个结点的指针(即第一个元素结点的存储位置)。
在单链表中,取得第I个数据元素必须从头指针出发寻找,因此,单链表是非随机存取的存储结构 链表的形式:
单向,双向
2.线性单链表的存储结构
3带链
3.带列的栈与队列
栈也是线性表,也可以采用链式存储结构。
队列也是线性表,也可以采用链式存储结构。
十三.线性链表的基本运算1.线性链表的插入2.线性链表的删除
十四.双向链表的结构及其基本运算
在双向链表的结点中有两个指针域,其一指向直接后继,另一指向直接前驱。
十五.循环链表的结构及其基本运算
是另一种形式的链式存储结构,它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。
因此,从表中任一结点出发均可找到表中其他结点。
十六.树的定义
树是一种简单的非线性结构。
树型结构的特点:
1.每个结点只有一个前件,称为父结点,没有前件的结点只有一个,称为树的根结点。
2.每一个结点可以有多个后件结点,称为该结点的子结点。
没有后件的结点称为叶子结点
3.一个结点所拥有的后件个数称为树的结点度
4.树的最大层次称为树的深度。
十七.二叉树的定义及其基本性质
1.二叉树是另一种树型结构,它的特点是每个结点至多只有二棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。
2.二叉树的基本性质
①在二叉树的第I层上至多有2i-1个结点。
②深度为k的二叉树至多有2k-1个结点(k>=1)
③在任意一个二叉树中,度为0的结点总是比度为2的结点多一个;
④具有n个结点的二叉树,其深度至少为[log2n]+1。
一棵深度为k且有2k-1个结点的二叉树称为满二叉树。
这种树的特点是每一层上的结点数都是最大结点数。
3.满二叉树与完全二叉树
满二叉树:
除最后一层以外,每一层上的所有结点都有两个子结点。
在满二叉树的第K层上有2K-1个结点,且深度为M的满二叉树右2M-1个结点
完全二叉树:
除最后一层以外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。
具有N个结点的完全二叉树的深度为[log2n]+1
完全二叉树总结点数为N,
若N为奇数,则叶子结点数为(N+1)/2若N为偶数,则叶子结点数为N/2
4.二叉树的存储结构
二叉树通常采用链式存储结构
二叉树具有下列重要特性:
性质1在二叉树的第i层上至多有2i-1个结点(i≥1)。
利用归纳法容易证得此性质。
i=1时,只有一个根结点。
显然,2i-1=20=1是对的。
现在假定对所有的j,1≤j
那么,可以证明j=i时命题也成立。
由归纳假设:
第i-1层上至多有2i-2个结点。
由于二叉树的每个结点的度至多为2,故在第i层上的最大结点数为第i-1层上的最大结点数的2倍,即2*2i-2=2i-1。
性质2深度为k的二叉树至多有2k-1个结点,(k≥1)。
由性质1可见,深度为k的二叉树的最大结点数为
k k
∑(第i层上的最大结点数)=∑2i-1=2k-1
i=1 i=1
性质3对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。
设n1为二叉树T中度为1的结点数。
因为二叉树中所有结点的度均小于或等于2所以其结点总数为
n=n0+n1+n2(6—1)
再看二叉树中的分支数。
除了根结点外,其余结点都有一个分支进入,设B为分支总数,则n=B+1。
由于这些分支是由度为1或2的结点射出的,所以又有B=n1+2n2。
n=n1+2*n2+1(6—2)
于是得由式(6—1)和(6—2)得n0=n2+1
十八.二叉树的遍历
就是遵从某种次序,访问二叉树中的所有结点,使得每个结点仅被访问一次。
一般先左后右。
1.前序遍历DLR首先访问根结点,然后遍历左子树,最后遍历右子树。
2.中序遍历LDR首先遍历左子树,然后根结点,最后右子树
3.后序遍历LRD首先遍历左子树,然后遍历右子树,最后访问根结点。
十九.顺序查找与二分查找
1.顺序查找在两种情况下只能用顺序查找:
线性表为无序表、链式存储结构的有序表
2.二分查找只适用于顺序存储的有序表(从小到大)。
对于长度为N的有序线性表,在最坏情况下,二分查找只需要比较log2N次,而顺序查找要比较N次。
排序:
指将一个无序序列整理成按值非递减顺序排列的有序序列。
二十.交换类排序法
冒泡排序与快速排序法属于交换类的排序方法
1.冒泡排序法假设线性表的长度为N,则在最坏的情况下,冒跑排序需要经过N/2遍的从前往后的扫描和N/2遍的从后往前的扫描,需要的比较次数为N(N-1)/2
2.快速排序法
二十一.选择类排序法1.简单选择排序法2.堆排序法
二十三.插入类排序法1.简单插入排序法2.希尔排序法
最坏情况下 最好情况下 说明
交换排序 冒泡排序 n(n-1)/2 最简单的交换排序。
在待排序的元素序列基本有序的前提下,效率最高
快速排序 n(n-1)/2 O(Nlog2N)
插入排序 简单插入排序 n(n-1)/2 每个元素距其最终位置不远时适用
希尔排序 O(n1.5)
选择排序 简单选择排序 n(n-1)/2
堆排序 O(nlog2n) 适用于较大规模的线性表