Coding in life...

a litter inspiration


  • Home

  • Categories

  • Archives

  • Tags

  • Search

句子的形成-动词的种类及其用法

Posted on 2018-12-01 | In 英语语法

第二节 动词的种类及其用法

概述:

  1. 动词(verb)基本上可以分为五大类:

    • 完全不及物动词:
      • complete intransitive verb 简写:c. vi.
    • 不完全不及物动词:
      • incomplete intransitive verb 简写 i. vi.
    • 完全及物动词:

      • complete transitive verb 简写: c. vt
    • 不完全及物动词:

      • incomplete transitive verb 简写: i. vt.
    • 授予动词:

      • dative verb 简写:d.v.

英语中基本句型就是按此五大动词分类

  1. 如何判断完全不及物动词

所有都可以套用这个,所有的英语动词都可以放入下面的空格,翻译成中文后,意思若无毛病,就是及物动词,否则就是不及物动词

- 我 ____ 他  (主动)
- 他被我 _____ (被动)
  1. 兼作机务与不及物动词之常用动词:

    • 例如: sing

      • vt 唱(一首歌)
      • vi 唱歌
  2. 不及物动词可作及物动词,用同系名词作其宾语

    • dream
      • vi 做梦
      • vt 做(梦)
      • dream a terrible dream
    • live

      • vi 生活
      • vt 过(生活)
      • live a happy life
  3. 完全及物动词与完全不及物动词:

    • 完全及物动词

      • 加了宾语之后,意思才能完全的动词。
      • He killed her
    • 不完全及物动词

      • 及不需要加宾语,意思就很完全的动词
      • He laughed
  4. 完全及物动词出现的形态:

    • 主语 + 及物动词 +宾语
      • He wrote a book
    • 主语 + be动词 + 及物动词的现在分词 + 宾语

      • 本句型用以表示动作正在进行的主动状态
      • He was writing a book
    • 主语 + be动词 + 过去分词(Past participle,简称p.p.)
      • 本句型用以表示被动的概念
      • The book was written by him
    • 主语 + be动词 + being + 过去分词

      • 本句型用以表示某动作正在进行的被动状态
      • A book was being written by him
  5. 完全不及物动词出现的形态:

    • 主语 + 不及物动词

      • Something happened
    • 主语 + be动词 + 不及物动词的现在分词

      • 本句型用以表示某动作正在进行的状态
      • Something was happening
      • Something was happened (X)

        注意: happen是不及物动词,故无被动语态

    1. 完全不及物动词,就是意思很完整的不及物动词
      • Something happened
      • He died
    2. 但完全不及物动词之后,可接副词(adverb , 简写成adv)或副词对等语(如介词短语、状语从句等),以修饰该动词。
      • Something happened yesterday(adv)
      • He died in an accident(介词短语)
      • He left because he didn’t want to see Mary again
  6. 不完全不及物动词:(系动词)

    这类动词(简写成i.vi即系动词)意思不完全,因而无法单独存在,之后要接名词、形容词或名词对等语(如代词、动名词、不定式、名词性从句、名词短语等)以补充其意思的不足。我们称作表语(subjective complement, 简称s.c.)

    • He looks happy
    • He became a good student
    • My trouble is that i have no money(名词性从句)
    • He is in danger now (介词短语)
  7. 不完全不及物动词的判断方法:

    • 不完全不及物动词的判断方法
  8. 不完全不及物动词的种类及其表语的用法:
  9. 不完全不及物动词的重要相关短语:
  10. 完全及物动词:
  11. 完全及物动词的用法:
  12. 不完全及物动词:
  13. 不完全及物动词的分类及用法:
  14. 授予动词:
  15. 间接宾语与直接宾语倒置原则:
  16. 与of连用的授予动词:
  17. 表提供的授予动词:
  18. 其他补充要点

架构02-架构设计的目的

Posted on 2018-12-01 | In 从零开始学架构

软件架构

随着软件系统规模的增加,计算相关的算法和数据结构不再构成主要的设计问题:当系统由许多部分组成时,整个系统的组织,也就是所说的“软甲架构”,导致了一系列新的设计问题。

只有规模较大的软件系统才会面临软件架构相关的问题,比如:

  • 系统规模庞大,内部耦合严重,开发效率低;
  • 系统耦合严重,牵一发动全身,后续修改和扩展困难;
  • 系统逻辑复杂,容易出问题,出问题后很难排查和修复。

架构设计的目的

架构设计的误区

  • 因为架构很重要,所以要做架构设计 (正确的废话)
    • 例如:不做架构设计系统就跑不起来了吗?
    • 例如:做了架构设计就能提示开发效率么?
    • 例如:设计良好的架构能促进业务发展吗?
  • 不是每个系统都要做架构设计吗
    • 例如:强行架构
  • 公司流程要求系统开发过程中必须有架构设计
  • 为了高性能、高可用、可扩展,所以要做架构设计
    • 根据业务或者系统,盲目就一定是有大问题的。

