精华内容
下载资源
问答
  • 2019考研复试面试问题:你的最大缺点是什么
    2021-05-21 17:41:37

    2019考研复试面试问题:你的最大缺点是什么

    (2018-12-31 17:24:42)

    标签:

    19考研

    考研复试

    2019考研复试面试问题:你的最大缺点是什么怎么答

    考官如果问最大缺点一般会问:What is your greatest weakness/shortcoming?

    在回答这类问题时,同学们不要太过紧张,重点是快速定位到底自己想要向考官表达自己什么缺点。

    有的同学非常机智,会这样告诉考官:我有很多缺点,但是我最大的缺点就是太过追求完美。这样的回答看似在说自己的缺点,但是实则在夸自己。显得不太真实。

    还有一类同学非常诚实,会告诉考官:我最大的缺点就是比较懒、抗压能力弱、性格内向等。但是同学们这类缺点考官听了之后,会觉得这位考生不太适合做自己的学生,因为研究生期间会有很多的科研项目,会写很多论文,如果抗压能力弱的话,就不太适合考研。

    所以同学们在选择自己的缺点时,应该选择一些无关紧要的缺点,不会让考官觉得面前的这位同学无药可救,不适合做科研。

    比如,我们可以说"不会拒绝别人"或是"当自己工作忙的时候,容易忘记一些事情"等诸如此类。定位好了之后,那应该如何回答考官的问题呢。

    首先同学们开门见山,先告诉考官自己的最大缺点,即:position。

    然后再举一个例子说明自己的这个缺点,即:example。之后同学们要注意,因为说的是缺点,所以同学们还应向考官说明自己已经在采取措施改正这类缺点了,这样考官也会觉得考生是一个有错能改的人,即要写:ways

    to correct。

    最后总结上文的陈述就可以了,即最后是:conclusion。

    刚才提到的是思路,到底应该如何用英文表达呢,这里结合一个范文来看一下具体的英文表达。

    As a matter of fact, everyone possesses some weaknesses. Well, I

    think my weakness is that I am easy to forget things, especially

    when I am busy with study or job.(定位)

    A case in point is my friends and I usually make appointments to

    get together on a certain day. But when it comes, I often forget it

    completely and am concentrating on other things. Then they will

    call me and say: "hey, where are you? Are you coming soon?" Every

    time it is always a big surprise to me and I will be punished

    through a variety of ways by them. (举例)

    To get out of this habit, I have attempted to write down a

    reminder on my notebook whenever I have arrangements, and take the

    notebook all the time and check it often. (改正缺点)

    So as a result, gradually I begin to kick this habit and now it

    is getting better. But I am still working on this way since it is a

    good method, I think.(总结)

    这就是同学们如何回答最大缺点的小诀窍啦。各位小伙伴可以按照总结的思路,借鉴上面的一些语言,针对自己的情况提前准备。祝同学们复试顺利。

    分享:

    a4c26d1e5885305701be709a3d33442f.png喜欢

    0

    a4c26d1e5885305701be709a3d33442f.png赠金笔

    加载中,请稍候......

    评论加载中,请稍候...

    发评论

    登录名: 密码: 找回密码 注册记住登录状态

    昵   称:

    评论并转载此博文

    a4c26d1e5885305701be709a3d33442f.png

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

    更多相关内容
  • C++语言程序设计思维导图考研复试面试
  • c语言考研复试 面试常见问题集合
  • 在复习过程中,我用心查阅并整理了在**考研复试面试**中可能问到的大部分问题,并**分点整理**了答案,可以**直接理解背诵并加上自己的语言润色**!极力推荐打印下来看,效率更高!绝对良心之作!
  • 北京理工大学计算机考研复试面试 软件工程专业 数据库 离散数学 编译原理 操作系统
  • 数学专业 考研复试 面试真题汇总(2)
  • 在复习过程中,我用心查阅并整理了在**考研复试面试**中可能问到的大部分问题,并**分点整理**了答案,可以**直接理解背诵并加上自己的语言润色**!极力推荐打印下来看,效率更高!
  • 在复习过程中,我用心查阅并整理了在**考研复试面试**中可能问到的大部分问题,并**分点整理**了答案,可以**直接理解背诵并加上自己的语言润色**!极力推荐打印下来看,效率更高!绝对良心之作!
  • 北京理工大学自动化学院历年考研复试面试题目115道,含自动控制,微机原理,电子技术,计算机控制等面试题目115道,另有微机原理复试笔试题目,英语口语面试题目等。
  • 计算机考研复试笔记
  • 本文件适合准备考研的朋友,希望能够帮助到大家,设置的免费下载,也希望大家能够抓住机会及时上岸。谢谢谢谢嘻嘻嘻嘻嘻嘻
  • 机械设计考研复试面试题 机械设计简答题 机械设计复试题 机械设计面试题
  • 中国科学技术大学计算机专业软件工程考研复试面试题,
  • 数据结构复试面试大纲,参考wd系列教材整理了在考研复试面试中可能问到的大部分问题,并分点整理了答案,可以直接理解背诵并加上自己的语言润色!极力推荐打印下来看,效率更高
  • 1、计算机考研复试面试常问问题 计算机网络 2、计算机考研复试面试常问问题 计算机组成原理 3、计算机考研复试面试常问问题 数据结构 4、计算机考研复试面试常问问题 操作系统 5、计算机考研复试面试常问问题 软件...
  • 哈尔滨工业大学计算机考研复试面试编译原理操作系统软件工程
  • 适合考研面试复试适用,操作系统问题总结
  • 一些学习资料和总结 包括编程语言 操作系统 计算机网络 计算机组成原理 软件工程 数据结构 数据库 专业英语 一些论文摘要 问到的问题总结
  • C++考研复试面试

    千次阅读 2022-03-27 10:27:03
    C++考研复试面试题总结 第一章 面向对象程序设计概述 1.什么是结构化程序设计方法?有哪些优点和缺点? 2.什么面向对象程序设计方法?有哪些优点? 3.面向对象与面向过程程序设计有哪些不同点? 4.面向对象程序设计...

    C++考研复试面试题总结

    第一章 面向对象程序设计概述

    1.什么是结构化程序设计方法?有哪些优点和缺点?

    结构化(即面向过程)程序设计方法是指20世纪60年代开始出现的高级语言程序设计方法,由于采用了数据结构化、语句结构化、数据抽象和过程抽象等概念,使程序设计在符合客观事物与逻辑的基础上更进了一步。

    结构化程序设计的思路是:自顶向下、逐步求精。程序结构由具有一定功能的若干独立的基本模块(单元)组成,各模块之间形成一个树状结构,模块之间的关系比较简单,其功能相对独立,模块化通过子程序的方式实现。结构化程序设计方法使高级语言程序设计开始变得普及,并促进了计算机技术的深入应用。

    优点:结构化程序设计方法采用了自顶向下、逐步求精、模块分解、分而治之的方法,能有效地将各种复杂的任务分解为一系列相对容易实现的子任务,有利于软件开发和维护;

    缺点:程序的数据和对数据的操作相互分离,若数据结构改变,程序的大部分甚至所有相关的处理过程都要进行修改。因此,对于开发大型程序具有一定的难度,软件的可重用性差,维护工作量大,不完全符合人类认识世界的客观规律。

    2.什么面向对象程序设计方法?有哪些优点?

    面向对象程序设计方法采用与客观世界相一致的方法设计软件,其设计方法是模拟人类习惯的思维方式,使软件开发的方法与过程尽可能接近人类认识世界、解决问题的方法与过程,从而使描述问题的问题空间(即问题域)与实现解法的解空间(即求解域)在结构上尽可能一致。是一种运用对象、类、封装、继承、多态和消息等概念来构造、测试、重构软件的方法。

    优点:面向对象程序设计方法使得开发的软件产品易重用、易修改、易测试、易维护、易扩充,降低了软件开发的复杂度。达到了软件工程的3个主要目标:重用性、灵活性和扩展性。适合大型的、复杂的软件开发。

    3.面向对象与面向过程程序设计有哪些不同点?

    面向过程就是分析出解决问题需要的步骤,然后用函数把这些步骤一个个实现,使用的时候依次调用,面向过程的核心是过程
    面向对象就是把构成问题的事物分解成一个个对象,建立对象不是为了实现一个步骤,而是为了描述某个事物在解决问题中的行为,面向对象的核心是对象

    在程序结构上,面向过程的程序主要由顺序结构、选择结构和循环结构组成,程序的基本单位是函数,程序的执行顺序也是确定的。
    而面向对象程序由类的定义和类的使用两部分组成,程序的基本单位是类,在主程序内定义对象,并确定对象之间消息的传递规律,程序中的所有操作都是通过向对象发送消息来实现的,对象接到消息后,通过消息处理函数完成相应的操作。

    4.面向对象程序设计有哪些重要特征?

    面向对象程序设计的基本特征主要有:抽象性、封装性、继承性和多态性。

    抽象性:抽象是面向对象程序设计的基本要素。抽象就是从众多事物中抽取出共同的、本质的特征,形成类。
    在面向对象程序设计中,抽象包含两个方面:数据抽象和过程抽象。数据抽象是针对对象的属性,实现数据封装,在类外不可能被访问;过程抽象是针对对象的行为特征,实现信息隐藏。

    封装性:封装是面向对象程序设计方法的一个重要特征,它是将对象的属性和行为结合成一个独立的单位并尽可能隐蔽对象的内部细节
    封装有两个含义
    一是把对象的全部属性和行为结合在一起,形成一个不可分割的独立单位。对象的属性值(除了公有的属性值)只能由这个对象的行为来读取和修改;
    二是尽可能隐蔽对象的内部细节,对外形成一道屏障,与外部的联系只能通过外部接口实现。

    继承性:继承是面向对象程序设计方法的一个重要特征,是实现软件复用的一个重要手段。继承反映的是对象之间的相互关系,它允许一个新类从现有类派生而出新类能够继承现有类的属性和行为,并且能够修改或增加新的属性和行为,成为一个功能更强大、更满足应用需求的类。
    在软件开发过程中,继承性实现了软件模块的可重用性、独立性,缩短了开发周期,提高了软件开发的效率,同时使软件易于维护和修改。

    多态性:多态是面向对象程序设计的另一个重要的特征,对象根据所接收的消息而做出动作。“一个接口,多种形态”,即同一消息为不同的对象接收时可产生完全不同的行为,这种现象称为多态性。

    5.什么是面向对象方法的封装性?它有何特点?

    封装性指将对象的属性和行为代码封装在对象的内部,形成一个独立的单位,并尽可能隐蔽对象的内部细节。

    封装性是面向对象方法的一个重要原则,C++面向对象方法的封装特性包含以下两层含义:
    第一层含义是将对象的全部属性和行为封装在对象内部,形成一个不可分割的独立单位。对象的属性值(公有属性值除外)只能由这个对象的行为来读取和修改。
    第二层含义是“信息隐蔽”,即尽可能隐蔽对象的内部细节,对外形成一道屏障,只保留有限的对外接口与外部发生联系。

    面向对象方法的封装性具有以下特点
    (1)封装性使对象以外的事物不能随意获取对象的内部属性,有效地避免了外部错误对它产生的影响,大大减轻了软件开发过程中查错的工作量,减小了排错的难度。
    (2)封装性使得当程序需要修改对象内部的数据时,减少了因为内部修改对外部的影响。
    (3)封装性使对象的使用者与设计者可以分开,使用者不必知道对象行为实现的细节,而只使用设计者提供的外部接口即可。
    (4)封装性事实上隐蔽了程序设计的复杂性,提高了代码重用性,降低了软件开发的难度。
    (5)面向对象程序设计方法的信息隐蔽作用体现了自然界中事物的相对独立性,程序设计者与使用者只需关心其对外提供的接口,而不必过分注意其内部细节,即主要关注能做什么,如何提供这些服务等。

    6.面向对象程序设计为什么要应用继承机制?

    在面向对象程序设计中,根据既有类(父类)派生出新类(子类)的现象称为类的继承机制,亦称为继承性。

    面向对象方法的继承性是联结类与类的一种层次模型。继承是面向对象程序设计能够提高软件开发效率的重要原因之一。继承意味着派生类中无须重新定义在父类中已经定义的属性和行为,而是自动地、隐含地拥有其父类的全部属性与行为。继承机制允许和鼓励类的重用,派生类既具有自己新定义的属性和行为,又具有继承下来的属性和行为。当派生类又被它更下层的子类继承时,它继承的及自身定义的属性和行为又被下一级子类继承下去。继承是可以传递的,符合自然界中特殊与一般的关系。

    继承性具有重要的实际意义,它简化了人们对事物的认识和描述。比如我们认识了飞行器的特征之后,再考虑飞机、飞船和弹道时,由于它们都具有飞行器的共性,于是可以认为它理所当然地具有飞行器的一般本质特征,从而只需把精力用于发现和描述飞机、飞船和导弹独有的特征。

    面向对象程序设计中的继承性是对客观世界的直接反映。通过类的继承,能够实现对问题的深入抽象描述,反映人类认识问题的发展过程。

    7.什么是面向对象程序设计中的多态性?

    指父类中定义的属性或行为,被派生类继承之后,可以具有不同的数据类型或表现出不同的行为特性。
    如类中的同名函数可以对应多个具有相似功能的不同函数,可使用相同的调用方式来调用这些具有不同功能的同名函数。 “一个接口,多种形态”,即同一消息为不同的对象接收时可产生完全不同的行为

    多态性使得同一个属性或行为(如函数)在父类及其各派生类中具有不同的语义。

    8.什么是面向对象中的消息?一条消息由哪几部分组成?

    消息是面向对象程序设计用来描述对象之间通信的机制。

    通常一条消息由接受消息的对象、消息名称和若干消息参数三部分组成。

    9.为什么说C++是混合型面向对象程序设计语言?

    C++保留了C语言的全部优点,兼容C语言的语法,弥补了C语言的缺陷,且C程序不经修改可以直接在C++环境中使用。同时,C++还增加了面向对象的方法与机制,全面支持面向对象程序设计方法。
    因此C++既可以用于结化程序设计,又可以用于面向对象程序设计,是一种混合型面向对象程序设计语言。

    第二章 C++基础

    1.什么是命名空间,如何访问命名空间的成员?

    为了解决不同文件中同名变量的问题,C++标准中引入命名空间的概念。
    命名空间(namespace)是一种特殊的作用域,命名空间可以由程序员自己来创建,可以将不同的标识符集合在一个命名作用域内,这些标识符可以类、对象、函数、变量、结构体、模板以及其他命名空间等。

    在作用域范围内使用命名空间就可以访问命名空间定义的标识符。有3种访问方法:
    (1)直接指定标识符,访问方式为:命名空间标识符名∷成员名 。
    (2)使用using namespace命令
    (3)使用using关键词声明

    2.什么是内联函数?它有什么特点?哪些函数可以定义为内联函数?哪些函数不可以定义为内联函数?

    inline关键字声明或定义的函数称为内联函数。

    内联函数(inline function)的定义和普通函数相同,但C++对它们的处理方式不一样。
    在编译时,C++将用内联函数程序代码替换对它每次的调用。这样,内联函数没有函数调用的开销,即节省参数传递、控制转移的开销,从而提高了程序运行时的效率。但是,由于每次调用内联函数时,需要将这个内联函数的所有代码复制到调用函数中,所以会增加程序的代码量,占用更多的存储空间,增大了系统空间方面的开销。因此,内联函数是一种空间换时间的方案。

    C++中对于功能简单、规模小、使用频繁的函数,可以将其设置为内联函数。
    函数体内有循环语句和switch语句,递归调用的函数不能定义为内联函数。

    3.什么是函数重载?在函数调用时,C++是如何匹配重载函数的?

    函数重载是指两个或两个以上的函数具有相同的函数名,但参数类型不一致或参数个数不同。编译时编译器将根据实参和形参的类型及个数进行相应地匹配,自动确定调用哪一个函数。使得重载的函数虽然函数名相同,但功能却不完全相同。

    在函数调用时,C++是匹配重载函数规则如下:
    首先,寻找一个精确匹配,如果能找到,调用该函数;
    其次,进行提升匹配,通过自动类型转换寻求一个匹配,如果能找到,调用该函数;
    最后,通过强制类型转换寻求一个匹配,如果能找到,调用该函数。

    4.设置函数参数的默认值有何作用?

    在调用具有默认参数的函数时,如果没有提供实际参数,C++将自动把默认参数作为相应参数的值。

    5.什么叫引用?使用引用时需要注意哪些问题?

    引用是一个变量的别名
    使用引用时,必须在定义时进行初始化,不能在定义完后再赋值。

    6.new运算符的作用是什么?delete运算符的作用是什么?

    在C++程序中,new是动态分配内存的运算符,自动计算需要分配的空间。delete是撤销动态申请的内存运算符。
    delete与new通常配对使用,建立堆对象时使用new运算符、删除堆对象时delete使用运算符。

    第三章 类和对象

    1.在类的定义中,包含几类成员?分别是什么?

    在类的定义中,包含两类成员。
    一类是代表对象属性的数据成员,另一类是实现对象行为的成员函数

    2.C++中类成员的访问控制权限有哪几种?各有何特点?

    C++对类的成员提供了public、protected和private三种不同的访问权限。

    public声明成员为公有成员。具有这个访问控制权限的成员是完全公开的,即该成员不但可以被它所在类的成员函数及该类的友元函数访问,也可以被和该类对象处在同一作用域内的任何函数访问。

    protected声明成员为保护成员。具有这个访问控制权限的成员,外界是无法直接访问的。它只能被它所在类及从该类派生的子类的成员函数及友元函数访问。

    private声明成员为私有成员。具有这个访问控制权限的成员对类外是完全保密的,即只能被它所在类中的成员函数和该类的友元函数访问。

    3.什么是构造函数和析构函数?其作用各是什么?对构造函数和析构函数有哪些要求?

    构造函数和析构函数是两种特殊的成员函数
    构造函数用来完成在声明对象的同时,对对象中的数据成员进行初始化。
    析构函数用来完成当对象的生命期结束(删除对象)时,自动被执行,进行一些必要的清理工作。

    对构造函数的要求包括:
    (1)名称必须有类名相同;
    (2)没有返回值类型,也不能指定为void;
    (3)构造函数可以有任意个任意类型的参数;
    (4)如果没有显式的定义构造函数,系统会自动生成一个默认的构造函数。这个构造函数不含有参数,也不对数据成员进行初始化,只负责为对象分配存储空间;
    (5)如果显式的为类定义了构造函数,系统将不再为类提供默认构造函数;
    (6)定义对象时,系统会自动调用构造函数;
    (7)构造函数可以重载;
    (8)构造函数一般被定义为公有访问权限。

    对析造函数的要求包括:
    (1)函数名由“~”加类名组成;
    (2)函数没有参数、没有返回值,而且不能重载;
    (3)一个类有且仅有一个析构函数,且应为public;
    (4)在对象的生命期结束前,由系统自动调用析构函数。

    4.在C++中,函数的参数传递有几方式?分别是什么?

    C++语言中,函数的参数传递方式有3种,分别是值传递、指针传递和引用传递

    5.什么是this指针?它有什么作用?

    this指针是一个隐含于每一个成员函数中的特殊指针。

    指向正在操作该成员函数的对象,当一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数。每次成员函数存取数据成员时,C++编译器将根据this指针所指向的对象来确定应该引用哪一个对象的数据成员。

    6.什么是拷贝构造函数?什么情况下调用此函数?

    拷贝构造函数是一种特殊的构造函数,它具有一般构造函数的所有特性,但其形参是本类对象的引用。
    其作用是使用一个已经存在的对象(由拷贝函数的参数指定)去初始化同类的一个新对象。

    调用拷贝构造函数的情况有3种:
    (1)明确表示由一个对象初始化另一个对象;
    (2)当对象作为函数实参传递给函数形参时;
    (3)当对象作为函数的返回值,创建一个临时对象。

    7.什么是组合类?创建和删除组合类时,构造函数和析构函的调用顺序是什么?

    组合类是指一个类内嵌其他类的对象作为本类的成员。两者之间是包含与被包含的关系。

    在创建一个组合类的对象时,不仅它自身的构造函数将被调用,而且其内嵌对象的构造函数也将被调用。
    这时构造函数调用的顺序为:先祖先(基类),再客人(内嵌对象),后自己(派生类本身)
    析构函数的调用顺序与构造函数刚好相反

    第四章 类与对象的其他特性

    1.静态数据成员是一种什么样的数据成员类型?

    静态数据成员是一种特殊的数据成员类型,它是类的所有对象共享的数据成员,而不只是某个对象的数据成员。使用静态数据成员的好处在于不但实现了数据共享,而且可以节省所使用的内存空间

    2.如何对静态数据成员进行初始化?

    静态数据成员不能在类的构造函数中初始化,也不可在类的体内进行赋初值,它的初始化工作只能在类外进行,并且在对象生成之前进行

    3.类的友元有哪几种?

    类的友元有三种:
    1)该类外部的普通函数;
    2)另一个类中的成员函数;
    3)另一个类。

    4.对象有哪几种生存期?

    对象可分为局部对象、全局对象、静态对象和动态对象四种生存期

    5.常量对象的特点是什么?

    常量对象的特点是它的数据成员的值在对象的整个生存期内都不能被修改。

    第五章 继承与派生

    1.什么是继承性?

    所谓继承就是在一个已存在的类的基础上建立一个新类,实质就是利用已有的数据类型定义出新的数据类型。

    2.C++的继承分为哪两类?

    单继承和多继承。

    3.试说明什么是虚基类,其有何用处。

    共同基类设置为虚基类,这样从不同的途径继承过来的同名成员只有一个副本,这样就不会再会引起二义性。

    4.什么是同名覆盖?

    如果在派生类中声明了与基类成员相同的新成员,派生类的新成员将覆盖基类的同名成员。此时,如果在派生类或派生类对象中直接调用该成员名就只能访问到派生类中声明的同名成员,这被称为同名覆盖。

    5.类的继承有几种方式?试比较各种继承方式派生类对基类成员的继承。

    在C++程序设计中,提供了3种继承方式:公有继承(public)、私有继承(private)和保护继承(protected)。
    访问属性与继承的关系

    6.什么是赋值兼容规则?

    所谓赋值兼容规则就是在公有继承方式下,对于某些场合,一个派生类的对象可以作为基类的对象来使用。

    7.什么是子类型?

    子类型的概念涉及到行为的共享,它与继承和派生有着紧密的联系。
    所谓子类型,是指当一个类型至少包含了另一个类型的所有行为,则称该类型是另一个类型的子类型。

    8.多继承中,在什么情况下会出现二义性?如何消除二义性?

    情况一:派生类在访问基类成员函数时,由于基类存在同名的成员函数,导致无法确定访问的是哪个基类的成员函数,因此出现了二义性错误。(倒三角问题)
    倒三角形问题

    情况二:当一个派生类从多个基类派生时,而这些基类又有一个共同的基类,当对这个共同的基类中说明的成员进行访问时,可能出现二义性问题。(菱形问题)
    菱型问题

    解决派生类的不同基类有同名成员的二义性,有几种方法:
    (1)使用作用域标识符
    (2)使用同名覆盖的原则
    (3)虚基类。

    9.单继承中,派生类的构造函数的格式如何定义?

    在C++中,派生类构造函数的一般性声明语法如下:

    <派生类名>::<派生类名>(基类形参,内嵌对象形参,本类形参):<基类名>(参数表),<内嵌对象1>(参数表1),<内嵌对象2>(参数表2),…,<内嵌对象n>(参数表n)
    {
    	本类成员初始化赋值语句; 
    };
    

    10.多继承中,派生类的构造函数的格式如何定义?

    在多重继承的情况下,派生类的构造函数一般性声明语法如下:

    <派生类名>::<派生类名>(基类形参,内嵌对象形参,本类形参):<基类名1>(参数表),<基类名2>(参数表),…,<基类名n>(参数表),<内嵌对象1>(参数表1),<内嵌对象2>(参数表2),…,<内嵌对象n>(参数表n)
    { 	
    	本类成员初始化赋值语句; 
    };
    

    11.试说明派生类和基类之间存在什么样的关系?

    基类是派生类的父类,基类派生出派生类;

    第六章 多态性

    1. 什么叫多态性?在C++中如何实现多态性?

    多态性是面向对象程序设计的又一个重要特征,它是指不同对象接收到同一消息时会产生不同的行为。

    C++中通过函数重载、运算符重载、虚函数实现多态性。

    2.什么叫静态联编?什么叫动态联编?二者有何区别?

    如果在编译程序时就能确定具体的调用对象,称为静态联编;
    如果在编译程序时还不能确定具体的调用对象,只有在程序运行过程中才能确定具体调用对象,称为动态联编。

    3.什么叫抽象类?抽象类有何作用?抽象类的派生类是否一定要给出纯虚函数的实现?

    如果一个类中至少有一个纯虚函数,这个类就是为抽象类,通常也称为抽象基类。

    它的主要作用是为一个类族提供统一的公共接口,使它们更有效地发挥多态性的特性。

    抽象类的派生类不一定要给出纯虚函数的实现。抽象类派生出新的类之后,如果派生类给出所有纯虚函数的函数实现,这个派生类就可以声明自己的对象,因而不再是抽象类;反之,如果派生类没有给出全部纯虚函数的实现,这时的派生类仍然是一个抽象类。

    第七章 模版

    1.为什么使用模板?函数模板声明的一般形式是什么?

    模板是C++语言的一个重要特征。利用模板机制可以显著减少冗余信息,能大幅地节约程序代码,进一步提高面向对象程序的可重用性和可维护性
    模板是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了代码的重用,使得一段程序可以用于处理多种不同类型的对象,大幅度地提高程序设计的效率。

    函数模板的声明格式如下:

    template<typename 类型参数> 返回类型 函数名 (模板形参表)
    {
    	函数体
    }
    

    2.什么是模板实参?什么是模板函数?

    将函数模板中的类型参数实例化的参数称为模板实参。

    函数模板经实例化而生成的具体函数称为模板函数。

    3.什么是类模板?类模板声明的一般形式是什么?

    所谓类模板,实际上是建立一个通用类,其数据成员、成员函数的返回类型和形参类型不具体制定,用一个虚拟的类型来代表。使用类模板定义对象时,系统会根据实参的类型来取代类模板中虚拟类型从而实现了不同类的功能。

    定义一个类模板与定义函数模板的格式类似,必须以关键字template开始,后面是尖括号括起来的模板参数,然后是类名,其格式如下:

    template<typename 类型参数> class 类名
    {
    	类成员声明 
    }
    

    4.函数模板与同名的非模板函数重载时,调用的顺序是怎样的?

    函数模板与同名的非模板函数可以重载。
    在这种情况下,调用的顺序是:
    首先寻找一个参数完全匹配的非模板函数,如果找到了,就调用它。若没有找到,则寻找函数模板,将其实例化,产生一个匹配的模板函数,若找到了,就调用它。

    展开全文
  • 计算机考研复试面试常问问题 数据结构篇(上)

    万次阅读 多人点赞 2020-04-23 17:21:14
    计算机考研复试面试常问问题 数据结构篇(上) 使用前需知(拒绝白嫖,如果对你有帮助,你只需点个赞就行): 需要pdf直接打印版,可在公众号"程序员宝藏"回复复试上岸获取(会持续更新) 在复习过程中,我用心...

    计算机考研复试面试常问问题 数据结构篇(上)

    使用前需知(拒绝白嫖,如果对你有帮助,你只需点个赞就行):

    需要pdf直接打印版,可在公众号"程序员宝藏"回复复试上岸获取(会持续更新)

    在复习过程中,我用心查阅并整理了在考研复试面试中可能问到的大部分问题,并分点整理了答案,可以直接理解背诵并加上自己的语言润色!极力推荐打印下来看,效率更高!

    声明:一些边边角角的没有收集,毕竟是考研面试,不是笔试,这样也能减轻大家的负担!

    此系列一共有8篇:编程语言篇**|数据结构篇|操作系统篇|组成原理篇|计算机网络篇|数据库篇|软件工程篇|计算机专业英语篇**(还未全部完成,敬请期待,你们的支持和关注是我最大的动力!)

    个人整理,不可用于商业用途,转载请注明出处。

    需要408电子书2021版,可在公众号"程序员宝藏"回复408电子书获取

    需要408初试视频2021版,可在公众号"程序员宝藏"回复408视频获取

    需要复试机试视频,可在公众号"程序员宝藏"回复机试必过获取

    加油,大家都可以上岸!!!让我们一起努力!!!


    第一章、绪论

    快速唤起记忆知识框架:


    1 .时间复杂度

    ps:我看到一个学长回忆说老师问了他 大O 是什么意思???如果是我,估计当场蒙蔽了,毕竟平时知道做题就行,也没仔细看 大O 什么意思,所以大家还是看看这题。有备无患。
    

    一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为T(n), 它是该算法问题规模n 的函数,时间复杂度主要分析T(n) 的数量级。算法中基本运算(最深层循环内的语句)的频度与T(n) 同数量级,因此通常采用算法中基本运算的频度f(n)来分析算法的时间复杂度。因此,算法的时间复杂度记为 T(n) = O(f(n))

    取f(n) 中随n 增长最快的项,将其系数置为1 作为时间复杂度的度量。例如, f(n) = an3 + bn2 + cn 的时向复杂度为O(n3)

    上式中, O 的含义是T(n) 的数量级,其严格的数学定义是:若T(n)和f(n)是定义在正整数集合上的两个函数,则存在正常数C 和n0,使得当n >= n0时,都满足0 <=T(n) <=Cf(n) 。
    算法的时间复杂度不仅依赖于问题的规模n, 也取决于待输入数据的性质(如输入数据元素
    的初始状态)


    2.空间复杂度

    算法的空间复杂度S(n)定义为该算法所耗费的存储空间,它是问题规模n 的函数。记为
    S(n) = O(g(n))
    一个程序在执行时除需要存储空间来存放本身所用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。若输入数据所占空间只取决于问题本身,和算法无关,则只需分析除输入和程序之外的额外空间。
    算法原地工作是指算法所需的辅助空间为常量,即O(1) 。


    3.数的逻辑结构

    指的是数据元素之间逻辑关系,与数的存储结构无关,是独立于计算机的,以下是分类图。


    4.数的存储结构

    存储结构是指数据结构在计算机中的表示,也称物理结构,主要有以下4种:

    1. 顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。其优点是可以实现随机存取,每个元素占用最少的存储空间;缺点是只能使用相邻的一整块存储单元,因此可能产生较多的外部碎片。

    2. 链式存储。不要求逻辑上相邻的元素在物理位置上也相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系。其优点是不会出现碎片现象,能充分利用所有存储单元;缺点是每个元素因存储指针而占用额外的存储空间,且只能实现顺序存取。

    3. 索引存储。在存储元素信息的同时,还建立附加的索引表。索引表中的每项称为索引项,索引项的一般形式是(关键字,地址)。其优点是检索速度快;缺点是附加的索引表额外占用存储空间。另外,增加和删除数据时也要修改索引表,因而会花费较多的时间。

    4. 散列存储。根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash) 存储。其优点是检索、增加和删除结点的操作都很快;缺点是若散列函数不好,则可能出现元素存储单元的冲突,而解决冲突会增加时间和空间开销。

    5.用循环比递归的效率高吗?

    循环和递归两者是可以互换的,不能决定性的说循环的效率比递归高。

    递归的优点是:代码简洁清晰,容易检查正确性;缺点是:当递归调用的次数较多时,要增加额外的堆栈处理,有可能产生堆栈溢出的情况,对执行效率有一定的影响。

    循环的优点是:结构简单,速度快;缺点是:它并不能解决全部问题,有的问题适合于用递归来解决不适合用循环。


    6.贪心算法和动态规划以及分治法的区别?

    贪心算法顾名思义就是做出在当前看来是最好的结果,它不从整体上加以考虑,也就是局部最优解。贪心算法从上往下,从顶部一步一步最优,得到最后的结果,它不能保证全局最优解,与贪心策略的选择有关。

    动态规划是把问题分解成子问题,这些子问题可能有重复,可以记录下前面子问题的结果防止重复计算。动态规划解决子问题,前一个子问题的解对后一个子问题产生一定的影响。在求解子问题的过程中保留哪些有可能得到最优的局部解,丢弃其他局部解,直到解决最后一个问题时也就是初始问题的解。动态规划是从下到上,一步一步找到全局最优解。(各子问题重叠)

    分治法(divide-and-conquer):将原问题划分成n个规模较小而结构与原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。(各子问题独立)

    分治模式在每一层递归上都有三个步骤:

    分解(Divide):将原问题分解成一系列子问题;
    解决(conquer):递归地解各个子问题。若子问题足够小,则直接求解;
    合并(Combine):将子问题的结果合并成原问题的解。

    例如归并排序。


    第二章、线性表


    快速唤起记忆知识框架:


    7.顺序表和链表的比较

    1.存取(读写)方式
    顺序表可以顺序存取,也可以随机存取,链表只能从表头顺序存取元素。例如在第i个位置上执行存或取的操作,顺序表仅需一次访问,而链表则需从表头开始依次访问i次。

    2.逻辑结构与物理结构
    采用顺序存储时,逻辑上相邻的元素,对应的物理存储位置也相邻。而采用链式存储时,逻辑上相邻的元素,物理存储位置则不一定相邻,对应的逻辑关系是通过指针链接来表示的。

    3.查找、插入和删除操作
    对于按值查找,顺序表无序时,两者的时间复杂度均为O(n); 顺序表有序时,可采用折半查找,此时的时间复杂度为O(log2n) 。

    对于按序号查找,顺序表支持随机访问,时间复杂度仅为0(1), 而链表的平均时间复杂度为O(n) 。顺序表的插入、删除操作,平均需要移动半个表长的元素。链表的插入、删除操作,只需修改相关结点的指针域即可。由于链表的每个结点都带有指针域,故而存储密度不够大。

    4.空间分配
    顺序存储在静态存储分配情形下,一旦存储空间装满就不能扩充,若再加入新元素,则会出现内存溢出,因此需要预先分配足够大的存储空间。预先分配过大,可能会导致顺序表后部大量闲置;预先分配过小,又会造成溢出。动态存储分配虽然存储空间可以扩充,但需要移动大量元素,导致操作效率降低,而且若内存中没有更大块的连续存储空间,则会导致分配失败。链式存储的结点空间只在需要时申请分配,只要内存有空间就可以分配,操作灵活、高效。


    8.头指针和头结点的区别?

    头指针:是指向第一个节点存储位置的指针,具有标识作用,头指针是链表的必要元素,无论链表是否为空,头指针都存在。

    头结点:是放在第一个元素节点之前,便于在第一个元素节点之前进行插入和删除的操作,头结点不是链表的必须元素,可有可无,头结点的数据域也可以不存储任何信息。


    第三章、栈和队列


    快速唤起记忆知识框架:


    9.栈和队列的区别?

    队列是允许在一段进行插入另一端进行删除的线性表。队列顾名思义就像排队一样,对于进入队列的元素按“先进先出”的规则处理,在表头进行删除在表尾进行插入。由于队列要进行频繁的插入和删除,一般为了高效,选择用定长数组来存储队列元素,在对队列进行操作之前要判断队列是否为空或是否已满。如果想要动态长度也可以用链表来存储队列,这时要记住队头和对位指针的地址。

    栈是只能在表尾进行插入和删除操作的线性表。对于插入到栈的元素按“后进先出”的规则处理,插入和删除操作都在栈顶进行,与队列类似一般用定长数组存储栈元素。由于进栈和出栈都是在栈顶进行,因此要有一个size变量来记录当前栈的大小,当进栈时size不能超过数组长度,size+1,出栈时栈不为空,size-1。


    10.共享栈

    利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。这样能够更有效的利用存储空间,两个栈的空间相互调节,只有在整个存储空间被占满时才发生上溢。


    11.如何区分循环队列是队空还是队满?

    普通情况下,循环队列队空和队满的判定条件是一样的,都是Q.front == Q.rear。

    ps:队头指针指向第一个数;队尾指针指向最后一个数的下一个位置,即将要入队的位置。

    方法一:牺牲一个单元来区分队空和队满,这个时候(Q.rear+1)%MaxSize == Q.front才是队满标志 。

    方法二:类型中增设表示元素个数的数据成员。这样,队空的条件为Q.size == 0;队满的条件为Q.size == MaxSize。


    12.栈在括号匹配中的算法思想?

    括号匹配算法思想

    (1)出现的凡是“左括号”,则进栈;

    (2)出现的是“右括号”,

    首先检查栈是否空?

    若栈空,则表明该“右括号”多余

    否则和栈顶元素比较?

    若相匹配,则栈顶“左括号出栈”

    否则表明不匹配

    (3)表达式检验结束时,

    若栈空,则表明表达式中匹配正确

    否则表明“左括号”有余;


    13.栈在通过后缀表达式求值的算法思想?

    顺序扫描表达式的每一项,然后根据它的类型做如下相应操作:若该项是操作数,则将其压入栈中;若该项是操作符,则连续从栈中退出两个操作数y 和x, 形成运算指令XY, 并将计算结果重新压入栈中。当表达式的所有项都扫描并处理完后,栈顶存放的就是最后的计算结果。


    14.栈在递归中的应用?

    递归是一种重要的程序设计方法。简单地说,若在一个函数、过程或数据结构的定义中又应
    用了它自身,则这个函数、过程或数据结构称为是递归定义的,简称递归。
    它通常把一个大型的复杂问题层层转化为一个与原问题相似的规模较小的问题来求解,递归
    策略只需少量的代码就可以描述出解题过程所需要的多次重复计算,大大减少了程序的代码量。但在通常情况下,它的效率并不是太高。

    将递归算法转换为非递归算法,通常需要借助栈来实现这种转换。


    15.队列在层次遍历中的作用?

    在信息处理中有一大类问题需要逐层或逐行处理。这类问题的解决方法往往是在处理当前层
    或当前行时就对下一层或下一行做预处理,把处理顺序安排好,待当前层或当前行处理完毕,就可以处理下一层或下一行。使用队列是为了保存下一步的处理顺序。下面用二叉树层次遍历的例子,说明队列的应用。


    16.队列在计算机系统中的应用?

    队列在计算机系统中的应用非常广泛,以下仅从两个方面来简述队列在计算机系统中的作用:第一个方面是解决主机与外部设备之间速度不匹配的问题,第二个方面是解决由多用户引起
    的资源竞争问题。

    对于第一个方面,仅以主机和打印机之间速度不匹配的问题为例做简要说明。主机输出数据给打印机打印,输出数据的速度比打印数据的速度要快得多,由于速度不匹配,若直接把输出的
    数据送给打印机打印显然是不行的。解决的方法是设置一个打印数据缓冲区,主机把要打印输出的数据依次写入这个缓冲区,写满后就暂停输出,转去做其他的事情。打印机就从缓冲区中按照先进先出的原则依次取出数据并打印,打印完后再向主机发出请求。主机接到请求后再向缓冲区写入打印数据。这样做既保证了打印数据的正确,又使主机提高了效率。由此可见,打印数据缓冲区中所存储的数据就是一个队列。

    对于第二个方面, CPU (即中央处理器,它包括运算器和控制器)资源的竞争就是一个典型
    的例子。在一个带有多终端的计算机系统上,有多个用户需要CPU 各自运行自己的程序,它们分别通过各自的终端向操作系统提出占用CPU 的请求。操作系统通常按照每个请求在时间上的先后顺序,把它们排成一个队列,每次把CPU 分配给队首请求的用户使用。当相应的程序运行结束或用完规定的时间间隔后,令其出队,再把CPU 分配给新的队首请求的用户使用。这样既能满足每个用户的请求,又使CPU 能够正常运行。


    17.矩阵的压缩存储

    数据结构中,提供针对某些特殊矩阵的压缩存储结构。这里所说的特殊矩阵,主要分为以下两类:

    • 含有大量相同数据元素的矩阵,比如对称矩阵;
    • 含有大量 0 元素的矩阵,比如稀疏矩阵、上(下)三角矩阵;

    针对以上两类矩阵,数据结构的压缩存储思想是:矩阵中的相同数据元素(包括元素 0)只存储一个。


    第四章、串


    快速唤起记忆知识框架:


    18.串的模式匹配

    子串的定位操作通常称为串的模式匹配,他求的是子串(常称模式串)在主串中的位置。

    暴力模式匹配算法的思想是:从主串的第一个字符起,与子串的第一个字符比较,相等则继续比较;不等则从主串的下一个位置起,继续和子串开始比较,直到最后看是否匹配成功。

    以下的子串为:‘abcac’:

    改进的模式匹配算法-----KMP算法:

    在暴力匹配中,每趟匹配失败都是模式后移一位再从头开始比较。而某趟已匹配相等的字符
    序列是模式的某个前缀,这种频繁的重复比较相当于模式串在不断地进行自我比较,这就是其低效率的根源。因此,可以从分析模式本身的结构着手,如果已匹配相等的前缀序列中有某个后缀正好是模式的前缀,那么就可以将模式向后滑动到与这些相等字符对齐的位置,主串i指针无须回溯,并继续从该位置开始进行比较。而模式向后滑动位数的计算仅与模式本身的结构有关,与主串无关。

    (此处篇幅过长,感兴趣可以直接百度KPM算法详细了解,当然要求不高的可以直接跳过,知道大致思想即可,不要被问到一问三不知就可以)

    展开全文
  • 浙江大学考研复试面试录音.mp3(里面对考研复试有很好的指导性并还原真实的考研复试场面)
  • 计算机考研复试面试常问问题 数据库篇在复习过程中,我用心查阅并整理了在考研复试面试中可能问到的大部分问题,并分点整理了答案,可以直接理解背诵并加上自己的语言润色!极力推荐打印下来看,效率更高!绝对良心之...

    计算机考研复试面试常问问题 数据库篇

    在复习过程中,我用心查阅并整理了在考研复试面试中可能问到的大部分问题,并分点整理了答案,可以直接理解背诵并加上自己的语言润色!极力推荐打印下来看,效率更高!绝对良心之作!

    此系列一共有8篇:编程语言篇|数据结构篇|操作系统篇|组成原理篇|计算机网络篇|数据库篇|软件工程篇|计算机专业英语篇(还未全部完成,敬请期待,你们的支持和关注是我最大的动力!)

    需要pdf直接打印版,可在公众号"程序员宝藏"回复复试上岸获取(会持续更新)

    相对于408初试,复试需要的少多了,加油,大家都可以上岸!!!让我们一起努力!!!

    章节导读:

    1.事务

    概念:事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。

    ACID特性: (1)原子性 (Atomicity):事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。回滚可以用回滚日志来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。

    (2)一致性 (Consistency):数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。

    (3)隔离性 (Isolation):一个事务所做的修改在最终提交以前,对其它事务是不可见的。

    (4)持久性 (Durability):一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。

    使用重做日志来保证持久性。

    事务的 ACID 特性概念简单,但不是很好理解,主要是因为这几个特性不是一种平级关系: 只有满足一致性,事务的执行结果才是正确的。 在无并发的情况下,事务串行执行,隔离性一定能够满足。此时只要能满足原子性,就一定能满足一致性。 在并发的情况下,多个事务并行执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。事务满足持久性是为了能应对数据库崩溃的情况。

    2.并发一致性问题

    丢失数据

    丢失数据:12669795.html12669795.html 两个事务都对一个数据进行修改,12669795.html 先修改,12669795.html 随后修改,12669795.html 的修改覆盖了 12669795.html 的修改。简记为 同时修改。

    读脏数据

    读脏数据:12669795.html 对一个数据做了修改,12669795.html 读取这一个数据。若 12669795.html 执行 ROLLBACK 操作,则 12669795.html 读取的结果和第一次的结果不一样。简记为 读取失败的修改。最简单的场景是修改完成后,紧接着查询检验结果。

    不可重复读

    不可重复读:12669795.html 读取一个数据,12669795.html 对该数据做了修改。如果 12669795.html 再次读取这个数据,此时读取的结果和第一次读取的结果不同。简记为 读时修改,重复读取的结果不一样。

    幻影读

    幻影读:12669795.html 读取某个范围的数据,12669795.html 在这个范围内插入新的数据,12669795.html 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。简记为 读时插入,重复读取的结果不一样。

    解决方案

    在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题。产生并发不一致性问题的主要原因是破坏了事务的隔离性。解决方法是通过 并发控制 来保证隔离性。并发控制可以通过 封锁 来实现,但是封锁操作需要用户自己控制,相当复杂。数据库管理系统提供了事务的 隔离级别,让用户以一种更轻松的方式处理并发一致性问题。

    3.封锁

    封锁粒度 MySQL 中提供了两种封锁粒度:行级锁 以及 表级锁。

    应尽量只锁定需要修改的那部分数据,而不是所有的资源。锁定的数据量越少,发生锁争用的可能就越小,系统的并发程度就越高。但是加锁需要消耗资源,锁的各种操作 (包括获取锁、释放锁、以及检查锁状态) 都会增加系统开销。因此封锁粒度越小,系统开销就越大。为此,我们在选择封锁粒度时,需在 锁开销 和 并发程度 之间做一个 权衡。

    封锁类型

    (1)读写锁 排它锁 (Exclusive),简写为 X 锁,又称 写锁。

    共享锁 (Shared),简写为 S 锁,又称 读锁。

    有以下两个规定: 一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁。

    一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。

    (2)意向锁 使用意向锁 (Intention Locks),可以更容易地支持多粒度封锁,使得行锁和表锁能够共存。 在存在行级锁和表级锁的情况下,事务 T 想要对表 A 加 X 锁,就需要先检测是否有其它事务对表 A 或者表 A 中的任意一行加了锁,那么就需要对表 A 的每一行都检测一次,这是非常耗时的。

    意向锁在原来的 X/S 锁之上引入了 IX / IS,IX / IS 都是 表级别的锁,用来表示一个事务稍后会对表中的某个数据行上加 X 锁或 S 锁。整理可得以下两个规定:

    一个事务在获得某个数据行对象的 S 锁之前,必须先获得表的 IS 锁或者更强的锁; 一个事务在获得某个数据行对象的 X 锁之前,必须先获得表的 IX 锁。

    封锁协议

    三级封锁协议

    一级封锁协议:事务 T 要修改数据 A 时必须加 X 锁,直到 T 结束才释放锁。防止同时修改,可解决 丢失修改 问题,因不能同时有两个事务对同一个数据进行修改,那么事务的修改就不会被覆盖。

    二级封锁协议:在一级的基础上,要求读取数据 A 时必须加 S 锁,读取完马上释放 S 锁。防止修改时读取,可解决 丢失修改 和 读脏数据 问题,因为一个事务在对数据 A 进行修改,根据 1 级封锁协议,会加 X 锁,那么就不能再加 S 锁了,也就是不会读入数据。

    三级封锁协议:在二级的基础上,要求读取数据 A 时必须加 S 锁,直到事务结束了才能释放 S 锁。防止读取时修改,可解决 丢失修改 和 读脏数据 问题,还进一步防止了 不可重复读 的问题,因为读 A 时,其它事务不能对 A 加 X 锁,从而避免了在读的期间数据发生改变。

    两段锁协议 两段锁协议是指每个事务的执行可以分为两个阶段:生长阶段 (加锁阶段) 和衰退阶段 (解锁阶段)。 两段封锁法可以这样来实现:

    事务开始后就处于加锁阶段,一直到执行 ROLLBACK 和 COMMIT 之前都是加锁阶段。 ROLLBACK 和 COMMIT 使事务进入解锁阶段,即在 ROLLBACK 和 COMMIT 模块中 DBMS 释放所有封锁。

    4.关系数据库设计理论

    函数依赖

    12669795.html 表示 A 函数决定 B,也可以说 B 函数依赖于 A。

    12669795.html 是关系的一个或多个属性的集合,该集合函数决定了关系的其它所>有属性并且是 最小的,那么该集合就称为 键码。

    对于 12669795.html,如果能找到 A 的真子集 12669795.html,使得 12669795.html,那么 12669795.html 就是 部分函数>依赖,否则就是 完全函数依赖。

    对于 12669795.html12669795.html,则 12669795.html 是一个 传递函数依赖。

    异常

    如表所示,展示了学生课程关系的函数依赖为 {Sno, Cname} -> {Sname, Sdept, Mname, Grade},键码为 {Sno, Cname}。也就是说,确定学生和课程后就能确定其它信息。

    SnoSnameSdeptMnameCnameGrade

    1

    学生-1

    学院-1

    院长-1

    课程-1

    90

    2

    学生-2

    学院-2

    院长-2

    课程-2

    80

    2

    学生-2

    学院-2

    院长-2

    课程-1

    100

    3

    学生-3

    学院-2

    院长-2

    课程-2

    95

    不符合范式的关系,会产生很多异常,主要有以下四种异常:

    冗余数据:例如 学生-2 出现了两次。

    修改异常:修改了一个记录中的信息,但是另一个记录中相同的信息却没有被修改。

    删除异常:删除一个信息,那么也会丢失其它信息。例如删除了 课程-1 需要删除第一>行和第三行,那么 学生-1 的信息就会丢失。

    插入异常:例如想要插入一个学生的信息,如果这个学生还没选课,那么就无法插入。

    范式

    范式理论是为了解决以上提到四种异常。高级别范式的依赖于低级别的范式,1NF 是最低级别的范式。

    第一范式 (1NF)

    属性不可分。即数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。

    第二范式 (2NF)

    每个非主属性完全函数依赖于键码。可以通过分解来满足 2NF。

    分解前:

    SnoSnameSdeptMnameCnameGrade

    1

    学生-1

    学院-1

    院长-1

    课程-1

    90

    2

    学生-2

    学院-2

    院长-2

    课程-2

    80

    2

    学生-2

    学院-2

    院长-2

    课程-1

    100

    3

    学生-3

    学院-2

    院长-2

    课程-2

    95

    以下学生课程关系中,{Sno, Cname} 为键码,有如下函数依赖:

    Sno -> Sname, Sdept

    Sdept -> Mname

    Sno, Cname-> Grade

    函数依赖状况分析: Grade 完全函数依赖于键码,它没有任何冗余数据,每个学生的每门课都有特定的成绩。

    Sname, Sdept 和 Mname 都部分依赖于键码,当一个学生选修了多门课时,这些数据就会出现多次,造成大量冗余数据。

    分解后:

    关系-1:

    SnoSnameSdeptMname

    1

    学生-1

    学院-1

    院长-1

    2

    学生-2

    学院-2

    院长-2

    3

    学生-3

    学院-2

    院长-2

    有以下函数依赖: - Sno -> Sname, Sdept - Sdept -> Mname

    关系-2:

    SnoCnameGrade

    1

    课程-1

    90

    2

    课程-2

    80

    2

    课程-1

    100

    3

    课程-2

    95

    有以下函数依赖: Sno, Cname 12669795.html Grade

    第三范式 (3NF)

    非主属性不传递函数依赖于键码。简而言之,第三范式就是属性不依赖于其它非主属性。

    上面的 关系-1 中存在以下传递函数依赖:Sno 12669795.html Sdept 12669795.html Mname。

    分解后

    关系-1.1:

    SnoSnameSdept

    1

    学生-1

    学院-1

    2

    学生-2

    学院-2

    3

    学生-3

    学院-2

    关系-1.2:

    SdeptMname

    学院-1

    院长-1

    学院-2

    院长-2

    巴斯-科德范式(BCNF)

    Boyce-Codd Normal Form(巴斯-科德范式) 在3NF基础上,任何非主属性不能对主键子集依赖(在3NF基础上消除对主码子集的依赖) 巴斯-科德范式(BCNF)是第三范式(3NF)的一个子集,即满足巴斯-科德范式(BCNF)必须满>足第三范式(3NF)。通常情况下,巴斯-科德范式被认为没有新的设计规范加入,只是对第二范式与第三范式中设计规范要求更强,因而被认为是修正第三范式,也就是说,它事实上是对第三范式的修正,使数据库冗余度更小。这也是BCNF不被称为第四范式的原因。某些书上,根据范式要求的递增性将其称之为第四范式是不规范,也是更让人不容易理解的地方。而真正的第四范式,则是在设计规范中添加了对多值及依赖的要求。

    5.ER 图

    实体关系图 (Entity-Relationship,E-R),有三个组成部分:实体、属性、联系。用来进行关系型数据库系统的概念设计。

    实体:用矩形表示,矩形框内写明实体名.

    属性:用椭圆形表示,并用无向边将其与相应的实体连接起来。

    联系:用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体连接起来,同时在无向>边旁标上联系的类型(1...1,1...* 或 *...*)就是指存在的三种关系 (一对一、一对多或多对多)。

    ER 模型转换为关系模式的原则:

    一对一:遇到一对一关系的话,在两个实体任选一个添加另一个实体的主键即可。

    一对多:遇到一对多关系的话,在多端添加另一端的主键。

    多对多:遇到多对多关系的话,我们需要将联系转换为实体,然后在该实体上加上另外两个实体的主键,作为联系实体的主键,然后再加上该联系自身带的属性即可。

    6.索引

    索引的数据结构

    B-Tree (平衡树, Balance Tree):也称为 多路平衡查找树,并且所有叶子节点位于同一层。

    B+Tree:它不仅具有 B-Tree 的平衡性,并且可通过 顺序访问指针 来提高 区间查询 的性能。

    在 B+Tree 中,一个节点中的 key 从左到右非递减排列,若某个指针的 12669795.html 左右相邻分别是 12669795.html12669795.html,且不为 null,则该指针指向节点的所有 key 满足 12669795.html

    B+Tree 与 B-Tree 最大区别是,B+Tree 的非叶子结点不保存数据,只用于索引,所有数据都保存在叶子结点中。而且叶子结点间按照从小到大顺序链接起来。

    B-Tree/B+Tree 的增删改查:

    查找操作:首先在根节点进行 二分查找,找到一个 key 所在的指针,然后递归地在指针所指向的节点进行查找。直到查找到叶子节点,然后在 叶子节点 上进行 二分查找,找出 key 所对应的 data。

    二分查找要求表有序,正好 B-Tree 和 B+Tree 结点中的 key 从左到右非递减有序排列。

    增删操作:会破坏平衡树的平衡性,因此在插入删除操作之后,需要对树进行一个分裂、合并、旋转等操作来维护平衡性。

    MySQL 索引

    索引,在 MySQL 也称为键 (Key),是 存储引擎 快速找到记录的一种 数据结构。相当于图书的目录,可根据目录中的页码快速找到所需的内容。

    索引结构类型

    (1)B+Tree 索引

    B+Tree 索引是大多数 MySQL 存储引擎的默认索引类型。

    因为 B+ Tree 的 有序性,因此可用于 部分查找、范围查找、排序 和 分组。

    适用于全键值、键值范围和键前缀查找,其中键前缀查找只适用于最左前缀查找。若不是按照索引列的顺序进行查找,则无法使用索引。

    (2)Hash 索引

    Hash 索引能以 O(1) 时间进行查找,但是失去了有序性。因此无法用于排序与分组,无法用于部分查找和范围查找,只支持 精确查找。

    Hash 索引仅满足 =,IN 和 <=> 查询,不能使用范围查询。因为 Hash 索引比较的是 Hash 运算后的 Hash 值,所以它只能用于等值的过滤。

    (3)全文索引

    全文索引使用倒排索引实现,它记录着关键词到其所在文档的映射。

    (4)空间数据索引

    空间数据索引会从所有维度来索引数据,可以有效地使用任意维度来进行组合查询。

    必须使用 GIS 相关的函数来维护数据。

    索引的优点缺点

    优点

    大大减少了服务器需要扫描的数据行数。

    避免服务器进行排序和分组操作,以避免创建 临时表。

    B+Tree 索引是有序的,可以用于 ORDER BY 和 GROUP BY 操作。临时表主要是在排序和分组过程中创建,不需要排序和分组,也就不需要创建临时表。

    将 随机 I/O 变为 顺序 I/O。

    B+Tree 索引是有序的,会将相邻的数据都存储在一起。

    缺点

    索引并不是越多越好,索引固然可以提高相应的 SELECT 的效率,但同时也降低了 INSERT 及 UPDATE 的效率,因为 INSERT 或 UPDATE 时有可能会 重建索引。

    索引的设计原则

    从索引的优、缺点考虑索引的设计原则。

    忌过度索引:索引需要额外的磁盘空间,而且会降低写操作的性能。

    在修改表内容时,索引会进行更新甚至重构,索引列越多花销时间越长。为此优化检索性能,只保持需要的索引即可。

    经常用在 排列、分组 和 范围搜索 的列适合创建索引,因为索引是有序的。

    经常出现在 WHERE 子句的列,或是 JOIN 连接子句中指定的列适合创建索引。

    使用短索引:若对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间。

    索引的优化策略

    独立的列:在进行查询时,索引列不能是 表达式 的一部分,也不能是 函数参数,否则无法使用索引。

    多列索引:在需要使用多个列作为条件进行查询时,使用多列索引比使用多个单列索引性能更好。

    索引列的顺序:让选择性最强的索引列放在前面。

    前缀索引:对于 BLOB、TEXT 和 VARCHAR 类型的列,必须使用前缀索引,只索引开始的部分字符。前缀长度的选取需要根据索引选择性来确定。

    覆盖索引:索引包含所有需要查询的字段的值。具有以下优点:

    索引通常远小于数据行的大小,只读取索引能大大减少数据访问量。

    一些存储引擎(例如 MyISAM)在内存中只缓存索引,而数据依赖于操作系统来缓存。因此,只访问索引可以不使用系统调用(通常比较费时)。

    索引的使用场景

    对于 非常小的表:大部分情况下简单的 全表扫描 比建立索引更高效;

    对于 中大型的表:建立索引 非常有效;

    对于 特大型的表:建立和维护索引的代价将会随之增长。这种情况下,需要用到一种技术可以直接区分出需要查询的一组数据,而不是一条记录一条记录地匹配。例如可以使用 分区技术。

    展开全文
  • 考研自用
  • 数据库面试常问——for考研面试复试。近几年基本都是线上复试,线上会更加注重概念的考察,本人在复试准备期间搜集了面试题,整理了很多资料。本文主要概括了数据库在复试面试中可能会考察的一些问题,仅供大家参考
  • 计算机保研 / 考研复试面试常问问题
  • 计算机考研复试面试常问问题 数据结构篇(下)

    万次阅读 多人点赞 2020-04-25 19:16:23
    计算机考研复试面试常问问题 数据结构篇(下) 使用前需知(拒绝白嫖,如果对你有帮助,你只需点个赞就行): 注意:有人在闲鱼上盗卖我的资料,而且还有很多同学买了,请各位擦亮双眼,我是整理出来免费分享给大家...
  • 计算机网络-考研复试面试-整合

    万次阅读 多人点赞 2020-03-09 14:05:49
    计算机网络有关面试题,非浓缩,涉及方方面面,主要以各层为导航,展开系列问题
  • 面向对象程序设计面试常问——for考研复试面试。近几年基本都是线上复试,线上的话会更加注重概念的考察,本文主要概括了面向对象语言c++在复试面试中可能会考察的一些问题,仅供大家参考。
  • 计算机考研复试面试常问问题 计算机网络篇(上)

    万次阅读 多人点赞 2020-04-05 21:20:58
    计算机考研复试面试常问问题 计算机网络篇(上) 在复习过程中,我用心查阅并整理了在考研复试面试中可能问到的大部分问题,并分点整理了答案,可以直接理解背诵并加上自己的语言润色!极力推荐打印下来看,效率更高!...
  • 浙大cs考研复试面试录音.mp3(里面对考研复试有很好的指导性并还原真实的考研复试场面).zip

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,313
精华内容 2,525
关键字:

考研复试面试