【问题标题】:What is the time complexity of below algorithm [duplicate]以下算法的时间复杂度是多少[重复]
【发布时间】:2023-03-11 12:01:01
【问题描述】:

给定一个排序数组,判断它是否包含给定的数字 x: 而不是使用二分查找,即将数组分成两部分。
如果我将数组分成三个部分,并递归地在这三个部分中找到元素。那么这个算法的时间复杂度顺序(就数组的大小n而言)是多少

【问题讨论】:

  • 让我们删除与语言无关的 C++ 和 Java 标记..
  • 你为什么又发同样的问题?您应该粘贴代码以获得正确的答案。
  • @notsogeek 你读过m-way tree吗?你知道为什么log2(n)中的二进制搜索圆顶。
  • 你的意思是m-ary树吗?如果是,但我无法弄清楚最坏情况的复杂性。

标签: algorithm search data-structures big-o time-complexity


【解决方案1】:

复杂度与二分查找相同。

最初的二分搜索由两个阶段组成。首先在原始数组上执行恒定数量的步骤,然后对一半大小的数组进行递归调用。因此复杂度可以表示为

T(n) = C1 + T(n/2)

如果你分成三部分,你执行更多的比较和条件测试,但仍然对大小为 n 的数组进行恒定时间操作,那么你递归地调用大小为 n/3 的数组。这意味着

T(n) = C2 + T(N/3) 

这两个函数的计算结果都是Theta(log n)

你可以概括。如果我分成k 部分怎么办。复杂度是

f(n) = Ck + f(n/k)

导致

f(n) = Ck log(n)/log(k) + Dk

随着 k 的增加,您会得到一个更大的对数除数,但常数 Ck 和 Dk 也会增加,因为您在跳转到子数组之前执行了更多操作。想想n=k的情况

【讨论】:

  • 最坏的情况是什么
  • 那么 Ck 与 k 成正比吗?
  • 是的。想想与你的练习相比,二分搜索中有多少比较。编写伪代码,它会有所帮助
  • 那么二分查找会比将数组分成 k (k>2) 个部分的查找更快吗?
  • 编码和比较更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 2020-11-15
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
相关资源
最近更新 更多