架构设计的真正目的

一条准则,也可以说是一个原则

架构设计的目的是为了解决软件系统复杂度带来的问题

明确了架构设计的目的是为了解决软件系统复杂度带来的问题,就能回答下述问题:

  • 这么多需求,从哪里开始下手进行架构设计呢?

    • 通过熟悉和理解需求,识别系统复杂性所在的地方,然后针对这些复杂点进行架构设计
  • 架构设计要考虑高性能、高可用、高扩展…这么多高XX,全部设计完成估计要一个月,但老大只给了一周时间。

    • 架构设计并不是面面俱到,不需要每个架构都具备高性能、高可用、高扩展等特点,而是要识别出复杂点然后又针对性地解决问题
  • 业界A公司的架构师X,B公司的方案是Y,两个差别比较大,该参考那一个呢?

    • 理解每个架构方案背后所需要解决掉复杂点,然后才能对比自己的业务复杂点,参考复杂点相似的方案。

遵循这条准则。能够让架构师“有的方矢,而不是贪大求全”

  • 我们的系统一定要做到每秒TPS 10万

    • 如果系统的复杂度不是在性能这部分,TPS做到10万并没有什么用。
  • 淘宝的架构师这么做的,我们也这么做

    • 淘宝的架构是为了解决淘宝业务的复杂度而设计的,淘宝的业务复杂度而设计的,淘宝的业务复杂度并不就是我们的业务复杂度,绝大多数业务的用户量都不可能有淘宝那么大。
  • Docker现在很流行,我们的架构应该将Docker应用进来

    • Docker不是万能的,只是为了解决资源重用和动态分配而设计的,如果我们的系统复杂度根本不是在这方面,引入Docker没有什么意义。

简单的复杂度分析案例

一起来看看如何将“架构设计的真正目的就是解决软件系统复杂度带来的问题”

简单的案列:设计一个大学的学生管理系统

  • 基本功能
    • 登录
    • 注册
    • 成绩管理
    • 课程管理
    • 等

当我们对这样一个系统进行架构设计的时候,首先应识别其复杂度到底体现在哪里

性能:

学生1-2万人,访问系统频率不高,平均每天单个学生访问量不到一次,存储使用MySQL完全足够,缓存都可以不用,Web服务器用Nginx完全足够

可扩展性:

学生管理系统的功能比较稳定,可扩展的空间并不大,因此可扩展性也不复杂

高可用:

学生管理系统即使宕机2小时,对学生管理系统工作影响并不大,因此可用不做负载均衡,更不用考虑异地多活这类复杂的方案了。但是,如果学生的数据全部丢失,修复是非常麻烦的,只能靠人工逐条修复,这个很难接受。
因此需要考虑存储高可靠,这里就有点复杂了。我们需要考虑多种异常情况:机器故障,机房故障,针对机器故障,我们需要设计MySQL同机房主备方案;针对机房故障,我们需要设计MySQL跨机房同步方案。

安全性

学生管理系统存储的信息有一定的隐私性,例如学生的家庭情况,但并不是和金融相关的,也不包含强隐私(例如玉照。。)的信息,因此安全信只要做三个事情就满足了,
Nginx提供的ACL控制、用户账号密码管理,数据库访问权限控制。    

成本:

系统很简单,基本上几台服务器就能够搞定,无需过多关注。

还有其他方面,这个分析下来,这个方案的主要复杂性体现在存储可靠性上,需要保证异常的时候,不要丢失所有数据即可(丢失几个或几十个学生信息问题不大)

Python_study_record

Posted on 2018-11-30 | In python

Python如何运行程序

Python解释器简介

  • 从目前的实现上来讲,Python也是一个名为解释器的软件包
  • 解释器是一种让其他程序运行起来的程序
  • 解释器就是代码与机器的计算机硬件之间的软件逻辑层
  • 当Python包安装在机器上后,它包含了一些最小化的组件:一个解释器和支持的库

Python虚拟机(PVM)

  • python编译成的字节码,在PVM上执行
  • PVM不是一个独立的程序,bu’xu’yao

Untitled

Posted on 2018-11-27

title: Vim常用快捷键
date: 2018-11-27 12:49:03
tags: shortcut

categories: Vim

Vim按键说明

注意:按钮是大小写分明的,字母大写或小写具有不同的功能。

在描述快捷键之前,先描述一下这三种模式,因为这个能更好的理解相应的快捷键。

