自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(94)
  • 收藏
  • 关注

原创 第五章 概率分析和随机算法 5.2 指示器随机变量

5.2 指示器随机变量一. 指示器随机变量1. 相关定义  给定一个样本空间 SSS 和 一个事件 AAA ,那么事件 AAA 对应的指示器随机变量 I{A}I\{A\}I{A} 定义为:I{A}={1如果 A 发生0如果 A 不发生I\{A\}=\begin{cases}1&\text{如果 $A$ 发生}\\0&\text{如果 $A$ 不发生}\end{cases}I{A}={10​如果 A 发生如果 A&n

2020-08-04 12:19:50 474

原创 第五章 概率分析和随机算法 5.1 雇用问题

5.1 雇用问题一. 雇用问题1. 问题描述  假设雇用一名新的办公助理,先找一名雇用代理。雇用代理每天推荐一个应聘者,雇用者决定是否雇用。雇用者必须给雇用代理一小笔费用,以便面试应聘者。在面试完每个应聘者后,如果该应聘者比目前的办公助理更合适,就会辞掉当前的办公助理,然后聘用新的。  HIRE-ASSISTANT 过程表示雇用策略。假设应聘办公助理的候选人编号为 111 到 nnn 。该过程中假设雇用者在面试完应聘者 iii 后,决定应聘者 iii 是否是你目前见过的最佳人选。初始化时,该过程创建

2020-07-28 21:37:19 543

原创 软件构造 5-3 Maintainability Oriented Construction Techniques

5.3 面向可维护性的构造技术一. 基于状态的编程  基于状态的编程使用有限状态机来定义程序的行为、使用状态来控制程序的执行。  根据当前状态,决定下一步要执行什么操作、执行操作之后要转移到什么新的状态。1. 基于自动机的编程  核心思想:将程序看作是一个有限状态自动机,侧重于对“状态”及“状态转换”的抽象和编程。  程序的执行被分解为一组自动执行的步骤,各步骤之间的通讯通过“状态变量”进行。  程序执行就可看作是各自动步骤的不断循环,使用枚举类型 enum 定义状态,使用二维数组定义状态转

2020-07-01 20:25:47 268

原创 软件构造 5-2 Design Patterns for Maintainability

5.2 面向可维护性的设计模式一. 关于如何创建类的新实例 的模式1. Factory method pattern 工厂方法模式  当 client 不知道要创建哪个具体类的实例,或者不想在 client 代码中指明要具体创建的实例时,用工厂方法。  工厂方法:定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个类的实例化延迟到其子类。  例,如图所示:Product p = new ProductTwo();//一般的构造方法Product p = new Concret

2020-06-30 23:37:19 253 1

原创 软件构造 5-1 Metrics and Construction Principles for Maintainability

5.1 可维护性的度量与构造原则一. 软件的可维护性  软件维护:修复错误、改善性能。种类有:纠错性:对 bug 进行修复适应性:迁移相关。如把软件从电脑端迁移到手机端需要做一些改变。完善性:对功能进行完善。预防性:为了以后软件可能的变化,对现有软件的架构进行实现或改变。  软件演化指的是对软件进行持续的更新。软件的大部分成本来自于维护阶段。  提高软件可维护性的方法:模块化OO 设计原则:SOLID GRASPOO 设计模式基于状态的构造技术表驱动的构造方式基于语法的

2020-06-29 23:22:18 248

原创 软件构造 4-3 Design Patterns for Reuse

4.3 面向复用的设计模式一. 模式  创建模式结构模式适配器模式装饰模式门面/外观模式行为模式策略模式模板模式迭代器模式1. 结构型模式1.1 适配器模式  解决接口不匹配的情况。也可以说是将某个类/接口转换为 client 期望的其他形式。通过增加一个接口,将已存在的子类封装起来, client 面向接口编程,从而隐藏了具体子类。  如下是参数不匹配的例子(属接口不匹配),通过适配器(中转的类,将不适合的接口变得适合):  源程序:class

2020-06-28 23:22:31 182 1

原创 软件构造 4-2 Construction for Reuse

4.2 面向复用的软件构造技术

2020-06-28 21:55:54 285

原创 软件构造 7-3 Locks and Synchronization

7.3 锁与同步一. 同步  程序员来负责多线程之间对 mutable 数据的共享操作,通过“同步”策略,避免多线程同时访问数据。  锁的实质是把一系列操作组合成一个原子操作。使用锁机制,获得对数据的独家 mutation 权,其他线程被阻塞,不得访问。二. 锁  Lock 是 Java 语言提供的内嵌机制。每个 object 都有相关联的 lock 。使用以下方式加锁:synchronized (lock) { // thread blocks here until lock is free

2020-06-23 23:00:59 209

原创 软件构造 7-2 Thread Safety

7.2 线程安全一. 线程安全的定义  线程之间的“竞争条件”(race condition):作用于同一个 mutable 数据上的多个线程,彼此之间存在对该数据的访问竞争并导致 interleaving ,导致 post condition 可能被违反,这是不安全的。  线程安全: ADT 或方法在多线程中要执行正确不违反 spec 、保持 RI与多少处理器、OS 如何调度线程,均无关不需要在 spec 中强制要求 client 满足某种“线程安全”的义务  迭代器 Iterator

2020-06-23 20:33:41 183

原创 软件构造 7-1 Concurrency

7.1 并发一. 并发性程序  并行是同一 CPU 上的并发执行,并发是指多个任务在时间上有重叠,这 n 个任务称为并发地执行,其概念与处理器等概念、数目无关。  并发程序的通信,共有以下两种方式:共享内存:在程序使用的内存中读写共享数据,只适合用于线程,不能用于进程。两个处理器,共享内存同一台机器上的两个程序,共享文件系统同一个 Java 程序内的两个线程,共享 Java 对象消息传递:通过 channel 交换消息。网络上的两台计算机,通过网络连接通讯浏览器和 We

2020-06-22 22:31:44 217

原创 软件构造 6-4 Debugging

6.4 代码调试一. Bug 与 Debug  DeBug 的方法(优先选上面一种方法):  Debug 是保证程序质量(之前是防御式编程、测试,并且其与前两者均不是最影响程序质量的核心手段)或修复程序错误的最后一个手段。  Debug 的目的是寻求错误的根源并消除它。但 debug 会占用大量的时间。  Debug 是测试的后续步骤:测试发现问题, debug 消除问题。  Debug 是困难的:“症状”和“原因”可能相隔很远,高耦合导致的结果当其他 bug 被修复后,该 bug 消

2020-06-19 21:09:14 216

原创 软件构造 6-3 Assertions and Defensive Programming

6.3 断言与防御式编程一. 断言 assert  首先要遵循:以尽量不要引入 bug 的原则(防御式编程)编程。静态检查动态检查不可变类型不可变值不可变引用  若无法避免,缩小 bug 的范围:限定在一个方法内部,不扩散尽快失败,就容易发现、越早修复  断言就是一种 fail fast,避免 bug 的扩散。1. assertion  断言:在开发阶段的代码中嵌入,检验某些“假设”是否成立。若成立,表明程序运行正常,否则表明存在错误。public class Asse

2020-06-16 21:12:07 212

原创 软件构造 6-2 Error and Exception Handling

6.2 错误与异常处理一. 异常的分类  分为 Exception 和 Error,在类 java.lang.Throwable 的子类 java.lang.Exception 和 java.lang.Error 中。Error:出现的错误不是由程序引起的,如内存不够用等外部环境引起的错误。内部错误:程序员通常无能为力,一旦发生,想办法让程序优雅的结束。Exception :程序引起的错误。分为程序的本身错误(程序员引起的,RuntimeException)以及调用时错误(其他类型的异常,指cl

2020-05-31 23:31:32 212

原创 软件构造 6-1 Robustness and Correctness

6-1 健壮性与正确性一. 健壮性  1. 健壮性:系统在不正常输入或不正常外部环境下仍能够表现正常的程度。  2. 面向健壮性编程有以下特征:处理未期望的行为和错误终止即使终止执行,也要准确 / 无歧义的向用户展示全面的错误信息错误信息有助于进行 debug  3. Postel’s Law总是假定用户恶意、假定自己的代码可能失败把用户想象成白痴,可能输入任何东西。此时返回给用户的错误提示信息要详细、准确、无歧义  对自己的代码要保守,对用户的行为要开放。  4. 健壮性实现

2020-05-30 21:22:28 248

原创 软件构造 4-1 Metrics, Morphology and External Observations of Reusability

4.1 可复用性的度量、形态与外部表现一. 设计模式与软件可复用性  

2020-05-01 23:08:41 231

原创 软件构造 2-2 Process, Systems, and Tools of Software Construction

2.2 软件生命周期与配置管理一.

2020-05-01 20:33:57 289

原创 第四章 分治策略 4.2 矩阵乘法的 Strassen 算法

4.2 矩阵乘法的 Strassen 算法一.  若 A=(aij)A = (a_{ij})A=(aij​) 和 B=(bij)B = (b_{ij})B=(bij​) 是 n×nn\times nn×n 的方阵,则对 i,j=1,2,...,ni, j = 1, 2, ..., ni,j=1,2,...,n ,定义乘积 C=A⋅BC = A\cdot BC=A⋅B 中的元素 cijc_{ij...

2020-04-26 15:44:27 534

原创 第四章 分治策略 4.1 最大子数组问题

4.1 最大子数组问题一.  分治策略中,递归地求解一个问题,在每层递归中应用如下三个步骤:分解 步骤将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小。解决 步骤递归地求解出子问题。如果子问题的规模足够小,则停止递归,直接求解。合并 步骤将子问题的解组合成原问题的解。  当子问题足够大,需要递归求解时,我们称之为递归情况。当子问题变得足够小,不再需要递归时,我们说递归...

2020-04-24 00:47:55 443

原创 软件构造 1-2 Quality Objectives of Software Construction

1.2 软件构造的质量目标一. 软件系统的质量特性  外部质量因素:质量,如速度或易用性,其存在或不存在于软件产品中可能被其用户检测到。(外部质量因素影响用户)  内部质量因素:模块化或可读性等,只有能够访问实际软件文本的开发人员才能察觉。(内部质量因素影响软件本身和它的开发者)  最终,只有外部因素起作用。但是,实现这些外部因素的关键在于内部因素:为了让用户享受可见的质量,设计者和实现者...

2020-04-22 00:50:40 245

原创 软件构造 3-5 Equality in ADT and OOP

3.5 ADT 和 OOP 中的 等价性一. 相等1. 抽象函数  由于抽象函数是 AF:R→AAF:R\rightarrow AAF:R→A将具体的表示数据映射到了抽象的值。如果 AF(a)=AF(b)AF(a)=AF(b)AF(a)=AF(b)我们说 a 和 b 相等。2. 等价关系  对于关系 E⊆T×TE\subseteq T\times TE⊆T×T ,它满足:自反性:E(...

2020-04-20 00:37:51 245

原创 软件构造 3-4 Object-Oriented Programming (OOP)

3.4 面向对象的编程一. 接口  Java 中的 interface(接口)是一种表示抽象数据类型的好方法。接口中是一连串的方法标识,但是没有方法体(定义)。如果想要写一个类来实现接口,我们必须给类加上 implements 关键字,并且在类内部提供接口中方法的定义。所以接口+实现类也是 Java 中定义抽象数据类型的一种方法。  优点:接口只为使用者提供“契约”。实例化的变量不能放在...

2020-04-15 12:35:51 190

原创 软件构造 6-5 Testing and Test First Programming

6.5 软件测试与测试优先的编程一. 软件测试1. 验证的种类  为了发现程序中的问题,我们需要做一下工作,他们均属于验证:形式推理:通过理论推导证明程序的正确性。而形式推理目前还缺乏自动化的工具,通常需要漫长的手工计算。但一些关键性的步骤也得证明,例如操作系统的调度程序、虚拟机里的字节码解释器,或者是文件系统。代码审查:即让别人仔细地阅读、审校、评价你的代码。测试:选择合适的输入输...

2020-03-31 23:53:27 229

原创 软件构造 3-3 Abstract Data Type (ADT)

3.3 抽象数据类型(ADT)一.  抽象数据类型与表示独立性: 如何设计良好的抽象数据结构,通过封装来避免客户端获取数据的内部表示(即“表示泄露”),避免潜在的 bug 在 client 和 implementer 之间建立“防火墙”。ADT 的特性:表示泄漏、抽象函数 AF 、表示不变量 RI基于数学的形式对 ADT 的这些核心特征进行描述并应用于设计中。二. Abstract...

2020-03-24 15:33:23 361

原创 软件构造 3-2 Designing Specification

3.2 设计规约一.方法的规约前置 / 后置条件欠定规约、非确定规约陈述式、操作式规约规约的强度及其比较如何写出好的规约二. Functions & methods in programming languages 方法的规约  参数类型是否匹配,在静态类型检查阶段完成。  返回值类型是否匹配,也在静态类型检查阶段完成。  “方法”是程序的“积木”,可以被独立开发...

2020-03-20 15:30:28 287

原创 第四章 分治策略 4.6 证明主定理

4.6 证明主定理一.1.  当我们在一个局限的值域上使用渐近符号时,必须要时刻小心,避免得到错误的结论。例如:对 nnn 是 222 的幂的情况证明 T(n)=O(n)T(n)=O(n)T(n)=O(n) 并不保证 T(n)=O(n)T(n)=O(n)T(n)=O(n) 。函数 T(n)T(n)T(n) 可能是这样定义的:T(n)={n若 n=1,2,4,8,...n2其他T(...

2020-03-17 21:46:48 741

原创 软件构造 3-1 Data Type and Type Checking

3.1 数据类型与类型检验一. Data type in programming 数据类型languages  分类:基本数据类型、面向对象的数据类型。PrimitivesObject Reference Typesint,long,byte,short,char,float,double,booleanClasses,interfaces,arrays,enums,...

2020-03-17 15:32:38 311

原创 第四章 分治策略 4.5 用主方法求解递归式

4.5 用主方法求解递归式一.1.主定理  令 a≥1a≥1a≥1 和 b>1b>1b>1 是常数, f(n)f(n)f(n) 是一个函数, T(n)T(n)T(n) 是定义在非负整数上的递归式: T(n)=aT(bn)+f(n)T(n)=aT(\frac{b}{n})+f(n)T(n)=aT(nb​)+f(n)  其中我们将 b/nb/nb/n 解释为 ⌊n/b⌋\lfl...

2020-03-13 00:32:46 1032

原创 第四章 分治策略 4.4 用递归树方法求解递归式

4.4 用递归数方法求解递归式一.1.  在递归树中,每个结点表示一个单一子问题的代价,子问题对应某次递归函数调用。我们将树中每层中的代价求和,得到每层代价,然后将所有层的代价求和,得到所有层次的递归调用的总代价。  递归树最适合用来生成好的猜测,然后即可用代入法来验证猜测是都正确。当使用递归树来生成好的猜测时,常常需要忍受一点儿“不精确”,因为稍后才会验证猜测是否正确。如果在画递归树和代...

2020-03-11 22:16:21 2999

原创 软件构造 2-1 Software Lifecycle and Configuration Management

2.1 软件生命周期与配置管理一.1.1. Software Development Lifecycle(SDLC) 软件的生命周期1.1.1 软件的版本 从有到好  软件的变化导致软件生成周期的变化(如:图中黑色线的变化)。1.1.21.2 Traditional Software process models 传统软件开发模型  两种类型:线性过程(按部就班:编写、测试、修...

2020-03-10 16:08:30 246

原创 第四章 分治策略 4.3 用代入法求解递归式

4.3 用代入法求解递归式一.1. 代入法1.1  代入法 求解递归式分为两步:  1. 猜测解的形式。  2. 用数学归纳法求出解中的常数,并证明解是正确的。1.2  数学归纳法要求我们证明解在边界条件下也成立。为证明这一点,我们通常证明对于归纳证明,边界条件适合作为基本情况。1.3 微妙的细节  才出了递归式解的渐近界,但在归纳证明时失败。问题常常在于归纳假设不够强,无法证...

2020-03-09 15:39:07 819

原创 软件构造 1-1 Multi-Dimensional Views of Software Construction

1.1 软件构造过程中的多维度视图 一.1.1 Multi dimensional software views  Multi dimensional software viewsBy phases: build and run time viewsBy dynamics: moment and period viewsBy levels: code and component vi...

2020-03-08 16:32:21 267

原创 第三章 函数的增长 3.2 标准记号与常用函数

3.2 标准记号与常用函数一.1.单调性  若 m ≤ n 蕴含 f(m) ≤ f(n),则函数 f(n) 是单调递增的。类似地,若 m ≤ n 蕴含 f(m) ≥ f(n),则函数 f(n) 是单调递减的。若 m < n 蕴含 f(m) < f(n),则函数 f(n) 是严格递增的。若 m < n 蕴含 f(m) > f(n),则函数 f(n) 是严格递减的。2....

2020-03-07 18:03:11 449

原创 第三章 函数的增长 3.1 渐进记号

3.1 渐进记号一.1.引言  当输入规模足够大时,使得只有运行时间的增长量级有关时,我们要研究算法的渐进效率。也就是说,我们关心当输入规模无限增加时,在极限中,算法的运行时间如何随着输入规模的变大而增加。通常,渐进地更有效的某个算法对除很小的输入外的所有情况将是最好的选择。2.定义  用来描述算法渐进运行时间的记号根据定义域为自然数集N = {0, 1, 2, …}的函数来定义。  ...

2020-03-02 00:30:07 758

原创 第二章 算法基础 2.3 设计算法

2.3 设计算法一. 分治法

2020-02-26 23:15:19 296

原创 回文数

LeetCode9. 回文数  判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。  示例 1:输入: 121输出: true  示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。  示例 3:输入: 10输出: false解释: 从右向左读, ...

2020-02-09 10:44:44 223

原创 字符串转换整数 (atoi)

LeetCode8. 字符串转换整数 (atoi)  请你来实现一个 atoi 函数,使其能将字符串转换成整数。  首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。  当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。  ...

2020-02-08 11:40:59 92

原创 整数反转

LeetCode 7. 整数反转  给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。  示例 1:输入: 123输出: 321   示例 2:输入: -123输出: -321  示例 3:输入: 120输出: 21  注意:  假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,...

2020-02-07 21:06:37 100

原创 Z 字形变换

LeetCode 6.Z 字形变换  将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。  比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:L C I RE T O E S I I GE D H N  之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。...

2020-02-06 12:36:27 121

原创 Helpful Maths

Codeforces 339A. Helpful Mathstime limit per test: 2 secondsmemory limit per test: 256 megabytesinput: standard inputoutput: standard output  Xenia the beginner mathematician is a third year stud...

2020-02-05 20:51:09 166

原创 Football

Codeforces 96A. Footballtime limit per test: 2 secondsmemory limit per test: 256 megabytesinput: standard inputoutput: standard output  Petya loves football very much. One day, as he was watching...

2020-02-05 20:41:14 188

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除