本周系统设计复习:

  • 大 O 表示法 101:编写高效算法的秘密
  • 4 大认证机制形式
  • DDD 中的 8 个关键概念
  • 9 大 NoSQL 数据库用例

大 O 表示法

从简单数组操作到复杂排序算法,理解大 O 表示法对构建高性能软件解决方案至关重要。

常见时间复杂度

  1. O(1) - 常数时间

    • 运行时无论输入大小如何都保持稳定
    • 示例:按索引访问数组元素,在哈希表中插入/删除元素
  2. O(n) - 线性时间

    • 运行时与输入大小成正比增长
    • 示例:在未排序数组中查找最大或最小元素
  3. O(log n) - 对数时间

    • 运行时随输入增长缓慢增加
    • 示例:在排序数组上二分查找,在平衡二叉搜索树上操作
  4. O(n²) - 二次时间

    • 运行时随输入大小指数增长
    • 示例:简单排序算法如冒泡排序、插入排序和选择排序
  5. O(n³) - 三次时间

    • 运行时随输入大小增加迅速升级
    • 示例:使用朴素算法相乘两个稠密矩阵
  6. O(n log n) - 线性对数时间

    • 线性和对数增长的混合
    • 示例:高效排序算法如归并排序、快速排序和堆排序
  7. O(2ⁿ) - 指数时间

    • 运行时每个新输入元素翻倍
    • 示例:通过划分为多个子问题解决问题的递归算法
  8. O(n!) - 阶乘时间

    • 运行时随输入大小 skyrocket
    • 示例:排列生成问题
  9. O(√n) - 平方根时间

    • 运行时相对于输入的平方根增加
    • 示例:在范围内搜索,如埃拉托斯特尼筛法查找所有质数到 n

4 大认证机制形式

  1. SSH 密钥:加密密钥用于安全访问远程系统和服务器
  2. OAuth 令牌:提供对第三方应用上用户数据的有限访问
  3. SSL 证书:数字证书确保服务器和客户端之间的安全和加密通信
  4. 凭证:用户认证信息用于验证和授予对各种系统和服务的访问

DDD 中的 8 个关键概念

  1. 领域驱动设计 领域驱动设计倡导通过领域建模驱动软件设计。统一语言是领域驱动设计的关键概念之一。领域模型是跨业务领域的桥梁。

  2. 业务实体 模型的使用可以帮助表达业务概念和知识,并指导软件的进一步开发,如数据库、API 等。

  3. 模型边界 领域模型集之间的松散边界用于建模业务关联。

  4. 聚合 聚合是相关对象(实体和值对象)的集群,为数据更改目的被视为单个单元。

  5. 实体 vs. 值对象 除了聚合根和实体,还有一些模型看起来像一次性的,它们没有自己的 ID 来标识它们,但更多作为某个实体的一部分,表达几个字段的集合。

  6. 操作建模 在领域驱动设计中,为操作这些模型,有许多对象充当”操作符”。

  7. 架构分层 为更好地组织项目中的各种对象,我们需要通过分层简化复杂项目的复杂性,如计算机网络。

  8. 构建领域模型 许多方法被发明来从业务知识中提取领域模型。

9 大 NoSQL 数据库用例

不同数据库在不同领域表现出色,为需求选择正确的数据库很重要。

  1. MongoDB(文档存储)

    • 用于内容管理系统和目录管理
    • 特性:BSON 格式、无模式设计、支持分片水平扩展、复制高可用
  2. Cassandra(宽列存储)

    • 理想用于时间序列数据管理和推荐引擎
    • 提供宽列格式、分布式架构、CQL 用于 SQL 类似查询
  3. Redis(键值存储)

    • 适合缓存、会话管理和游戏排行榜
    • 提供内存存储、支持复杂数据结构、RDB 和 AOF 持久化选项
  4. Couchbase(带键值的文档存储)

    • 用于内容管理系统和电商平台
    • 结合键值和基于文档的操作,内存优先架构,跨数据中心复制
  5. Neo4j(图数据库)

    • 非常适合社交网络和欺诈检测
    • 特性:ACID 合规、无索引邻接、Cypher 查询语言、HA 集群能力
  6. Amazon DynamoDB(键值和文档)

    • 完美用于无服务器和 IoT 应用
    • 支持键值和复杂文档数据,由 AWS 管理,特性如跨节点分区数据和 DynamoDB 流
  7. Apache Hbase(宽列存储)

    • 用于数据仓库和大规模数据处理
    • modeled after Google’s Bigtable,提供 Hadoop 集成、自动分片、强一致性、区域服务器
  8. Elasticsearch(搜索引擎)

    • 理想用于全文搜索和日志及事件数据分析
    • 基于 Apache Lucene,面向文档,具有分片和复制能力,RESTful 接口
  9. CouchDB(文档存储)

    • 适合移动应用和 CMS
    • 面向文档,确保无锁定数据一致性,支持最终一致性,使用 RESTful API

本文为学习目的的个人翻译,译文仅供参考。

原文链接:EP132: Big O Notation 101: The Secret to Writing Efficient Algorithms

版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。