vim三种模式简述

  • 一般模式

    • 这个模式就是用键盘快捷键的模式 (最重要的一个模式)
  • 编辑模式

    • 这个模式就是在一般模式下,按下了i,o..(注:大小写都行,效果相反)其中一个键之后,进入可以编辑的模式
  • 命令行模式

    • 一般模式下,按下 “/”或者 “:” 之类的,在编辑器的最底层会有一行显示,也再此操作

注意:只有一般模式可以与编辑或者命令行模式切换,编辑模式和命令行模式是不可以切换

第一部分:一般模式下的按键说明

在一般模式下可用的按钮说明,光标移动,复制粘贴,查找替换等

移动光标的方法

  • h或左键头

    • 向左移动一个字符
  • j或下箭头

    • 向下移动一个字符
  • k或上箭头

    • 向上移动一个字符
  • l或右箭头

    • 向右移动一个字符

技巧提示:
如果想要进行多次移动的话

(列如:向下移动30行)

可以使用30j 或者 30下箭头

  • ctrl + f

    • 向下翻一页
  • ctrl + b

    • 向上翻一页
  • +

    • 光标移动到非空格符的下一行
  • -

    • 光标移动到非空格符的上一行
  • n\

    • n表示数字,后面是空格,例如20\,光标会想后面移动20个字符距离
  • 0或功能键【Home】

    • 这是数字0,移动到这一行的最前面字符处
  • $或功能键【End】

    • 移动到这一行的最后面字符处
  • H

    • 光标移动到这个屏幕的最上方那一行的一个字符
  • M

    • 光标移动到这个屏幕的中央那一行的第一个字符
  • L

    • 光标移动到这个屏幕的最下方那一行的第一个字符
  • G

    • 光标移动这个文件的最后一行
  • nG

    • n为数字,移动到这个文件的第n行 //可以配合:set nu (显示行号)
  • gg

    • 移动到这个文件的第一行 ,相当于1G
  • N【Enter】

    • N为数字,光标向下移动n行

查找与替换

  • /word

    • 向下寻找一个名称为word的字符串
  • ?word

    • 向上寻找一个名称为word的字符串
  • n

    • 代表重复前一个操作。比如查找了一个word,又点击了一次,就是查找下一个word
  • N

    • 相反的,向上查找word

技巧小提示:

使用/word配合n或者N是非常有帮助的,可以查找重复的关键字

  • n1,n2s/word1/word2/g

    • n1,n2为数字。在第n1与n2行之间寻找word1这个字符串,并将该字符串替换为word2.
  • :1,$s/word1/word2/g

    • 从第一行到最后一行查找word1字符串,并将该字符串替换为word2
  • :1,$s/word1/word2/gc

    • 和上面一样,只是多了一步,替换前显示提示字符给用户确认(confirm)是否需要替换

删除,复制与粘贴

  • x,X

    • 在一行字当中,x为向后删除一个字符(相当于[Del]键),X为向前删除一个字符(相当于[Backspace])
  • nx

    • n为数字,向后删除n个字符
  • dd

    • 删除光标所在的整行
  • ndd

    • n为数字,删除光标所在的向下n行
  • d1G

    • 删除光标所在到第一行的所有数据
  • dG

    • 删除光标所在到最后一行的所有数据
  • d$

    • 删除从光标所在处到该行的最后一个字符
  • d0

    • 删除从光标所在处到该行的最前面的一个字符
  • yy

    • 复制光标所在的哪一行
  • nyy

    • n为数字,复制光标所在的向下n行
  • y1G

    • 复制光标所在行到第一行的所有数据
  • yG

    • 复制光标所在行到最后一行的所有数据
  • y0

    • 复制光标所在的那个字符到该行行首的所有数据
  • y$

    • 复制光标所在的那个字符到该行行尾的所有数据
  • p,P

    • p为将已复制的数据在光标下一行粘贴,P则为粘贴在光标上一行
  • J

    • 将光标所在行与下一行的数据结合成同一行
  • u

    • 复原前一个操作
  • ctrl + r

    • 重做上一个操作
  • .

    • 不要怀疑。这就是小数点。意思是重复前一个操作的意思。如果你想要重复删除,重复粘贴等。

第二部分:一般模式切换编辑模式

进入插入或替换的编辑模式

  • i,I

    • 进入插入模式(insert mode)
    • i为从目前光标处插入,I为在目前所在行的第一个非空格符处开始插入
  • a,A

    • 进入插入模式(insert mode)
    • a为从目前光标所在的下一个字符处开始插入,A为从光标所在行的最后一个字符处开始插入
  • o,O

    • 进入插入模式(insert mode)
    • o为在目前光标的所在的下一行处插入新的一行;O为在目前光标所在处的上一行插入新的一行。
  • r,R

    • 进入替换模式 (Replace mode)
    • r只会替换光标所在的哪一个字符一次;R会一直替换光标所在的文字,直到按下【Esc】键为止

