performance - isPascal() 方法的时间复杂度是多少
问题描述
static int isPascal(int n) {
int sum = 0;
int nthVal = 1;
while (sum < n) {
sum = sum + nthVal;
nthVal++;
}
return sum == n ? 1 : 0;
}
这里函数检查给定数字是否为帕斯卡数。帕斯卡数是一个数字,它是一些 i 从 1 到 i 的整数之和。
例如6 是帕斯卡数,因为 6 = 1 + 2 + 3
这个函数的时间复杂度是多少?会是 O(logn) 时间吗?如果是这样,这里的日志基础是什么?
解决方案
如果您考虑计算平方根 O(1) 操作,您可以在 O(1) 中进行此检查,借助前 i 个自然数之和的公式
sum(i) = (i^2 + i)/2
现在在你的情况下你不知道i
但你知道sum(i)
,因为那是n
你想要检查它是否是帕斯卡数。所以你有了
n = (i^2 + i) /2
或者
i^2 + i - 2n = 0
用相应的公式求解这个二次方程给出
i = -1/2 + sqrt(2*n + 1/4)
你可以放弃这个方程的第二个解,因为i
它必须> 0
是一个有效的解。如果结果i
是整数,n
则为帕斯卡数。否则不是。
从该公式也可以看出,您的迭代解决方案在 O(sqrt(n))
推荐阅读
- c# - 带有 C# 语法的 NewtonSoft JsonPath
- sqlite - 为什么我已经正确安装了 thonny sqlite3 却收到错误消息
- javascript - 在选择相关下拉选项之前,如何在页面加载时默认隐藏文本字段?
- nested - Entity Framework Core Explicit Loading 如何忽略更深的嵌套实体
- c# - 循环遍历集合时如何选择随机记录?
- c# - 如何从 .NET Core Rest API 发出一个流以在 Angular 中作为 observable 使用?
- python - 在使用 5 折交叉验证时,在高度不平衡的数据中混淆 F1 分数和 AUC 分数
- kubernetes - K8 DNS 无法解析
- python - python矩阵的组合
- c# - 如何通过单击按钮更改另一个对象的动画?