【算法与设计模式】

一、数据结构与算法

1、算法性能评估

时间复杂度、空间复杂度

2、数据结构

数组与列表
队列
堆栈
链表
二叉树
多叉树
递归算法

二、设计模式

1、单例

(1)GIL:线程互斥锁。保证同一时刻只有一个线程在进行。
(2)多进程与多线程
1)计算密集型
假如一个计算密集型的任务需要10s的执行时间,总共有4个这样的任务,求运行总时长。
在 4核及以上的情况下:
多进程:4个CPU开启4个进程,进程并行,执行时间10s多。
多线程:1个CPU(进程)同时开启4个线程,开启线程消耗的资源很少,但实际运行CPU只有1个,所有执行时间40s多。
计算密集型考虑多进程,多个CPU同时跑,比如计算圆周率。
2)IO密集型
IO密集型,IO操作需要花费很长的时间(或者网络请求time.sleep(),多个CPU并不能提效,反而进程切换也需要花费时间)远大于CPU。此时,多个CPU跑反而时间更长。

2、工厂模式

3、其他设计模式

(1)代理模式定义
为其他对象提供一种代理以控制整个对象的访问
(2)代理模式uml图
【算法与设计模式】_第1张图片
Subject类:函数的定义
Proxy代理类:函数的调用
RealSubject类:函数的具体实现
例:
【算法与设计模式】_第2张图片
代理伪代码:

class Proxy(GiveGift):
    Proxy(SchoolGirl mm):
        gg = new Pursuit(mm)}

    GiveLipstick():
        gg.GiveLipstick()

客户端调用伪代码:

SchoolGirl jiaojiao = new SchoolGirl()
jiaojiao.name = "李娇娇"
Proxy xiaohong = new Proxy(jiaojiao)

xiaohong.GiveLipstick()
xiaohong.GiveBracelet()
xiaohong.GivenNecklace()

(2)代理模式的应用
1)远程代理:最经典的是web service。想在本地访问另一台主机的代码,实现方式:在本地开启代理,通过web service发送远程请求,再拿到这个请求供本地调用。在本地调用代理代码,就根本不会知道调用的是远程web应用。可以隐藏这些细节。
2)虚拟代理:存放实例化需要很久的对象,比如网页先看到文字,后看到图片,很多浏览器都是用的这种方式
3)安全代理:控制真实对象的访问权限
4)智能指引:调用真实对象时,处理另外一些事,比如计算知识对象的引用次数。

4、设计模式基本原则

你可能感兴趣的:(设计模式)