注意:上面这些按键中,在vi界面的左下角会出现“–INSERT–”或“–REPLEACE”的字样。如果我们想要在文件中输入字符时,也就是在编辑模式中,一定会有上述这两种提示。

  • [Esc]

    • 退出编辑模式,回到一般模式中;

第三部分:一般模式切换到命令行模式

命令行的保存、离开等命令

  • :w

    • 将编辑的数据写入硬盘文件中
  • :q

    • 离开vi
  • :q!

    • 若曾经修改过文件,又不想存储,使用“!”为强制离开不保存文件

注意:感叹号(!),在vi中经常都是强制的意思

  • :wq

    • 保存后离开
  • :w[fileName]

    • 将编辑的数据保存成另一个文件(类似于另存为)
  • :! command

    • 暂时离开vi到命令行模式下执行command的显示结果
  • :set nu

    • 显示行号,设置之后,会在每一行的前缀显示该行的行号

注意:在vi中,数字是很有意义的,数字通常代表重复做几次的意思,也有可能是代表去到第几个什么什么的意思。

例如:要删除50行, 50dd
向下移动30行, 30j

第六章-存储器层次结构

Posted on 2018-11-26 | In 《深入理解计算机系统》

概述:

前面学习的都是依赖于一个简单的计算机系统模型,CPU执行指令,而存储器系统为CPU存放指令和数据。在简单模型中,存储器系统是一个线性的字节数组,而CPU能够在一个常数时间内访问每个存储器位置。虽然迄今为止这都是一个有效的模型,但是它没有反映现代系统实际工作的方式。

实际上,存储器系统(memory system)是一个具有不同容量、成本和访问时间的存储设备的层次结构。

  • L0 CPU寄存器保存着最常用的数据。
  • L1 靠近CPU的小的、快速的高速缓存存储器(cache memory)作为一部分存储在相对慢速的主存储器(main memory)中数据和指令的缓冲区域。主存缓存存储在容量较大的、慢速磁盘上大数据,而这些磁盘常常又作为存储在通过网络连接的其他机器的磁盘或磁带上的数据的缓冲区域。

计算机系统中一个基本持久的思想:使数据项存储在层次结构中较高的地方,在哪里CPU能更快地访问到它们。

这种思想围绕着计算机程序的一个称为局部性(locality)的基本属性。具有良好局部性的程序倾向于一次又一次地访问相同的数据项集合

6.1存储技术

6.1.1 随机访问存储器

随机访问存储器(Random-Access Memory,RAM)分为两类:静态的和动态的。静态RAM(SARM)比动态的(DRAM)更快,但也贵很多。SRAM用来作为高速存储器,既可以在CPU芯片上,也可以在片下。DRAM用来作为主存以及图形系统的帧缓冲区。典型地,一个笔记本,SRAM不会操过几兆字节。

  1. 静态RAM

SRAM将每个位存储在一个双稳态的(bistable)存储器单元里。每个单元是用一个六晶体管电路来实现的。

SRAM存储器单元有双稳态特性,只要有电,它就会永远地保持它的值。

  1. 动态RAM
  1. 传统的DRAM

  2. 内存模块

  • DRAM芯片封装在内存模块,通过将多个内存模块链接到内存控制器,能够聚合成主存
  1. 增强的DRAM

  2. 非易失性存储器

如果断电,DRAM和SRAM会丢失它们的信息,从这个意义上来书,它们是(volatile, 挥发性的)。
非易失性存储器(novolatile memory)即使是在关电后,仍然保存着它们的信息

ROM,其中有的类型可以读也可以写,但是它们整体上都被称为(Read-Only Memory, ROM)。ROM是以它们能够被重编程(写)的次数和它们对进行重编所用的机制来区分的

闪存(flash memory)是一类非易失性存储器。

  • SSD,一种新型的基于闪存的磁盘驱动技术,称为固态硬盘(Solid State Disk, SSD)

存储在ROM设备中的程序通常被称为(firmware)固件。当一个计算机系统通电以后,它会运行存储在ROM中的固件。

- 一些系统在固件中提供了少量的基本的输入和输出函数--例如PC的BIOS(基本输入/输出系统)例程。
  1. 访问主存

数据流通过称为总线(bus)的共享电子电路在处理器和DRAM主存之间来来回回。

每次CPU和主存之间的数据传送都是通过一系列步骤来完成的,这些步骤称为总线事物(bus transaction)。读事物(read transaction)从主存传送数据到CPU。写事物(write transaction)从CPU传送数据到主存

