c# - 我可以检查子序列是否比 O(n*n) 更快

标签 c# .net performance algorithm complexity-theory

所以我的问题是主题名称。是否存在一种算法可以比 O(N^2) 更快地检查 B 是否是 A 的子序列,例如 O(NlogN) 或简单的 O(N)?

找到的唯一方法是简单的蛮力

for(int i = 0; i < a.Length - b.Length; i++)
{
   if (IsSubsequence(a,b,i))
      return i;
}
return -1;

最佳答案

这是 David Eisenstat 算法的递归特征。 (请注意,此算法是尾递归,因此可以写成循环;我将其描述为递归,因为这样做是理解算法的好方法。)

将一个序列定义为空,或者一个项目后跟一个序列。

取两个序列,A 和 B。问题是 B 是否是 A 的子序列。

如果 B 为空则 B 是 A 的子序列。

如果 B 不为空且 A 为空则 B 不是 A 的子序列。

如果我们已经做到这一点,A 和 B 都不为空。假设 A 是项目 X 后跟序列 C,B 是项目 Y 后跟序列 D。

如果 X 与 Y 相同,那么问题的答案是“B 是 A 的子序列吗?”与较小问题“D 是 C 的子序列吗?”的答案相同。回答那个问题。

如果 X 与 Y 不同,则“B 是 A 的子序列吗?”这个问题的答案与较小问题“B 是 C 的子序列吗?”的答案相同。回答那个问题。

这个过程终止,显然它的最坏情况是在序列 A 的长度上。

关于c# - 我可以检查子序列是否比 O(n*n) 更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22637634/

相关文章:

c# - 确定按下的键是 Windows 运行时中的字母数字

c# - 用Kinect Skeleton关节模拟多点触控(SDK1.5)

c# 泛型,类型略有不同?

c# - 在 Windows 服务中更改计时器间隔

.net - 与 2.0 相比,针对 .NET Framework 3.5 进行编译有什么优势吗?

performance - 在 Linux 上本地对 Apache 进行基准测试的好方法是什么?

.net - 将 IEnumerable<char> 转换为字符串的最佳方法?

performance - 调用库和直接操作效率有区别吗?

c# - .NET WinForms DataGridView C# SortCompare 显然忽略了结果

C# Dictionary<T,K> 单写多读线程安全