如果你有一个固定大小的数组,你需要遍历它!n次,使用二进制搜索如何改变时间复杂性

If you have an array of fixed size, and you need to go through it !n number of times, how does using binary search change the time complexity?

本文关键字:搜索 二进制 何改变 时间复杂性 改变 有一个 数组 如果 遍历      更新时间:2023-10-16

我们想找到长度为n的字符串的所有排列。然后,你要搜索一个固定常量大小的数组,比如3000,并检查字符串是否在数组中。

String arr[3000];

因为我们会有的!n个排列,我们需要做!n次搜索。此外,当您针对数组中的一个元素检查2个不同的字符串时,与只检查1个字符串有什么区别?时间复杂性是什么?我的想法是,最坏的情况下,log2(3000)会穿过阵列一次。其时间复杂度为O(log2(3000)),即O(1)。现在,你需要通过这个数组!因此时间复杂度为CCD_ 4。因此,在分析该算法的时间复杂度时,减少所需搜索次数的二进制搜索不应成为重点。

我的问题是,二进制搜索确实减少了搜索次数,如果你要浏览n!次,这不是一个显著的区别吗?任何有助于我更好理解的见解都将不胜感激。

Big O复杂性分析只处理可能发生变化的量,根据定义。当所有的量都是常数时,你会得到空洞的答案,这是意料之中的事。

当比较两个Big-O相等的算法时,常数因子是相关的,因此您从3000->log2(3000(的变化是大约200的因子。

因此,您使用二进制搜索是因为您所做的不仅仅是Big-O分析。您还估计了常数因子,并看到一个简单的200倍加速

但同样,你的复杂性也可以有多个术语。你可能会说:

  • n为输入字符串长度
  • marr的大小
  • 我们的算法是O( n * n! * log(m) )(n用于字符串相等,n!用于排列,log(m)用于二进制搜索(

它还取决于成本的模型。通常,这映射回一些抽象机器,例如,我们假设操作有一定的成本。例如,您可以通过比较计数,或通过交换计数,或根据比较和交换计数来比较排序算法