一个计算机系统的配置(主要部分)

  • CPU芯片
  • I/O桥接器(I/O bridge)的芯片组(其中包括内存控制器)
  • 以及组成主存的DRAM内存模块

这些部件由一对总线连接起来,其中一条总线是系统总线(system bus),它连接CPU和I/O桥接器,另一条总线是内存总线(memory bus),它连接I/O桥接器和主存。I/O桥接器将系统总线的电子信号翻译成内存总线的电子信号。

6.1.2 磁盘存储

  1. 磁盘构造
    磁盘是由盘片(platter)构成的。每个盘片有两面或者称为表面(surface),表面覆盖着磁性记录材料。盘片中央有一个可以旋转的主轴(spindle),它使得盘片以固定的旋转速率(rotational rate)旋转,通常是5400-15000转每分钟(Revolution Per Minute, RPM)。磁盘通常包含一个或多个这样的盘片,并封装在一个密封的容器类

  2. 磁盘容量

  3. 磁盘操作

  4. 逻辑磁盘块
  5. 连接I/O设备

例如图形卡、监视器、鼠标、键盘和磁盘这样的输入/输出(I/O)设备,都是通过I/O总线,连接到CPU和主存的。

虽然I/O总线比系统总线和内存总线慢,但是它可以容纳种类繁多的第三方I/O设备。

  • 通用串行总线(Universal Serial Bus,USB)控制器是一个连接到USB总显得设备的中转机构,USB总显示一个广泛使用的标准,连接各种外围I/O设备。
  • 图形卡(或适配器)包含硬件和软件逻辑,它们负载代表CPU在显示器上画像素。
  • 主机总线适配器将一个或多个磁盘连接到I/O总线,使用的是一个特别的主机总线接口定义的通信协议。
  1. 访问磁盘
    设备可以自己执行读或者写总线事物而不需要CPU干涉的过程,称为直接内存访问(Direct Memory Access,DMA)。这种数据传送称为DMA传送🤩(DMA transfer)

    6.1.3 固态硬盘

6.1.4 存储技术趋势

6.2 局部性

6.2.1 对程序数据引用的局部性

6.2.2 取指令的局部性

6.2.3 局部性小结

6.3 存储器层次结构

6.3.1 存储器层次结构中的缓存

一般而言,高速缓存(cache,读作‘cash’)是一个小而快速的存储设备,它作为存储在更大、也更慢的设备中的数据对象的缓冲区域。使用高速缓存的过程称为缓存(caching,读作‘cashing’)

6.3.2 存储器层次结构概念小结

6.4 高速缓存存储器

6.4.1 通用的高速缓存存储器组织结构

6.4.2 直接映射高速缓存

6.4.3 组相联高速缓存

6.4.4 全相联高速缓存

6.4.5 有关写的问题

6.4.6 一个真实的高速缓存层次结构的解剖

6.4.7 高速缓存参数的性能影响

6.5 编写高速缓存友好的代码

6.6 综合:高速缓存对程序性能的影响

6.6.1 存储器山

一个程序从存储系统中读数据的速率称为读吞吐量(read throughput),或者有时称为(read bandwidth)。

6.6.2 重新排列循环以提高空间局部性

6.6.3 在程序中利用局部性

ARTS-第二周挑战

Posted on 2018-11-25 | In ARTS
  1. Algorithm:每周至少做一个 leetcode 的算法题

    reverse linked list(翻转链表)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null)
return head;
List<ListNode> tempList = new ArrayList<ListNode>();
reverseList(head,head.next,tempList);
return tempList.get(0);
}

public static ListNode reverseList(ListNode currentNode, ListNode nextNode,List objList) {
ListNode changedNextNode;

if (nextNode.next == null) {
objList.add(nextNode);
changeNodeOrder(currentNode,nextNode);
return currentNode;
} else {
changedNextNode = reverseList(nextNode, nextNode.next,objList);
}

changeNodeOrder(currentNode, changedNextNode);
return currentNode;

}

public static void changeNodeOrder(ListNode prevNode, ListNode nextNode) {
nextNode.next = prevNode;
prevNode.next = null;
}
}
  1. Review:阅读并点评至少一篇英文技术文章

    自己翻译练习的Effective Java (注:翻译水平很有限,欢迎大家指正),第二篇未完待续。。。

    Effective Java Item01_静态工厂方法

  2. Tip:学习至少一个技术技巧

    英语语法句子的形成名词作主语

  3. Share:分享一篇有观点和思考的技术文章

    架构01_架构到底指什么

算法系列

Posted on 2018-11-25

以后不管干什么,都必须从宏观入手

这次算法&数据结构的学习,和我以前学习的方式不太一样了,不在是抱着一本书,从前往后看,而是立下自己要学习的目标。反过去从书中学,网上学,不在是书指导我的思维

