C++ 马尔可夫链2025年2月11日 | 阅读 9 分钟 C++ 中的马尔可夫链入门马尔可夫链是数学系统,它们从一个状态过渡到状态空间中的另一个状态。它们是一种特殊的随机过程,其中下一个状态仅取决于当前状态,而与之前的一系列事件无关。这个属性被称为马尔可夫性质。 在 C++ 的上下文中,马尔可夫链可以用于建模各种现实场景,例如预测天气模式、金融市场和 Web 应用程序中的用户行为。了解如何在 C++ 中实现和使用马尔可夫链对于开发预测模型和模拟非常有益。 方法 1:基本方法输出 Day 1: Sunny Day 2: Cloudy Day 3: Cloudy Day 4: Cloudy Day 5: Sunny Day 6: Sunny Day 7: Sunny Day 8: Sunny Day 9: Sunny Day 10: Rainy 说明
复杂度分析时间复杂度 马尔可夫链模拟的时间复杂度主要取决于迭代次数以及每次迭代中执行的操作。 初始化
模拟循环
空间复杂度 空间复杂度涉及用于存储状态、转移矩阵和任何额外变量的内存。 状态
转移矩阵
变量
方法 2:使用类和面向对象编程将马尔可夫链逻辑封装在类中,以提高模块化和可重用性。这种方法使代码更清晰,更易于管理。 实施 输出 Day 1: State 0 Day 2: State 0 Day 3: State 0 Day 4: State 0 Day 5: State 2 Day 6: State 2 Day 7: State 0 Day 8: State 0 Day 9: State 0 Day 10: State 2 说明
复杂度分析时间复杂度 模拟的时间复杂度主要取决于状态的数量 (m) 和您模拟的迭代次数 (n)。 初始化 创建 State 对象和初始化 MarkovChain 对象涉及迭代状态和初始化数据结构。这通常是 O(m),其中 m 是状态的数量。 模拟循环 模拟运行 n 次迭代,每次迭代代表一天或一个时间步。 在每次迭代中,更新当前状态涉及迭代当前状态的转移概率。在最坏的情况下,此操作是 O(m),其中 m 是状态的数量。 因此,模拟 n 天的总体时间复杂度为:O(n⋅m)。 空间复杂度 空间复杂度涉及用于存储状态、转移概率和任何额外变量的内存。 状态 存储 m 个 State 对象所需的空间取决于每个状态的属性(例如,标识符、转移概率)。这是 O(m) 空间。 转移概率 每个 State 对象都包含一个指向其他状态的转移概率的向量或数组。如果状态空间密集(每个状态有很多转移),这可能会占用大量空间。 当前状态和变量 需要额外的空间用于诸如当前状态索引和模拟循环中使用的任何临时变量之类的变量。这通常是 O(1) 空间。 因此,总空间复杂度主要由状态对象及其转移数据决定,即:O(m)。 方法 3:使用动态状态空间和哈希映射对于状态空间动态或非常大的应用程序,使用哈希映射可能更有效。 实施输出 Day 1: Sunny Day 2: Sunny Day 3: Sunny Day 4: Sunny Day 5: Sunny Day 6: Cloudy Day 7: Cloudy Day 8: Cloudy Day 9: Cloudy Day 10: Cloudy 说明
复杂度分析时间复杂度 模拟的时间复杂度主要取决于状态的数量 (m) 和模拟中的迭代次数 (n)。 初始化 添加状态和初始化转移概率涉及将元素插入哈希映射。此操作的平均时间复杂度通常为 O(1) 进行插入。 如果状态和转移在运行时动态初始化,则复杂度可能会根据插入操作而有所不同。 模拟循环 模拟运行 n 次迭代,每次迭代代表一个时间步(例如,天)。 在每次迭代中 从哈希映射中检索当前状态的平均时间复杂度为 O(1)。 生成随机数和确定下一个状态涉及迭代当前状态的转移概率。 根据所选的下一个状态更新当前状态也需要平均恒定的时间,O(1)。 因此,模拟 m 个状态的 n 天的总体时间复杂度为:O(n⋅(1+k))。 其中 k 是每个状态的平均转移次数。 空间复杂度 空间复杂度涉及用于存储状态、转移概率和任何额外变量的内存。 状态 每个状态都存储为外部哈希映射中的一个键,这需要与状态数量成正比的空间,O(m)。 转移概率 每个状态的转移概率存储在内部哈希映射中。 如果状态空间密集(每个状态有很多转移),则哈希映射使用的空间可能会显著增长。 在最坏的情况下,即每个状态都有到所有其他状态的转移,转移概率的空间复杂度可能接近 O(m²)。 附加变量 诸如当前状态索引和模拟循环中使用的临时变量之类的变量需要恒定的空间,O(1)。 因此,总空间复杂度主要由状态及其转移数据决定,即:O(m+m2)。 下一个主题C++ 中的小行星碰撞 |
在本文中,我们将讨论 std::transform_inclusive_scan() 函数,包括其语法、参数、示例和优点。什么是 std::transform_inclusive_scan() 函数?除了首先应用于每个输入项的一元函数之外,transform_inclusive_scan() 函数是一个 C++ 内置函数,其功能与...类似。
阅读 4 分钟
在本文中,我们将讨论C++中的单词方阵方法,包括其语法、参数和示例。什么是单词方阵?单词方阵是指一种语言,它由适合方格的单词组成。这些单词的读法相同……
14 分钟阅读
C++ 和 Eiffel 之间的区别 C++ 和 Eiffel 都是面向对象的语言,但在它们的思考、编写和实现方式上存在许多区别。C++ 是当今最知名、用途最广泛的语言之一,以其高度的灵活性、高性能和……
阅读 4 分钟
引言 数字自古以来就引起数学家和程序员的兴趣。几种有趣的数列之一是十一边形数,它们因其几何意义而闻名。这些数字代表一个 11 边形或一个 11 边的图形(十一边形),并且可以被描述为三角形的推广……
阅读 4 分钟
在本文中,我们将讨论其算法、伪代码和示例。什么是?如果一个整数 N 的前缀满足某些整除要求,那么这个数就被称为多重整除数。一个有 k 位数字的整数 N 的第一位数字必须是...
阅读 4 分钟
在本文中,我们将讨论及其实现。什么是 Ford Fulkerson 算法?Ford-Fulkerson 算法通常用于解决流中的最大流问题。最大流问题涉及找到可以传输的最大流量...
阅读 6 分钟
在本文中,我们讨论了启示数序列。启示数序列是数学的一个有趣领域,个人在使用 2 的幂时会以不同的方式看待它。为了达到这一点,我们分析了以 10 为底的 2 的幂,并了解了...
5 分钟阅读
C++ 有两种行为设计模式:状态模式和策略模式。但是,它们的功能是不同的。由于策略模式,对象可以在运行时从多种算法中进行选择以更改其行为。忽略对象的内部状态,它的...
11 分钟阅读
威尔逊定理指出,根据数学思想的阶乘和模算术的性质,一个数可以被认为是素数。它由数学家约翰·威尔逊(John Wilson)提出,并由约瑟夫·路易斯·拉格朗日(Joseph-Louis Lagrange)证明。它指出:对于正整数 p>1p>1:(p-1)!≡-1(modp)(p-1)!≡-1(modp)。该引理间接说明...
5 分钟阅读
中心七边形数是一种中心多边形数,它具有七边形形状和一个中心点。规则七边形数通过添加层来形成七边形,但中心七边形数对称地从单个点向外生长...
阅读 8 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India