大 O 符号和凯撒密码
Big O notation and Caesar Cipher
自从 1997 年左右以来,我就没有看过大 O 表示法,所以我希望能进行一些意义检查。
想象一个简单的算法,可以暴力破解凯撒密码加密文本。它使用嵌套在 for 1 到 26 循环中的简单凯撒密码算法,使用循环计数器作为密钥,并输出所有可能的结果,其中之一将是解密的纯文本。
这个的复杂度是 O(N)(而不是 O(N²) 吗?)
我相当确定它是 O(N)。我知道嵌套循环可以增加 N² 的复杂度,但它需要重复的次数固定为 26。如果有的话,复杂度的顺序可以描述为 O(N + 26)?
我认为你是对的:因为你有固定数量的键,这个外循环不会考虑更多的复杂性:O(26*N) = O(N)
,因为在 Big O 中忽略常量。
只要您在 O(N)
中明确说明 N
的含义,答案就显而易见了。 N
在您的情况下唯一合理的含义是输入字符串的长度。
Big-O 符号是关于 运行 时间(有时也适用于内存消耗)随着输入大小(无论您如何定义“大小”)的渐近增加。
因此,如果您将一个字符的翻译定义为消耗 1 个“时间单位”,那么您的算法将进行 26*N
次翻译,加上一些(或多或少)常量开销 C
,所以它是 26*N + C
时间单位。在 Big-O 表示法中,我们忽略任何常数因子和加法,得到 O(N)
.
的最终结果
奖励答案:
如果我们也对 different-sized 字母表(例如中文)的算法行为感兴趣,字母表的大小为 M
,您将获得 M*N + C
时间单位,表示为作为 O(M*N)
.
自从 1997 年左右以来,我就没有看过大 O 表示法,所以我希望能进行一些意义检查。
想象一个简单的算法,可以暴力破解凯撒密码加密文本。它使用嵌套在 for 1 到 26 循环中的简单凯撒密码算法,使用循环计数器作为密钥,并输出所有可能的结果,其中之一将是解密的纯文本。
这个的复杂度是 O(N)(而不是 O(N²) 吗?)
我相当确定它是 O(N)。我知道嵌套循环可以增加 N² 的复杂度,但它需要重复的次数固定为 26。如果有的话,复杂度的顺序可以描述为 O(N + 26)?
我认为你是对的:因为你有固定数量的键,这个外循环不会考虑更多的复杂性:O(26*N) = O(N)
,因为在 Big O 中忽略常量。
只要您在 O(N)
中明确说明 N
的含义,答案就显而易见了。 N
在您的情况下唯一合理的含义是输入字符串的长度。
Big-O 符号是关于 运行 时间(有时也适用于内存消耗)随着输入大小(无论您如何定义“大小”)的渐近增加。
因此,如果您将一个字符的翻译定义为消耗 1 个“时间单位”,那么您的算法将进行 26*N
次翻译,加上一些(或多或少)常量开销 C
,所以它是 26*N + C
时间单位。在 Big-O 表示法中,我们忽略任何常数因子和加法,得到 O(N)
.
奖励答案:
如果我们也对 different-sized 字母表(例如中文)的算法行为感兴趣,字母表的大小为 M
,您将获得 M*N + C
时间单位,表示为作为 O(M*N)
.