我对于该知识学习的等级,越深入,所需时间是几何倍的增长。(所以需要自己掌握这个度)

  1. 宏观篇(有一个大体的了解,最少仅限于概念懂,最多看懂代码实现)
  2. 微观篇(不深入怎么能叫微观呢?最少有一个自己的实现,和一个完美的实现)
  3. 极致篇(多半我不会来这里,来了,就是死磕,不允许自己心中还有疑问)

眉毛胡子一把抓,是不行的,但下面这些是我必须掌握的

数据结构

线性表

  • 数组
  • 链表
    • 单链表
    • 双向链表
    • 循环链表
    • 双向循环链表
    • 静态链表
  • 栈
    • 顺序栈
    • 链式栈
  • 队列
    • 普通队列
    • 双端队列
    • 阻塞队列
    • 并发队列
    • 阻塞并发队列

散列表

  • 顺序散列
  • 冲突散列
    • 链表法
    • 开发寻址
    • 其它
  • 动态扩容
  • 位图

    树

  • 二叉树
    • 平衡二叉树
    • 二叉查找树
    • 平衡二叉查找树
    • 完全二叉树
    • 满二叉树
  • 多路查找树
    • B树
    • B+树
    • 2-3树
    • 2-3-4树
  • 堆
    • 小顶堆
    • 大顶堆
    • 优先级队列
    • 斐波那契堆
    • 二顶堆
  • 其它
    • 树状数组
    • 线段树

      图

  • 图的存储
    • 邻接矩阵
    • 邻接表
  • 拓扑排序
  • 最短路径
  • 关键路径
  • 最小生成树
  • 二分图
  • 最大流

算法

复杂度分析

  • 空间复杂度
  • 时间复杂度
    • 最好
    • 最坏
    • 平均
    • 均摊

基本算法思想

  • 贪心算法
  • 分治算法
  • 动态规划
  • 回溯算法
  • 枚举算法

排序

  • 时间复杂度:O(n^2)
  • 时间复杂度:O(nlogn)
  • 时间复杂度:O(n)

搜索

  • 深度优先搜索
  • 广度优先搜索
  • A*启发式搜索

查找

  • 线性表查找
  • 树结构查找
  • 散列表查找

字符串匹配

  • 朴素
  • KMP
  • Robin-Karp
  • Boyer-Moore
  • AC自动机
  • Trie
  • 后缀数组

    其它

  • 数论
  • 计算几何
  • 概率分析
  • 并查集
  • 拓扑网络
  • 矩阵运算
  • 线性规划

三年计划

Posted on 2018-11-24 | In 三年之约

就是约一下三年之后的自己

写这个的目的就是想看看三年之后,我都打基础的话,是不是一个美好的决定,基础永远是最有挑战性的。学习还是很简单的,一遍不会就…

我想要提升自己,以后计算机也会是我的爱好,所以我愿意三年来打基础,不追求最潮流的技术。当然如果能从英文官网上,学习一手资源,这个锻炼自己学习能的,我是大力支持的。

未来的三架马车

  • 核心永远是这三个地方,其它学习的时候,都没有这些重要,用到再去学习,想要学的时候学。其它时候一律搞我的三架马车
  1. 英语:三年后的自己,我想要的是自由游览英文网站,基本上和中文网站一样的感觉 (现在感觉达到一半了)
  2. 算法:
    • 这个玩意我需要写一个博客记录一下
    • 我要的算法就是常见的算法数据结构,不仅懂了,还要有手动实现。
    • 剑指offer搞定。
    • 每周一次的leetCode刷题。
    • 数据结构与算法之美。
    • 视频课,facebook带刷题。
  3. 计算机基础知识
    • 计算机操作系统
      • 深入理解操作系统(2遍肯定是需要的)
      • 现代操作系统
    • 网络
      • 计算机网络
      • 图解Http
      • 图解tcp/ip(可选)
      • 图解网络硬件(可选)
    • 数据库
      • mysql 必知必会
      • 网课mysql
      • 估计还有一门高性能xxx(可选)
    • linux系统
      • 鸟哥的私房菜
      • 关于一些性能调优的东西(可选)

- 语言(只是一门工具,但也可以划为一个系列了)
    - Java
    - Python
    - Go
    - C
    - JavaScript

读书

  1. 深入理解计算机操作系统 (现在正在啃)。完成日期:跟着刘大走
  2. 英语语法(每天至少一页,500页)。完成日期:2019/12/31
  3. Effective Java(每两周一项,90项)。完成日期:2020/12/31
  4. python 官网文档,(主要在于爬虫)我试试就在官网上弄这个,基础语法什么的就在官网上学了。
    • 运行一个最简单的爬虫。完成日期:2018/12/31
  5. Head Fist Servlet & JSP (这本书技术比较老了,但可以重看一遍)。完成日期:2018/12/31
  6. 算法
  7. 剑值Offer (算法面试系列)

