如果你有一个固定大小的数组,你需要遍历它!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?
我们想找到长度为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
为输入字符串长度 - 设
m
为arr
的大小 - 我们的算法是
O( n * n! * log(m) )
(n
用于字符串相等,n!
用于排列,log(m)
用于二进制搜索(
它还取决于成本的模型。通常,这映射回一些抽象机器,例如,我们假设操作有一定的成本。例如,您可以通过仅比较计数,或通过交换计数,或根据比较和交换计数来比较排序算法。
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- 为什么二进制搜索在我的测试中不起作用
- 正在尝试重载二进制搜索树分配运算符
- 我的二进制搜索程序只是关闭了
- 二进制搜索的终止点
- 递归二进制搜索与字符串数组
- 测试树是否为二进制搜索树
- 如何二进制搜索结构向量并在适当的索引处插入
- 如果你有一个固定大小的数组,你需要遍历它!n次,使用二进制搜索如何改变时间复杂性
- 字符串的递归二进制搜索-C++
- 使用二进制搜索树中的迭代器对象访问左侧节点
- 二进制搜索树没有匹配的函数调用
- 二进制搜索不适用于特定输出
- 如何在向量上进行二进制搜索以找到具有特定id的元素
- 如何将Z3_ast导出为二进制以及如何搜索函数名称?
- 二进制搜索树不变的标头文件
- 在C++中搜索二进制文件分隔符时出现不正确的偏移量
- 可视化 在 c++ 中读取和搜索二进制文件