本周系统设计复习:
- 大 O 表示法 101:编写高效算法的秘密
- 4 大认证机制形式
- DDD 中的 8 个关键概念
- 9 大 NoSQL 数据库用例
大 O 表示法
从简单数组操作到复杂排序算法,理解大 O 表示法对构建高性能软件解决方案至关重要。
常见时间复杂度
O(1) - 常数时间
- 运行时无论输入大小如何都保持稳定
- 示例:按索引访问数组元素,在哈希表中插入/删除元素
O(n) - 线性时间
- 运行时与输入大小成正比增长
- 示例:在未排序数组中查找最大或最小元素
O(log n) - 对数时间
- 运行时随输入增长缓慢增加
- 示例:在排序数组上二分查找,在平衡二叉搜索树上操作
O(n²) - 二次时间
- 运行时随输入大小指数增长
- 示例:简单排序算法如冒泡排序、插入排序和选择排序
O(n³) - 三次时间
- 运行时随输入大小增加迅速升级
- 示例:使用朴素算法相乘两个稠密矩阵
O(n log n) - 线性对数时间
- 线性和对数增长的混合
- 示例:高效排序算法如归并排序、快速排序和堆排序
O(2ⁿ) - 指数时间
- 运行时每个新输入元素翻倍
- 示例:通过划分为多个子问题解决问题的递归算法
O(n!) - 阶乘时间
- 运行时随输入大小 skyrocket
- 示例:排列生成问题
O(√n) - 平方根时间
- 运行时相对于输入的平方根增加
- 示例:在范围内搜索,如埃拉托斯特尼筛法查找所有质数到 n
4 大认证机制形式
- SSH 密钥:加密密钥用于安全访问远程系统和服务器
- OAuth 令牌:提供对第三方应用上用户数据的有限访问
- SSL 证书:数字证书确保服务器和客户端之间的安全和加密通信
- 凭证:用户认证信息用于验证和授予对各种系统和服务的访问
DDD 中的 8 个关键概念
领域驱动设计 领域驱动设计倡导通过领域建模驱动软件设计。统一语言是领域驱动设计的关键概念之一。领域模型是跨业务领域的桥梁。
业务实体 模型的使用可以帮助表达业务概念和知识,并指导软件的进一步开发,如数据库、API 等。
模型边界 领域模型集之间的松散边界用于建模业务关联。
聚合 聚合是相关对象(实体和值对象)的集群,为数据更改目的被视为单个单元。
实体 vs. 值对象 除了聚合根和实体,还有一些模型看起来像一次性的,它们没有自己的 ID 来标识它们,但更多作为某个实体的一部分,表达几个字段的集合。
操作建模 在领域驱动设计中,为操作这些模型,有许多对象充当”操作符”。
架构分层 为更好地组织项目中的各种对象,我们需要通过分层简化复杂项目的复杂性,如计算机网络。
构建领域模型 许多方法被发明来从业务知识中提取领域模型。
9 大 NoSQL 数据库用例
不同数据库在不同领域表现出色,为需求选择正确的数据库很重要。
MongoDB(文档存储)
- 用于内容管理系统和目录管理
- 特性:BSON 格式、无模式设计、支持分片水平扩展、复制高可用
Cassandra(宽列存储)
- 理想用于时间序列数据管理和推荐引擎
- 提供宽列格式、分布式架构、CQL 用于 SQL 类似查询
Redis(键值存储)
- 适合缓存、会话管理和游戏排行榜
- 提供内存存储、支持复杂数据结构、RDB 和 AOF 持久化选项
Couchbase(带键值的文档存储)
- 用于内容管理系统和电商平台
- 结合键值和基于文档的操作,内存优先架构,跨数据中心复制
Neo4j(图数据库)
- 非常适合社交网络和欺诈检测
- 特性:ACID 合规、无索引邻接、Cypher 查询语言、HA 集群能力
Amazon DynamoDB(键值和文档)
- 完美用于无服务器和 IoT 应用
- 支持键值和复杂文档数据,由 AWS 管理,特性如跨节点分区数据和 DynamoDB 流
Apache Hbase(宽列存储)
- 用于数据仓库和大规模数据处理
- modeled after Google’s Bigtable,提供 Hadoop 集成、自动分片、强一致性、区域服务器
Elasticsearch(搜索引擎)
- 理想用于全文搜索和日志及事件数据分析
- 基于 Apache Lucene,面向文档,具有分片和复制能力,RESTful 接口
CouchDB(文档存储)
- 适合移动应用和 CMS
- 面向文档,确保无锁定数据一致性,支持最终一致性,使用 RESTful API
本文为学习目的的个人翻译,译文仅供参考。
原文链接:EP132: Big O Notation 101: The Secret to Writing Efficient Algorithms。
版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。