数据类型的设计

Posted on 2018-11-24 | In 设计篇

####

概述(算法这本书就是很牛,记录看见的这个)
抽象数据类型是一种向用例隐藏内部表示的数据类型。这种思想真的很牛


封装

面向对象编程的特征之一就是使用数据类型的实现封装数据,以简化实现和隔离用例开发。封装实现了模块化编程。
它允许我们:

  • 独立开发用例和实现的代码;
  • 切换至改进的实现而不会影响用例的代码;
  • 支持尚未编写的程序(API能够起到指南的作用)

封装的同时也隔离了一致性检查等调试功能

  • 限制潜在的错误
  • 在实现中添加一致性检查等调试工具
  • 确保用例代码更明晰
  • 一个封装的数据类型可以被任意用例使用,因此它扩展了Java语言。
  • 提倡的编程风格是将大型程序分解为能够独立开发和调试的小型模块。这种方式将修改代码的影响限制在局部区域。改进软件的质量。它也促进了代码复用,因为我们可以用某种数据类型的新实现代替老的实现来改进它的性能、准确度或是内存消耗。
  • 同样的思想也使用与许多其它领域。
  • 我们在使用系统库时常常从封装收益。Java系统的新实现往往更新了多种数据类型或静态方法库的实现,但它们的API没有变化
  • 在算法和数据结构的学习中,我们总是希望开发出更好的算法,因为只需用抽象数据类型的改进实现替换老的实现即可在不改变任何用例代码的情况下改进所有用例的性能
  • 模块化编程成功的关键在于保持模块之间的独立性。
  • 坚持将API作为用例和实现之间唯一的依赖点(这个地方就非常牛了,我估计为什么会有敏捷开发模式,跟这种思想肯定是有很大的一致性)

并不需要知道一个数据类型是如何实现的才能使用它,实现数据类型时也应该假设使用者除了API什么也不知道。(封装的这种思想真的是非常非常牛)


设计API

  • 构建现代软件最重要也最有挑战的一项任务就是设计API。它需要经验、思考和反复的修改,但设计一份优秀的API所付出的所有时间都能从调试和代码复用所节省的时间中获得回报。
  • 一个小程序就不用了,但也应该按照能够复用的方式编写每个程序。
  • 理想情况下,一份API应该能够清楚地说明所有可能的输入和副作用
  • 因此,我们的API将是与抽象数据类型相关联的值以及一系列构造函数和实例方法的目的和副作用的自然语言描述。

(这里的设计API,需要有大量的编程经验)

架构01_架构到底指什么

Posted on 2018-11-24 | In 从零开始学架构

架构到底指什么?能弄清这些概念吗?

  1. 架构和框架是什么关系?有什么区别?
  2. Linux有架构,MySQL有架构,JVM也有架构,使用JAVA开发、MySQL存储,跑在Linux上的业务也有架构,应该关注哪个架构呢?
  3. 微信有架构,微信的登录系统也有架构,微信的支付系统也有架构,当我们谈微信架构时,到底是在谈什么架构呢?

要想准确的回答这几个问题,关键在于梳理几个有关系而又相似的概念,包括系统与子系统,模块与组件,框架与架构。


系统与子系统

维基百科定义:

系统泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元件不能单独完成的工作的群体。它的意思是“总体”“整体”或“联盟”

关键内容整理

  1. 关联:系统是由一群有关联的个体组成的,没有关联的个体堆在一起不能称为一个系统
  2. 规则:系统内的个体需要按照指定的规则运作,而不是单个个体各自为政。规则规定了系统内个体分工和协作的方式。
  3. 能力:系统能力与个体能力有本质的差别,系统能力不是个体能力之和,而是产生了新的能力。

子系统定义:子系统也是由一群有关联的个体所组成的系统,多半会是更大系统中的一部分。

总结:其实子系统的定义和系统定义是一样的,只是观察的角度有差异,一个系统可能是另外一个更大系统的子系统。

根据以上的基本概念,以微信为例来做一个分析。

  1. 微信本身是一个系统,包含聊天,登录,支付,朋友圈等子系统。
  2. 朋友圈这个系统又包含动态、评论、点赞等子系统。
  3. 评论这个系统可能又包含防刷子系统,审核子系统,发布子系统,存储子系统。
  4. 评论审核系统不再包含业务意义上的子系统,而是包括各个模块或者组件,这些模块或者组件本身也是另外一个维度上的系统。列如,MySQL,Redis是存储系统,但不是业务子系统。

模块与组件

模块和组件两个概念在实际工作中很容易混淆,我们经常能够听到类似这样的说法:

