这里的钉子户是对我个人来说比较难记难背的或者搞得不太清楚的知识点,其实就是作为第三轮复习看的东西
搞定钉子户,人人有责,祝我们软考人逢考必过!!!
数据库的钉子户
钉子户1
外模式(用户模式或子模式)——视图
概念模式(模式)—-基本表
内模式(存储模式)——存储文件
钉子户2
左外连接就是自然连接的基础上加上左边表再右边表中找不到的公共序列,上面图公共序列是B和C,所以这两个合起来左边的表有bc、ad、de、fg,然后去右边的表中找bc合起来的有bc、de、fd、de,可以看到左边表的ad和fg在右边没有,那就用null拼在一起
钉子户3
钉子户4
1、一般软考中的相关题目是都符合第一范式的,不需要考虑
2、判断非主属性是否对候选键存在部分函数依赖,说白了就是看非主属性能不能只靠候选键的一部分就可以推理出来(靠候选键组合中任意一个主属性就可以推出那个非主属性的就不是第二范式,但是如果是组合中其中一个和其他非主属性组合在一起推出非主属性的那就没问题)
3、看有没有传递依赖,存在传递依赖不符合第三范式
4、看主属性对候选码有没有传递依赖或部分依赖,也就是主属性可以由候选码中任意一个就推出来那就不符合BCNF范式
5、看有没有多值依赖,并且多值依赖的左边是码,例如A->B,A->C,并且A是码,那就符合第四范式
钉子户5
设计模式的钉子户
钉子户1
创建型设计模式
工厂模式(Factory Method)
意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类
题目选项描述
1、当一个类希望由它的子类来指定它所创建的对象的时候
抽象工厂模式(Abstract Factory)
意图:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
题目选项描述
1、提供创建一系列相关或相互依赖的对象的接口,而无需指定这些对象所属的具体类
3、当要强调一系列相关的产品对象的设计以便进行联合使用时
4、一个系统要由多个产品系列中的一个来配置时
5、为图形用户界面(GUI)组件定义不同平台的并行类层次结构
生成器模式(建造者模式)(Builder)
意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
题目选项描述
1、当创建复杂对象的算法应该独立于该对象的组成部分及其装配方式时
2、当构造过程必须允许被构造的对象有不同的表示时
3、将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
4、适用于抽象复杂对象的构建步骤和基于构建过程的具体实现构建复杂对象的不同表示
判断关键词:复杂对象、不同的表示
原型模式(Prototype)
意图:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
题目选项描述
一个类的实例只能有几个不同状态组合中的一种
适用性
1、当一个系统应该独立于它的产品创建、构成和表示时。
2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。
3、为了避免创建一个与产品类层次平行的工厂类层次时。
4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们,可能比每次用合适的状态手工实例化该类更方便一些。
单例模式(Singleton)
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
题目选项描述
1、它能够保证一个类只产生唯一的一个实例
2、一个类仅有一个实例
适用性
1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
2、当这个唯一实例应该是通过子类化可扩展的,并且客户无须更改代码就能使用一个扩展的实例时。
结构型设计模式
适配器模式(Adapter)
意图:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
题目选项描述
1、将一个对象加以包装以给客户提供其希望的另外一个接口
2、想使用一个已经存在的类,而其接口不符合要美
3、使所有接口不兼容类可以一起工作
4、将一个类的接口转换成客户希望的另一个接口
适用性
1、想使用一个已经存在的类,而它的接口不符合要求。
2、创建一个可以服用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
3、(仅适用于对象Adapter)想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
桥接模式(Bridge)
意图:将抽象部分与其实现部分分离,使它们都可以独立地变化。
题目选项描述
1、类的抽象和其实现之间不希望有一个固定的绑定关系
2、不希望在抽象和它的实现部分之间有一个固定的绑定关系
3、都给另一个对象提供了一定程度上的间接性,都涉及从自身以外的一个接口向这个对象转发请求。(这是桥接和适配器共同的特征)
适用性
1、不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如,这种情况可能是B为,在程序运行时刻实现部分应可以被选择或者切换。
2、类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这是 Bridge模式传得开发者可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
3、对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译。
4、(C++)想对客户完全隐藏抽象的实现部分。
5、有许多类要生成的类层次结构。
6、想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
组合模式(Composite)
意图:将对象组合成树型结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
题目选项描述
表示对象的部分-整体层次结构
装饰器模式(Decorator)
意图:动态地给一个对象添加一些额外的职责。就增加功能而言,Decorator模式比生成子类更加灵活。
题目选项描述
1、将一个对象加以包装以提供一些额外的行为
2、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
3、动态地给一个对象添加一些额外的职责
适用性
1、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2、处理那些可以撤销的职责。
3、当不能采用生成子类的方式进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是,由于类定义被隐藏,或类定义不能用于生成子类。
外观模式(Facade)
意图:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
题目选项描述
1、将一系列对象加以包装以简化其接口
2、需要为一个复杂子系统提供一个简单接口
适用性
1、要为一个复杂子系统提供一个简单接口时,子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类,这使得子系统更具有可重用性,也更容易对子系统进行定制,但也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的默认视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade层。
2、客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
3、当需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,则可以让它们仅通过Facade进行通信,从而简化了它们之间的依赖关系。
享元模式(Flyweight)
意图:运用共亨技术有效地支持大量细粒度的对象。
题目选项描述
因使用大量的对象而造成很大的存储开销时,进行对象共享,以减少对象数量从而达到较少的内存占用并提升性能。
适用性
1、一个应用程序使用了大量的对象。
2、完全由于使用大量的对象,造成很大的存储开销。
3、对象的大多数状态都可变为外部状态。
4、如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
代理模式(Proxy)
意图:为其他对象提供一种代理以控制对这个对象的访问。
题目选项描述
1、将一个对象加以包装以控制对这个对象的访问
2、在需要比较通用和复杂的对象指针代替简单的指针时
3、为其他对象提供一种代理以控制对这个对象的访问
适用性
Proxy模式适用于在需要比较通用和复杂的对象指针代替简单的指针的时候,常见情况有:
1、远程代理(Remote Proxy)为一个对象在不同地址空间提供局部代表。
2、虚代理(Virtual Proxy)根据需要创建开销很大的对象。
3、保护代理(Protection Proxy)控制对原始对象的访问,用于对象应该有不同的访问权限的时候。
4、智能引用(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作。典型用途包括:对指向实际对象的引用计数,这样当该对象没有引用时,可以被自动释放;当第一次引用一个持久对象时,将它装入内存;在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。
行为型设计模式
责任链模式(Chain of Responsibility)
意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
题目选项描述
1、有多个对象可以处理一个请求,在运行时刻自动确定由哪个对象处理
2、一个客户需要使用一组相关对象
3、想在不明确指定接收者的情况下向多个对象中的一个提交一个请求
适用性
1、有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2、想在不明确指定接收者的情况下向多个对象中的一个提交一个请求。
3、可处理一个请求的对象集合应被动态指定。
命令模式(Command)
意图:将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
题目选项描述
1、抽象出执行的动作以参数化某对象
2、将请求封装为对象从而可以使用不同的请求对客户进行参数化
3、在不同的时刻指定、排列和执行请求
适用性
1、抽象出待执行的动作以参数化某对象(。Command模式是过程语言中的回调(Callback机制的一个面向对象的替代品。
2、在不同的时刻指定、排列和执行请求一个Command对象可以有一个与初始请求无关的生存期。如果一个请求的接收者可用一种与地址空间无关的方式表达,那么就可以将负责该请求的命令对象传递给另一个不同的进程并在那儿实现该请求。
3、支持取消操作Command的Execute操作可在实施操作前将状态存储起来,在取消探作时这个状态用来消除该操作的影响。Command接口必须添加一个Unexecute操作,该操作取消上一次Execute 调用的效果。执行的命令被存储在一个历史列表中。可通过向后和向前遍历这一列表并分别调用Unexecute和Execute来实现重数不限的“取消和“重做”。
4、支持修改日志这样当系统崩溃时,这些修改可以被重做一遍。在 Command 接口中添加装载操作和存储操作,可以用来保持变动的一个一致的修改日志。从崩溃中恢复的过程包括从磁盘中重新读入记录下来的命令并用Execute操作重新执行它们。
5、用构建在原语操作上的高层操作构造一个系统)这样一种结构在支持事务(Transaction)的信息系统中很常见。Command模式提供了对事务进行建模的方法。Command有一个公共接口,使得可以用同一种方式调用所有的事务,同时使用该模式也易于添加新事务以扩展系统。
解释器模式(Interpreter)
意图:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
题目选项描述
有一个语言需要解释执行,并且可将句子表示为一个抽象语法树
适用性
Interpreter模式适用于当有一个语言需要解释执行,并且可将该语言中的句子表示为一个抽象语法树时,以下情况效果最好:
1、该文法简单。对于复杂的发文,文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。它们无须构建抽象语法树即可解释表达式,这样可以节省空间还可能节省时间。
2、效率不是一个关键问题。最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将它们转换成另一种形式。不过,即使在这种情况下,转换器仍然可用该模式实现。
迭代器模式(Iterator)
意图:提供一种方法顺序访问一个聚合对象中的各个元素,且不需要暴露该对象的内部表示。
题目选项描述
访问一个聚合对象的内容而无须暴露它的内部表示
适用性
1、访问一个聚合对象的内容而无须暴露它的内部表示。
2、支持对聚合对象的多种遍历。
3、为遍历不同的聚合结构提供一个统一的接口。
中介者模式(终结者模式)(Mediator)
意图:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
题目选项描述
1、一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象
2、一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。
3、减少多个对象或类之间的通信复杂性
4、中介模式和观察者模式是相互竞争的模式,主要差别是:前者的中介对象封装了其他对象间的通信,而后者通过引入其他对象来分布通信。
5、欲使一个后端数据模型能够被多个前端用户界面连接
适用性
一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。
备忘录模式(Memento)
意图:在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态。
题目选项描述
1、将对象的状态恢复到先前的状态
2、在不破坏封装性的前提下,捕获对象的内部状态并在对象之外保存
3、必须保存一个对象在某一个时刻的(部分)状态
适用性
1、必须保存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。
2、如果一个用接口来让其他对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。
观察者模式(Observer)
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
题目选项描述
1、当一个对象必须通知其它对象,而它又不能假定其它对象是谁时
2、在发布-订阅(Publish-Subscribe)消息模型中,订阅者订阅一个主题后,当该主题有新消息到达时,所有订阅者都会收到通知
3、使所要交互的对象尽量松耦合
4、当一个对象状态改变时所有依赖它的对象得到通知并自动更新
5、一个对象的改变需要改变其它对象
适用性
1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两者封装在独立的对象中以使它们可以各自独立地改变和复用。
2、当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变时。
3、当一个对象必须通知其他对象,而它又不能假定其他对象是谁,即不希望这些对象是紧耦合的。
状态模式(State)
意图:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
题目选项描述
1、一个对象的行为决定于其状态且必须在运行时刻根据状态改变行为
2、一个对象在其内部状态改变时改变其行为
适用性
1、一个对象的行为决定于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2、一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得开发者可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象独立变化。
策略模式(Strategy)
意图:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化。
题目选项描述
1、需要使用一个算法地不同变体
2、许多相关的类仅仅是行为有异
3、在设计某购物中心的收银软件系统时,要求能够支持在不同时期推出打折、返利、满减等不同促销活动
适用性
1、许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置-个类的方法。
2、需要使用一个算法的不同变体例如,定义一些反映不同空间的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使厨策略模式。
3、算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
4、一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,将相关的条件分支移入它们各自的Strategy类中,以代替这些条件语句。
访问者模式(Visitor)
意图:表示一个作用于某对象结构中的各元素的操作。它允许在不改变各元素的类的前提下定义作用于这些元素的新操作。
题目选项描述
需要对一个对象结构中的对象进行很多不同的并且不相关的操作
适用性
1、一个对象结构包含很多类对象,它们有不同的接口,而用户想对这些对象实施一些依赖于其具体类的操作。
2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而又想要避免这些操作“污染”这些对象的类。Visitor 使得用户可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
3、定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。
模板方法模式(Template Method)
意图:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
适用性
1、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2、各子类中公共的行为应被提取出来并集中到一个公共父类中,以避免代码重复。
3、控制子类扩展。模板方法旨在特定点调用“hook”操作(默认的行为,子类可以在必要时进行重定义扩展),这就只允许在这些点进行扩展。
钉子户2
结构化开发的钉子户
钉子户1
钉子户2
钉子户3
数据流图由数据流、加工、数据存储、外部实体组成
数据字典由数据流、数据项、数据存储和基本加工组成
常用的加工逻辑描述方法有结构化语言、判定表、判定树
A.对每一个基本加工,必须有一个加工规格说明
B.加工规格说明必须描述把输入数据流变换为输出数据流的加工规则
c.加工规格说明必须描述实现加工的具体流程
这里的加工规格等价与加工逻辑
决策树和决策表适于用来表示加工中涉及多个逻辑条件的情况。
钉子户4
知识产权的钉子户
钉子户1
只有发表权有时限是终生+死后50年,其他的永久
计算机软件著作权受到《中华人民共和国著作权法》和《计算机软件保护条例》这两个法律的保护,《计算机软件保护条例》由国务院发布的
计算机软件著作权(50年)
商业秘密权(无固定期限)
专利权(10-20年)
1、发明专利权的期限为二十年。2、实用新型专利权的期限为十年。3、外观设计专利权的期限为十五年,均自申请日起计算。
商标权(10年续+)
计算机网络的钉子户
钉子户1
IPv4是32位,表示ip地址有232个,IPv6是128位,表示ip地址有2128个
钉子户2
钉子户3
SMTP是用来发邮件的协议,端口号是25,用TCP端口,只能传输文本和ASCII码的文件
PEM是加密邮件的协议
MIME是邮件扩充协议(可以理解为除了发邮件还可以发其他东西,例如多媒体文件)
POP(POP3)是用来接受邮件并保管好邮件的协议,用TCP端口,端口号是110,采用C/S模式进行通信
钉子户4
钉子户5
MAC就是物理地址
钉子户6
icmp是Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。
信息安全的钉子户
钉子户1
包过滤技术对应用和用户是透明的
钉子户2
钉子户3
拒绝服务(DOS):对信息或其它资源的合法访问被无条件地阻止(主动攻击)
会话拦截:未授权使用一个已经建立的会话。(主动攻击)
修改数据命令:截获并修改网络中传输的数据命令(主动攻击)
系统干涉:指的是攻击者获取系统访问权,从而干涉系统的正常运行,一般可以归于被动攻击。
流量分析也是被动攻击
钉子户4
1、WEP是有限等效保密协议
2、ARP是IP地址解析成物理地址的协议
3、Telnet是不安全的远程登录协议,而SSH是安全的远程登录协议,RFB是远程登录用户图形化界面
4、IPSec是对ip数据报文进行加密
5、Http端口号是80,不安全,Https(Http+SSL)端口号是443,安全,基于SSL安全协议
6、AUX端口为异步端口,主要用于远程配置,也可用于拔号连接,还可通过收发器与MODEM进行连接。支持硬件流控制(Hardware Flow Control)。
7、TFTP是简单文件传输
8、PP2P是链路加密协议
9、JGMP是因特网组管理协议
10、边界网关协议(BGP)是运行于 TCP 上的一种自治系统的路由协议。 BGP 是唯一一个用来处理像因特网大小的网络的协议,也是唯一能够妥善处理好不相关路由域间的多路连接的协议。
钉子户5
钉子户6
面向对象的钉子户
钉子户1
对象的组成有对象名,属性(状态)、方法(操作,行为)
钉子户2
不同对象收到同一消息可以产生各自不同的结果
动态绑定支持继承和多态
钉子户3
钉子户4
UML的钉子户
钉子户1
钉子户2
出现一个对象(部分)消失时,另一个对象(整体)也随之消失就是组合关系
出现一个对象(部分)消失时,另一个对象(整体)不随之消失就是聚合关系
实心菱形就是组合,空心就是聚合,然后菱形右边表示整体,左边表示部分
钉子户3
A的直接对象就是指这个类的对象,但是A是抽象类没有实例化对象,所以没有直接对象,非直接对象就是继承这个A类的子类的对象叫非直接对象,也就是A1和A2
序列图(顺序图)
通信图
状态图
这个东西比较复杂,我觉得今年不会考就没看了,摆烂!
活动图
构建图(组件图)
注意上面这个图的供接口和需接口标反了!!!
注意这里1是供接口,2是需接口
部署图
钉子户4
软件工程的钉子户
钉子户1
钉子户2
CL0(未完成)指未执行过程,表明过程域的一个或多个符足目仍没有被满足;
CL1(已执行)指过程通过转化可识别的输入工作产品,产生可识别的输出工作产品,关注于过程域的特定目标的完成;
CL2(已管理)指过程作为已管理的过程制度化,关注于针对单个过程实例的能力;
CL3(已定义)指过程作为已定义的过程制度化,关注过程的组织级标准化和部署
CL4(定量管理)指过程作为定量管理的过程制度化;
CL5(优化的)指过程作为优化的过程制度化,表明过程得到很好地执行且持续得到改进。
钉子户3
瀑布模型
瀑布模式适合开发需求明确的,需求大致固定不会随意变更的系统
V模式的关键字在于质量保证活动和沟通,基本问题逐步细化
增量模型
增量模型拥有瀑布模型的所有优点
它主要的特点是可以快速构造可运行的产品,其他优点如下
1、软件可以快速地交付
2、早期的增量作为原型,从而可以加强对系统后续开发需求的理解
3、具有最高优先级的功能首先交付,随着后续的增量不断加入,这就使得更重要的功能得到更多的测试
4、可以使用较早的增量构件作为原型,从而获得稍后的增量构件需求
5、容易理解,管理成本低
6、开发由增量表示的小系统所承担的风险小
7、强调开发阶段性早期计划
我一直觉得原型模型和增量模型都是可以快速构建可运行产品的,我生怕它考这个特点然后问哪个模型是这个特点,但是我发现好像不会这么出题,这两种模式只会给明你指定的模型问优点
原型模型
原型模型主要强调用户需求不清楚,需求经常变化的时候使用,并且规模不是很大,它虽然也能快速构建可运行产品,但这个不是他主要的特点
螺旋模型
它包含维护周期,因此维护和开发之间没有本质区别
喷泉模型
统一过程(UP)模型
极限编程(XP)
钉子户4
概要设计
详细设计
钉子户5
多个测试用例都不在合法范围内的都不是好的测试用例
钉子户6
两个方法
第一个是边-节点+2
第二个闭合区域+1
第二个速度快但是容易错
钉子户7
判定覆盖(分支覆盖)
也就是每个判定表达式都有一真一假,也就是下面的红色画出来的,这里的判定是指判定整体一起,也可以理解为就是菱形这个整体要一真一假
如果可以的话两个测试用例就够了,全部为真和全部为假两个测试用例
条件覆盖
条件覆盖就是判定表达式的所有条件都要最少取得一真一假,例如上面那个图的第一个判定表达式的条件如下,有两个条件,每个条件要最少取一真一假
条件组合覆盖
也就是判定表达式的所有条件的真假不同组合必须都有,两个条件就是四种组合,例如下面的
这个题目有点意思,注意看i=0是每一次都会赋值一次,所以红色画出来的部分它每次都会先执行Y路径再执行N路径,也就是路径是固定的
这里34题选A!!
钉子户8
正确性主要就是修改错误
适应性主要是是变化了所以要适应或者是扩充升级(不是新的需求或功能而是在原来的基础上升级),题目中有变化或者暗示变化那就是适应性
完善性主要是直接新增功能和需求这两个点或提高性能(注意这里是直接提出的新增功能和需求而不是为了适应什么变化而提出来的新的功能和需求)
预防性主要是预防两字
这里要注意提出这个需求的原因是外部环境变化,核心是这个变化,所以是适应性
钉子户9
沟通路径无主程序员的公式【(n-1)*n】/2,就是求和公式
有主程序员n-1,其中n为程序员的个数
钉子户10
钉子户11
顺着推(最早时间)取最大,逆着推(最晚时间)取最小
找到FG,然后看经过FG到终点的路径是哪一条,这里是ADFGJ,然后从J倒着求到F点(但是这里有三条路径,一定记得是沿着前面给出的ADFGJ路径,因为它这个路径包含了FG),看看F点的最晚时间是多少,最后求最早和最晚的时间差值就是FG的松弛时间
讲解地址:2012年下半年第16、17题_哔哩哔哩_bilibili
钉子户12
钉子户13
钉子户13
钉子户14
钉子户15
程序设计语言的钉子户
钉子户1
钉子户2
钉子户3
钉子户4
词法分析
语法分析
、
语法分析阶段可以发现程序中所有的语法错误
语义分析
有语义错误是可以编译成功的,例如a/0;这是符合语法的,也符合静态语义,编译器检验不出来这个是错的,只有运行才会报错,也就是动态语义,动态语义错误常见的有死循环
钉子户5
正规式和有限自动机都是词法分析的工具
这里注意(0|1)*可以理解为是万能的公式,可以拼接成任何想要的0和1的序列,但是这个选项后面加了个01,也就是必须要用01结尾,前面的你可以随便拼,例如你可以拼成011 01,前面的011是由(0|1)*得到的其中*取3,做这样的题目一般是直接从选项随便取*然后得到的序列看看能不能在图上跑通并且跑到终点
钉子户6
这里知道后缀式是把符号为放在最后并且最为一个新的整体替换原来的a” />
算术表达式对应的是中序遍历
计算机系统的钉子户
钉子户1
算术逻辑单元(ALU)是算术运算和逻辑运算
累加寄存器(AC)是暂存算术运算或逻辑运算的中间运算结果
数据缓冲寄存器(DR)是暂存指令或数据字或操作数
状态条件寄存器(PSW)是保存指令执行后的状态
指令寄存器(IR)存放的是从内存中取得指令,就像个中间站一样,不过是存放指令的中间站,程序员无法访问
程序计数器(PC)存放的是指令的地址,还有计数的功能
地址寄存器(AR)存放的是cpu访问内存单元的地址
指令译码器(ID)是把操作码解析成对应的指令操作
钉子户2
八进制与十六进制
八进制和十六进制转二进制
也就是一个16进制的数要用4个2进制的数来表示
一个16进制对应转成4个二进制
一个8进制对应转成3个二进制
钉子户3
反码
补码
移码
移码就是把对应的补码的符号位取反就可以了
补码的反码的补码就是原码,先把16进制转为2进制,然后最其求反码,再求补码最后得到原码
这里一定要注意在得到器原码的二进制序列后一定要记得第一位是符号位,不参加转换的,也就是上面的11110000只是把1110000转成十进制,不是把11110000转成十进制
钉子户4
寻址速度:立即寻址>寄存器寻址>直接寻址>寄存器间接寻址>间接寻址
钉子户5
海明码用奇偶性来检错和纠错,码距是3,这里记得公式2k>=n+k+1就行,其中k是检验位,n是数据位
码距为2,可以检错不能纠错
钉子户6
这里呢可以记忆为C富(C很富有),剩下的自然就是精简
钉子户7
吞吐率=指令条数/【一条完整指令的时间+(n-1)*流水线周期】
最长流水线的总共时间=一条完整指令的时间+(n-1)*流水线周期
其中流水线周期其实就是最长的操作时间,例如下面的流水线周期其实就是4△t
会做这样的题目就行
钉子户8
发生块冲突从少到多的顺序:全相联映射–>组相联映射–>直接映射
钉子户9
钉子户10
(1)程序查询方式(程序直接控制方式)
(2)中断驱动方式
(3)DMA方式(直接存储器存储方式)
DMA传输数据比中断驱动方式传输数据要快点
钉子户11
加密技术(只能防止第三方窃听)
混合加密就是把对称和非对称加密一起混合使用,适合在传输大量信息的时候,先用对称加密在用另一个的公钥加密,这样就只有另一个自己能够解密这个信息
认证技术
数字签名是用私钥签名,公钥验证,一般是对信息摘要进行签名
数字签名是非对称加密算法的一种方法来保证信息不会被篡改
数字证书
数字证书其实就是第三方CA机构用自己的私钥来对用户的公钥进行数字签名来保证这个公钥不被篡改,然后接收方用CA的公钥进行解密得到发送方的公钥
数字证书主要是用来对用户身份进行认证,而数字签名主要用于确保消息不可被否认
对称密钥也叫共享密钥
认证处理主动攻击
操作系统的钉子户
钉子户1
这里的应用软件和系统软件要能够区分开来
如编辑程序、汇编程序、编译程序等系统软件,应用软件如QQ,微信等
钉子户2
这里我一直不明白那个S1-Sn怎么把它正确的标到那个对应的线上去,然后我这个视频我搞懂了这个,它是按P1–》P5的顺序进行标的,也就是从小到大的原则,也就是无论哪个图都是从P1开始标,标它们的出度,这里P1有两个出度,一个是P1到P4,就把它看做是14,一个是P1到P3,把它看做是13,然后13<14,根据从小到大的原则,P1到P3那根线上标S1,P1到P4那根线上标S2,然后P1的出度标完了就去标P2的出度,P2的出度也就两个,同理,23<25,所以P2到P3那根线上标S3,P2到P5那根线上标S4,后面继续标P3的出度,直到都标完了为止
总之两个要点:从小到大标S,入P出V(入屁)
入P出V(入屁)也就是观察那个图,如果入度的话就是P操作,出度的话就是V操作
从小到大标S也就是把S1到Sn从P1依次标到Pn,顺序是从小到大,同时出现多个出度的时候也是从小到大的原则
钉子户3
1、P减V加,P申请V释放
2、S的值为负数,负几就有几个进程在等待,S值为0就表示没有等待的,但是有一个或多个进程正在运行,S为正数就表示有多少个资源可以使用
3、只要满足m>=n*(k-1)+1那就不会发生死锁
m为资源数量,n为进程数量,k为每个进程需要的资源数量
4、只要知道同一个进程中的多个线程不能共享该进程的栈指针,但是可以共享该进程的代码、打开的文件、全局变量
钉子户4
单缓冲区
下面这个公式是用来计算单缓冲区花费的时间
(T+M)*n+C
T为输入的时间,M为传输的时间,n为作业的个数,C为处理的时间
讲解地址:单缓冲区_哔哩哔哩_bilibili
双缓冲区
下面这个公式是用来计算双缓冲区花费的时间
T*n+M+C
T为输入的时间,M为传输的时间,n为作业的个数,C为处理的时间
钉子户5
先来先服务(FCFS)
最短寻道时间优先(SSTF)
这里主要是怕给我个英文名忘了中文是什么
钉子户6
这样的题目要会做,首先要知道下标是从0开始的,然后算出对应的索引能够放多少个地址项n,在计算最大长度时二级索引一般都是n*n,下标从0开始,例如上面的题二级索引就是256*256=66536,那二级索引表示范围就是0-66535,然后前面求到了516块地址项了,那二级索引的0就对应是517块地址项,然后517+66535=66052,由于是从0下标开始的所以要加1 ,最后得到最长长度为66053
讲解地址:2012年下半年第27、28题_哔哩哔哩_bilibili
钉子户7
也就是全文件名和绝对路径都是从根目录开始的,然后区别在于全文件名会把文件的名字加在最后,但是绝对路径最后面是加的\
相对路径是从当前目录开始的,最后面一般是加\
这里第二题我选了C,注意C后面缺少一个\,所以访问不到f1.java文件
特别注意:这里Java-prog\和Program\Java-prog\都是可以表示相对路径的
钉子户8
这样的题目没给位示图编号的,不知道位示图编号是从0开始还是1开始的默认为1,直接拿那个多少号%多少位得到的结果+1
总之位示图默认编号从1开始那计算结果+1,从0开始计算结果不用+1
位示图的大小为容量/物理块/字长位数,注意单位的统一
钉子户9
数据结构的钉子户
钉子户1
钉子户2
这个题目不是用的上面的公式
讲解地址:2014年上半年第62、63题_哔哩哔哩_bilibili
钉子户3
一般没有问最好或者最坏的时间复杂度那就是默认为平均复杂度
线性表顺序存储插入元素时间复杂度
最好的情况就是直接在顺序表后面插入一个元素,时间复杂度为O(1)
最坏的情况是在插入一个元素到原来第一个元素的位置,时间复杂度为O(n)
平均复杂度为O(n)
线性表顺序存储删除元素时间复杂度
最好的情况就是直接在删除最后一个元素,时间复杂度为O(1)
最坏的情况是删除第一个元素,时间复杂度为O(n)
平均复杂度为O(n)
线性表顺序存储查找元素时间复杂度
时间复杂度为O(1),因为这是直接根据数组下边就可以快速查询到对应的元素
线性表链式存储插入元素时间复杂度
这里插入分为两种,一种是带头结点的,还有一种是不带头结点的,但是其时间复杂度都一样的
最好的情况就是插入在头结点后面一个结点的位置时,时间复杂度为O(1)
最坏的情况是k=n+1的时候,也就是插入在最后面,时间复杂度为O(n)
平均复杂度为O(n)
线性表链式存储删除元素时间复杂度
最好的情况就是k=1的时候,也就是删除在头结点后面一个结点时,时间复杂度为O(1)
最坏的情况是k=n+1的时候,也就是删除最后面一个结点时,时间复杂度为O(n)
平均复杂度为O(n)
线性表链式存储查找元素时间复杂度
最好的情况就是k=1的时候,也就是查找在头结点后面一个结点时,时间复杂度为O(1)
最坏的情况是k=n+1的时候,也就是查找最后面一个结点时,时间复杂度为O(n)
平均复杂度为O(n)
钉子户4
递归(嵌套调用)用栈是经典
这里n取特殊值为4,也就是栈空间总共就4个,当栈1存了4个后(也就是栈满了),栈1的指针top[1]就是等于5,而栈2一个都没有存,栈2的底部是top[2]=4,两个差值为1
讲解地址:2021年下半年第57题_哔哩哔哩_bilibili
钉子户5
这里随便取M为6,所以队头是5,然后队列长度Q.len为3,那Q.rear是1,代进去求队头看看下面公式求出结果是不是5,其实就是代特殊值
讲解地址:2010年下半年第57题_哔哩哔哩_bilibili
这里我一开始是以为左边可以理解为是一个栈,这是错的,应该是打通的
讲解地址:2013年上半年第53题_哔哩哔哩_bilibili
两个栈是可以模拟一个队列的,但是两个队列是无法模拟一个栈的操作的,因为队列进出的顺序是一样的,而栈进出顺序是倒置的
钉子户6
讲解地址:2014年下半年第60题_哔哩哔哩_bilibili
这种题我是会做,但是我说不清,勉强说说做题技巧
首先next数组前面两个是01,这是固定的,然后我是直接求最后一个字母的next值
例如上面的abaac最后一个字母是c,在c前面的模式串是abaa,然后求这个模式串的next值(也就是当要求那个字母的next值时就是求它左边的那一串next的最大值)
长度为1时,abaa的最前面一个字母和最后面一个字母都是a,说明相等,那么next值为长度+1也就是1+1=2
长度为2时,abaa的最前面两个字母组合是ab,最后面的两个字母是aa,不相等,那么next的值为1
长度为3时,abaa的最前面的三个字母的组合是aba,最后面的三个字母的组合是baa,不相等,那么next值为1
长度为4时串的前缀和后缀都是同一个串,不合法,不用计算,所以取next值最大的作为最后一个字母的next值,也就是2,所以选B
总之,就是从长度1开始到(模式串-1)一个个的去求,只要前缀和后缀相同,那next值就是对应长度+1,不同那就是1
钉子户7
这公式理解了就很好记,其实也不用记,都不考
钉子户8
树的四个性质
二叉树的性质
给定结点数n,求二叉树的形态数量公式如下
链式存储
对于二叉链表来说,n个结点就有2n个指针域,然后n个结点就有n-1个分支,也就是n-1个指针不为空,那么为空的指针域就是2n-(n-1)=n+1个空指针域
总结:对于二叉链表来说,n个结点就有n+1个空指针域
对于三叉链表来说,n个结点有3n个指针域,这里多了一个父指针域,也就是第二个指针域的位置是指向父指针域的,那么n个结点就有n-1个分支和n-1个父指针域,所以空指针域是3n-(n-1)-(n-1)=n+2个空指针域
总结:对于三叉链表来说,n个结点就有n+2个空指针域
平衡二叉树
这是平衡二叉树,但是下面两个都不是平衡二叉树,完全二叉树一定是平衡二叉树,平衡二叉树不一定是完全二叉树 ,结点如果没有左右子树高度就是0,A结点的左子树高度是3,右子树高度是2,注意这里高度不是从A开始算,是从A的孩子结点开始算的
二叉排序树
上面的就是二叉排序树,也就是根结点大于左子树的所有结点,小于右子树的所有结点
最优二叉树(哈夫曼树)
讲解地址:最优二叉树定义_哔哩哔哩_bilibili
最核心的就是权值相同加末尾,从左往右画好图
这里主要是知道权值相同时怎么处理(能够正确画好下面两个题就说明知道怎么处理了),然后一定记得是左小右大,画完最好检查一下符不符合这个左小右大,我经常忘了这个规则!
最优二叉树的判断是只有度为0和度为2的结点
讲解地址:构造最优二叉树例子_哔哩哔哩_bilibili
给定义一个序列画哈夫曼树
讲解地址:构造最优二叉树例子_哔哩哔哩_bilibili
讲解地址:构造最优二叉树例子_哔哩哔哩_bilibili
哈夫曼编码
记得左0右1就行
哈夫曼编码压缩比
这里是跟等长编码进行比较,2x>=n,x是要多少个等长编码,n是指有多少个字符,上面有5个字符,所以n=5,求出x=3,然后就可以算出压缩比了,注意这里求WPL的时候的路径长度怎么看,别跟结点所在高度搞混淆了,其实就是看那个路径在第几层那路径长度就是几。
讲解地址:哈夫曼编码压缩比_哔哩哔哩_bilibili
钉子户9
连通图和强连通图
这里注意
连通图是对于无向图来说的,所以一般称为无向连通图
无向连通图的最少边是n-1,最多边是n(n-1)/2
上面的是无向连通图,我一开始以为2-5没有边连接起来所以不是无向连通图,但是2-5是可以通过2-3-4-5实现的,也就是它不用必须直接把两个顶点用边连接起来,所以才会有上面的最少边和最多边的情况
强连通图是对于有向图来说的,所以一般称为有向强连通图,
有向强连通图的最少边是n,最多边是n(n-1)
这个图不是强有向连通图,因为顶点2并没有能够到达1和4的箭头
总的来说,不管是连通图还是强连通图,它们的核心判断就是看任意两个顶点能不能互相跑通,不一定要直接一口气跑到,可以跑到这再跑到那最后跑到目的顶点
无论是无向图还是有向图,它们所有顶点的度数之和都是边数的两倍
邻接矩阵表示法
也就是用矩阵来存储图,矩阵横表示i,竖表示j,有向图中A[i][j]=1表示顶点i指向顶点j,例如上面有向图中
A[1][2]=1说明顶点1指向顶点2,然后顶点1的出度就是数i=1的那一横有多少个1,入度就是数j=1的那一列有多少个1,例如上面的有向图中顶点1横着数有3个1,那就是出度为3,竖着数有1个1那就是入度为1
总结:矩阵横表示i,竖表示j,有向图中A[i][j]=1表示顶点i指向顶点j,横着指向竖着
邻接链表表示法
有向图的非0元素是e,无向图的是2e
钉子户10
深度优先搜索
深度优先搜索有回溯操作,而且搜索序列不唯一
讲解地址:深度优先遍历_哔哩哔哩_bilibili
当图用邻接矩阵表示时,那深度优先搜索的时间复杂度为O(n2)
当图用邻接链表表示时,那深度优先搜索的时间复杂度为O(n+e)
n为顶点数,e为边数
广度优先搜索
广度优先搜索序列也不唯一
讲解地址:广度优先遍历和时间复杂度_哔哩哔哩_bilibili
当图用邻接矩阵表示时,那广度优先搜索的时间复杂度为O(n2)
当图用邻接链表表示时,那广度优先搜索的时间复杂度为O(n+e)
n为顶点数,e为边数
钉子户11
例如上面的614325这个拓扑序列中,6在4的前面,那么可能存在弧6指向4,一定不存在弧4指向6,可能存在6到4的路径,一定不存在4到6的路径
讲解地址:拓扑排序_哔哩哔哩_bilibili
钉子户12
顺序查找就是从左往右查,不需要有序,适用于顺序和链式存储方式,平均查找长度为(n+1)/2
二分查找要求顺序存储并且是有序存储
这里首先我第一次做直接就把123给丢了,看题不仔细,其次二分法没学透,所以我选了C。
这里要先把下标从1标出来,然后求中间值,中间值如果是小数,那就用下取整的方法求,例如上面的(1+10)/2=5.5,向下取整为5(所谓的向下取整就是取小于这个数的最大整数),然后下标5对应的是55<95,说明在55的右边,那就是从62开始,也就是舍弃55这个中间值,55不参与下一轮的比较
总结:下标求中间值(比较值),中间值为小数则向下取整,比较后舍弃中间值进行下一轮比较
讲解地址:2010年下半年第60题_哔哩哔哩_bilibili
这里还要比较一次M【4】,这里我是没看懂就一个数还比较个屁,可能是最后确认一下
这里有个有意思的技巧,做这样的题目有个规律
关键字序列中有四种规律
大大大大大大一直大下去
小小小小小小一直小下去
小大小大一直这样小大下去
大小大小一直这样大小下去
看不懂直接去讲解地址看视频就知道了
讲解地址:2015年上半年第60题_哔哩哔哩_bilibili
(这个规律是折半查找的,别跟堆搞混淆了,我就把这个规律用到了下面题目中,想笑)
钉子户13
哈希函数的构造法知道除留余数法就行,就是求余
m的取值一般为不大于n但接近n的质数,n是指关键序列有多少个数字(记得有这句话就行)
散列表地址一般是从0开始(参考真题2就懂了这句话的意思)
解决冲突的方法
知道开放定址法就行了,说白了就是如果冲突了那就把那个数放到右边一位,如果还冲突那就继续往右推一位,直到不冲突为止,也就是把那个数放进去为止(这是线性探测法)
这个说白了就是如果冲突的话那就放到右边一位,如果还是冲突那就放到左边一位,这里的左边一位是以最开始冲突位置为原点的,再冲突就放到右边第4位,再冲突就放到左边第4位,以此类推
讲解地址:处理冲突拓展和装填因子_哔哩哔哩_bilibili
这里我一开始以为是地址只从0-7,其实地址应该是取0-m,这个m在这里是13,也就是取模的那个数,所以这地址是0-12
讲解地址:2011年上半年第61题_哔哩哔哩_bilibili
这里关键码10的哈希地址是10,65也是10,然后向右移动一位,但是发现右边没位置了,那就放到哈希地址0,可以把它想象成循环链表,10和1是拼在一起成为一个圈的
钉子户14
这里我主要是不记得这两个东西是什么玩意,因为太久没看了
讲解地址:建立小顶堆和大顶堆_哔哩哔哩_bilibili
就是给你一个序列,让你画出对应的大顶堆(大根堆)或小顶堆(小根堆)就行了
先根据序列顺序画一颗满二叉树,然后在一个个换位子,大顶堆要保证父结点比孩子结点要大,小顶堆要保证父结点比孩子结点小
钉子户15
所有排序的时间和空间复杂度
快速排序的空间复杂度是O(log2n),上面是错的
直接插入排序稳定不归位(归位就是能够在排序时确定最终排序的位置),适用于基本有序的情况
讲解地址:直接插入排序_哔哩哔哩_bilibili
希尔排序不稳定不归位
讲解地址:bilibili.com/video/BV1UP4y1A79a?p=35
计数排序适合序列里只有1-9的数字排序,说白了就是把要排序的数统计一下有多少个
讲解地址:直接插入、希尔、计数排序动画演示_哔哩哔哩_bilibili
简单选择排序不稳定归位
讲解地址:简单选择排序_哔哩哔哩_bilibili
堆排序不稳定归位
讲解地址:堆排序_哔哩哔哩_bilibili
冒泡排序稳定归位
讲解地址:冒泡排序_哔哩哔哩_bilibili
快速排序不稳定归位,对于基本有序的序列用快速排序效率是最低的,时间复杂度是最坏的情况O(n2),快速排序是采用分治法的思想
讲解地址:快速排序_哔哩哔哩_bilibili
归并排序稳定不归位,采用分治法的思想
讲解地址:归并排序_哔哩哔哩_bilibili
麻辣心得
1、希简快堆冒归位,其他就是不归位
2、归堆的时间复杂度都是nlgn(nlog2n)
3、空间复杂度除了快速排序O(log2n)归空排序O(n),其他都是O(1)
4、直接归冒泡稳定(直接插入排序、归并排序、冒泡排序稳定)
5、希尔直接冒泡最好时间复杂度为O(n),快归堆O(nlgn)最好,简单O(n2)
6、归堆O(nlgn)最坏,其他都是O(n2)
7、平均快归堆O(nlgn),希尔O(n1.3),其他为O(n2)
直接插入排序适用于基本有序的的序列,这个时候是比较次数最少的时候
讲解地址:2012年下半年第62、63题_哔哩哔哩_bilibili
这里我一开始是觉得65应该选C,也就是插入排序的平均时间复杂度,但是它这里是算最好的时间复杂度,这是因为它已经说了基本有序了,这是最好的情况,所以求的也是最好的时间复杂度
这里知道怎么转新堆就差不多了
讲解地址:堆排序_哔哩哔哩_bilibili
讲解地址:2015年上半年第61题_哔哩哔哩_bilibili
冒泡排序稳定归位
讲解地址:冒泡排序_哔哩哔哩_bilibili
快速排序不稳定归位,对于基本有序的序列用快速排序效率是最低的,时间复杂度是最坏的情况O(n2)
快速排序是采用分治法的思想,用i指针指向第一个,j指针指向最后一个,设置个p=第一个值,然后j指针指向的数字和p值比较,如果比p小那就把j指针指向的值赋值到i指针指向的值,如果比p大,那就j指针向左移动一位,然后阿巴阿巴,讲起来太抽象,建议直接看视频
讲解地址:2009年下半年第64、65题_哔哩哔哩_bilibili
讲解地址:2020年下半年第62、63题_哔哩哔哩_bilibili
这里归并排序没掌握,多看看
讲解地址:2011年上半年第65题_哔哩哔哩_bilibili
搞到这里我承认我真的麻了!!!