【算法与设计模式】

一、数据结构与算法

1、算法性能评估

时间复杂度、空间复杂度

2、数据结构

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

2.1、队列

(1)双向队列
操作:队列两端均可进行入队、出队操作,(即队首入队、队首出队、队尾入队、队尾出队)
实现:collections模块中的deque类
双向队列python代码示例
(2)普通队列
操作:FIFO(先进先出),(即只能队尾入队、队首出队)
实现:queue模块中的Queue类
(3)环形队列
在这里插入图片描述
环形队列

二、设计模式

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跑反而时间更长。

单例模式代码举例:
python

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from commons.utils.LogUtils import LogUtil


class WebDriverSingleton:
    _driver = None  # _driver是类变量,而不是实例变量,确保_driver在类级别共享。

    @staticmethod
    def get_driver():
        if WebDriverSingleton._driver is None:
            WebDriverSingleton._driver = webdriver.Chrome()
            WebDriverSingleton._driver.maximize_window()
        return WebDriverSingleton._driver

# 测试用例1
# 运行该测试类时,只会打开一个浏览器,多个测试用例都在该浏览器上操作。所有用例执行结束后,关闭浏览器窗口。
class TestCase:
    def setup_class(self):
        self.driver = WebDriverSingleton.get_driver()

    def teardown_class(self):
        self.driver.quit()

    def test_case1(self):
        self.driver.get("https://www.baidu.com")
        search_box = self.driver.find_element(By.ID, "kw")
        search_box.send_keys("Selenium")
        search_box.send_keys(Keys.RETURN)
        LogUtil.info("Test Case 1: Search for 'Selenium' on Baidu")

    # 测试用例2
    def test_case2(self):
        self.driver.get("https://www.baidu.com")
        search_box = self.driver.find_element(By.ID, "kw")
        search_box.clear()
        search_box.send_keys("Python")
        search_box.send_keys(Keys.RETURN)
        LogUtil.info("Test Case 2: Search for 'Python' on Baidu")

    # 测试用例3
    def test_case3(self):
        self.driver.get("https://www.baidu.com")
        search_box = self.driver.find_element(By.ID, "kw")
        search_box.clear()
        search_box.send_keys("Single Instance")
        search_box.send_keys(Keys.RETURN)
        LogUtil.info("Test Case 3: Search for 'Single Instance' on Baidu")

2、工厂模式

3、其他设计模式

(1)代理模式定义
为其他对象提供一种代理以控制整个对象的访问
(2)代理模式uml图
在这里插入图片描述
Subject类:函数的定义
Proxy代理类:函数的调用
RealSubject类:函数的具体实现
例:
在这里插入图片描述
代理伪代码:

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、访问者设计模式

(1)通俗解释

访问者模式是一种常见的设计模式,被归类为“行为型模式”,用于处理复杂对象结构的访问和操作。它允许你将数据结构与作用于数据结构上的操作分离开来,这样就可以添加新的操作而不必修改现有的数据结构。这种模式适用于一些数据结构相对稳定,但其操作可能经常发生改变或扩展的情况。

以一个动物园为例来说明访问者模式吧。假设有不同种类的动物,比如狮子、大象、长颈鹿等。这些动物可以被看作是数据结构,而接受游客的导游可以被看作是访问者。游客的行为包括观察、喂食、拍照等。

在这个例子中,动物对象是不变的,而游客的行为可能经常改变或扩展。使用访问者模式,你可以轻松地添加新的观察、喂食、拍照等行为,而不必修改动物对象的结构。这样就实现了数据结构和操作的解耦。

首先定义一个动物基类 Animal 和一些具体的动物类 Lion、Elephant、Giraffe。然后定义一个访问者 Visitor 基类和一些具体的访问者类,比如 Photographer、Feeder。
代码中,动物类都实现了 accept 方法,该方法接受访问者对象。具体的动物类会根据访问者的不同调用对应的 visit 方法。访问者类定义了不同的 visit 方法,完成对动物对象的具体操作。
使用这种方式,我们可以轻松地添加新的动物和新的访问者,而不必修改现有的代码结构。

(2)代码举例

# 动物基类
class Animal:
    def accept(self, visitor):
        pass

# 具体动物类
class Lion(Animal):
    def accept(self, visitor):
        visitor.visit_lion(self)

class Elephant(Animal):
    def accept(self, visitor):
        visitor.visit_elephant(self)

class Giraffe(Animal):
    def accept(self, visitor):
        visitor.visit_giraffe(self)

# 访问者基类
class Visitor:
    def visit_lion(self, lion):
        pass

    def visit_elephant(self, elephant):
        pass

    def visit_giraffe(self, giraffe):
        pass

# 具体访问者类
class Photographer(Visitor):
    def visit_lion(self, lion):
        print("拍摄狮子的照片")

    def visit_elephant(self, elephant):
        print("拍摄大象的照片")

    def visit_giraffe(self, giraffe):
        print("拍摄长颈鹿的照片")

class Feeder(Visitor):
    def visit_lion(self, lion):
        print("喂食狮子")

    def visit_elephant(self, elephant):
        print("喂食大象")

    def visit_giraffe(self, giraffe):
        print("喂食长颈鹿")

5、设计模式基本原则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值