- MySQL 模块主要负责存储数据,而ElasticSearch模块主要负责数据搜索。
- 我们有安全加密组件,有审核组件
- App的下载模块使用了第三方的组件。

造成这种现象的主要原因是,模块与组件的定义不好理解,也不能很好地进行区分。来看看两者在维基百科上的定义。

软件模块(Module)是一套一致而互相有紧密关连的软件组织。它分别包含了程序和数据结构两部分。现代软件开发往往利用模块作为合成的单位。模块的接口表达了由该模块体统的功能和调用它时所需的元素。模块是可能分开被编写的单位。这使它们可再用和允许人员同时协作,编写及研究不同的模块。

软件组件定义为自包含的,可编程的,可重用的,与语言无关的软件单位,软件组件可以很容易被用于组装应用程序中。

可能看完这两个定义后一头雾水,还是不知道这两者有什么区别。造成这种现象的根本原因是,模块和组件都是系统的组成部分,只是从不同的角度拆分系统而已。

  • 从逻辑的角度拆分系统后:得到的单元就是“模块”;从物理的角度来拆分系统后,得到的单元就是“组件”.划分模块的主要目的是职责分离;划分模块的主要目的是单元复用。其实,“组件”的英文component也可翻译成零件一词,“零件”是一个物理的概念,并且具备“独立且可替换”的特点。

  • 例子:一个最简单的网站系统来为例。假设我们要做一个学生信息管理系统。这个系统从逻辑角度来拆分,可以分为“登录注册模块”“个人信息模块”“个人成绩模块”;从物理的角度来拆分,可以拆分为Nginx,Web服务器,MySQL

框架与架构

框架是和架构比较相似的概念,且两者有较强的关联关系,所以在实际工作中,这两个概念有时我们容易分不清楚。参考维基百科上框架与架构的定义,我来解释两者的区别。

软件框架(Software framework)通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要求之基础功能的软件产品

其中关键部分:

  1. 框架是组件规范:列如,MVC就是一种最常见的开发规范,类似的还有MVP,MVVM,J2EE等框架。
  2. 框架提供基础功能的产品:例如,Spring MVC是MVC的开发框架,除了满足MVC的规范,Spring提供了很多基础功能来帮助我们实现功能,包括注解(@Controller等),还有许多基础功能。

软件架构指软件系统的“基础结构”,创造这些基础结构的准则,以及对这些结构的描述

单纯从定义的角度来看,框架和架构的区别还是比较明显的,框架关注的是“规范”,架构关注的是“结构”。框架的英文是Framework,架构的英文是Architecture。Spring MVC的英文文档标题是“Web MVC framework”。

虽然是这样,但工作中经常能遇到似是而非的说法。例如“我们的系统是MVC架构”“我们需要将android app重构为MVP架构”,“我们的系统基于SSH框架开发”,“我们是SSH的架构”,“XX系统是基于springMVC框架开发,标准的MVC架构”。。。

究竟什么说法是对的,什么说法是错的呢?

其实这些说法都是对的,造成这种现象的根本原因隐藏于架构的定义中,关键就是“基础架构”这个概念没有明确说是从什么角度来分解的。采用不同的角度或者唯独,可以将系统划分为不同的结构,其实我在“模块与组件”中的“学生管理系统”实例已经包含了这一点。
  1. 从业务逻辑的角度分解,“学生管理系统”的架构是:
    • 登录注册模块
    • 个人信息模块
    • 个人成绩模块
  2. 从物理部署的角度分解,“学生管理系统”的架构是:
    • nignx
    • web服务器
    • mysql
  3. 从开发规范的角度分解,“学生管理系统”可以采用标准的MVC框架来开发,因此架构又变成MVC架构:
    • Controller
    • View
    • Model

这个地方重新定义了架构.

参考:软件架构指软件系统的顶层结构。

  1. “系统是一群关联的个体组成”,这些“个体”可以是“子系统”“模块”“组件”等;架构需要明确系统包含哪些“个体”
  2. 系统中的个体需要“根据某种规则”运作,架构需要明确个运作和协作的规则。
  3. 维基百科定义的架构用到了“基础结构”这个说法,这里改为“顶层结构”,可以更好地区分系统和子系统,避免将系统架构和子系统架构混淆在一起导致架构层次混乱。

一些感觉很不错的评论

  1. 架构是顶层设计,框架是面向编程或配置的半成品;组件是从技术维度上的复用;模块是从业务维度上职责的划分;系统是相互协同可运行的实体。
1234
luowen

luowen

Blogging is a little fun

37 posts
16 categories
16 tags
© 2019 luowen
Powered by Hexo
Theme - NexT.Mist
访问人数 人 总访问量 次